Right now, today, here's what you can do with Imaginary:
Create and launch a new Imaginary server using Divmod's axiomatic command line tool:
axiomatic -d imaginary.axiom offering install imaginary
axiomatic -d imaginary.axiom start
Connect to that server using a telnet or ssh client
Create a new character in the fully persistent world or log in to an existing character.
Create new objects or locations (actually the number of objects is currently fairly limited: you can create a quiche, a vending machine, a quarter, a shirt, a pair of pants, and a sword).
Walk around, look at things, talk to people, attack people, pick things up, put things down, wear clothing, take clothing off, browse the help files, write custom descriptions for things, and a handful of other trivial activities.
Persistence in Imaginary is handled by Axiom, an object database with excellent support for transactions. All world manipulation is protected with transactions, preventing the world from entering an inconsistent state, even if a programmer error causes an exception partway through a complex mutation.
Every game object (for example, a chair, a player, or a sentient energy cloud) is represented as a Thing. Thing defines basic behaviors such as location and some aspects of appearance. For any additional behaviors, a powerup is used. Powerups can be added to or removed from a Thing at any time, and combined in novel or unexpected ways, creating game objects which have behavior not explicitly accounted for by the author of the powerups involved.
Whenever it is necessary to convey information, whether to a player or an NPC AI, a Concept is used. A concept abstractly represents some information (for example, the fact that a wild boar just charged into the clearing where you are standing) and is responsible for determining the most suitable representation of this information when expressing it to a Thing. A player connected to the system via telnet will have concepts expressed to him as a text string, while a player with a rich graphical client might see a 3d model of a boar run into view.
Of course, since Concepts are mainly used to convey information about change in the world, they are closely related to events. The event system keeps track of one or more concepts as a transaction executes and the world is modified. If the transaction completes successfully, those concepts are broadcast to any observers in range. If the transaction fails, the failure is turned into a concept and that is broadcast instead. This prevents players from seeing the consequences of events which are ultimately reverted.
Where do Events come from? Actions, obviously! In Imaginary, an Action is a representation of a high-level change to the world. Most of the things in the list at the top of this post are examples of Actions. Each Action is defined by a class with several methods, but one really important one: do. When someone or something instigates an Action (for example, a player types "go west"), the appropriate Action class is instantiated and its
do method invoked in a transaction. This results in some events, which in turn rely on Concepts, which are sent out to Things which may have Powerups which react to them.
So that, in a nutshell (a large nutshell, perhaps a coconut) is Imaginary as it stands right now. If this was interesting to you, consider subscribing to our mailing list