Saturday, April 29, 2006

Right now, today, here's what you can do with I...

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

Friday, April 7, 2006

Divmod Nevow 0.8.0 Released

Hey folks, we've got a new Nevow release for you. Tons of great changes have gone in since 0.7.0. Athena in particular has gotten a lot of attention and here are some of the new things you'll find in 0.8.0:

  • Nevow Interactive Tests - a test runner which lets you exercise code in a browser and collect results in an structured manner.

  • JavaScript source lines in tracebacks logged on the server.

  • A JavaScript implementation of DeferredList and gatherResults from Twisted.

  • Direct use of Zope Interface (meaning everything will be faster from avoiding the compatibility layer provided by Twisted).

  • Transparent, structured argument passing for Widget.__init__.

There are plenty of other minor bug fixes and feature enhancements, too. Check out the ChangeLog for all the details. What are you waiting for?