Forum: Ruby Dorothy 0.0.1 -- A Z-Machine interpreter library

Announcement (2017-05-07): is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see and for other Rails- und Ruby-related community platforms.
C2d624087e119714ac4d7a2f3b31ae40?d=identicon&s=25 Eric K Idema (Guest)
on 2008-10-16 02:46
(Received via mailing list)
= Dorothy

Introducing Dorothy a Z-Machine interpreter library.  The Z-Machine is
virtual machine used by many commercial and amateur works of interactive

Dorothy is mostly C (taken in part from Frotz) with a Ruby interface.
The goal
of the project is to provide the base for writing interpreters and other

You can get the code from Github:


Currently, most of the core instructions are implemented and tested.
But, a
sizable number of instructions are still on the todo list.  Those
related the
the Z-Machine's screen model are mostly missing.  As are save, restore,
restart instructions.

= Demo

It's functioning well enough to power the demo here:


= RubyGems

Sorry, no gem available for this release.  Go to Github to get the code.

= Sample IRB Session

eki@indus> irb -r dorothy
>> m = "minizork.z3" )   # Create a new machine from the given
=> #<Z::Machine:0xb7cd7be0>              # filename

# Z::Machine#run executes instructions until the program finishes or
# it needs input and none is available.

=> nil

# The machine writes output to an array.  Each token is the result of
one of
# the print instructions.

>> m.output
=> ["MINI-ZORK I: ", "The Great Underground Empire", "\n", "Copyright
(c) 1988
Infocom, Inc. All rights reserved.\nZORK is a registered trademark of
Inc.\nRelease ", 34, " / Serial number ", "8", "7", "1", "1", "2", "4",
"\n", "West of House", "\n", "You are standing in an open field west of
a white
house, with a boarded front door. ", "You could circle the house to the
or south.", "\n", "There is a ", "small mailbox", " here", ".", "\n",

>> m.output.clear
=> []

# You can feed input into the machine via Z::Machine#keyboard.  The
# usually wants a full line of input, though sometimes it will try to
# individual characters.  Z::Machine#run will only proceed if there's
# input available.

>> m.keyboard << "open mailbox\n"
=> "open mailbox\n"
=> nil

>> m.output
=> ["> ", "open mailbox", "\n", "Opening the ", "small mailbox", "
reveals ",
"a ", "leaflet", ".\n", "\n", ">"]
This topic is locked and can not be replied to.