!--------------------------------------------------------------------------
! The Carousel Room from Zork II: an example
!
! Graham Nelson, 3/95, after Lebling & Blank
!--------------------------------------------------------------------------

Constant Story "CAROUSEL";
Constant Headline "^An Interactive Snippet from Zork II^by Dave Lebling \
   and Marc Blank (1981)^";

Constant MAX_SCORE 4;
Include "parser";
Include "verblib";
Include "grammar";

[ Initialise;
   location = Arched_Hall;
   print "^^^^^Are you feeling dizzy? It must be the...^^";
];

Object  Arched_Hall "Arched Hall"
has    light
with   description "This is an arched hall of fine marble. The hall is \
           blocked to the north by an unfordable stream, where the \
           marble is cracked and broken. Perhaps a flood or collapse of \
           the cave was responsible. To the south the hall opens into a \
           large room. There is rather annoying whirring sound coming \
           from that room.",
       s_to Carousel_Room;

Object  Carousel_Room "Carousel Room"
has    light general
with   description [;
           print "You are in a large circular room whose high ceiling is \
               lost in gloom.  Eight identical passages leave the \
               room.^";
           if (self has general)
               "A loud whirring sound comes from all around, and you \
               feel sort of disoriented in here.";
           "The whirring sound is very quiet, and you no longer feel \
           dizzy.";
       ],
       n_to Arched_Hall,
       ne_to side_room_ne,
       nw_to side_room_nw,
       se_to side_room_se,
       sw_to side_room_sw,
       s_to side_room_s,
       e_to side_room_e,
       w_to side_room_w,
       before [ i;
        Go:
           print "You're not sure which direction is which.  This room \
               is very disorienting.^";
           switch (random(7)) {
            1: i = Arched_Hall;
            2: i = side_room_ne;
            3: i = side_room_nw;
            4: i = side_room_se;
            5: i = side_room_sw;
            6: i = side_room_s;
            7: i = side_room_e;
           }
           PlayerTo(i);
           rtrue;
       ];

Class   side_room
with   description "This is a little side-chamber, with no other exit.",
has    light;

Object  side_room_ne "NE of Carousel"
class  side_room
with   sw_to Carousel_Room;

Object  side_room_nw "NW of Carousel"
class  side_room
with   se_to Carousel_Room;

Object  side_room_e "E of Carousel"
class  side_room
with   w_to Carousel_Room;

Nearby  table "oak table"
has    static supporter
with   name "oak" "table" "engraved" "engravings",
       initial "An engraved oak table rests beside one wall.",
       description "~Place Treasures Here~.",
       after [;
        Receive:
           if (noun == pile) { deadflag = 2; "Chime!"; }
       ];

Object  side_room_w "Room 8"
class  side_room
with   e_to Carousel_Room;

Nearby  pile "pile of jewels"
has    scored
with   name "pile" "of" "jewels" "gems";

Object  side_room_se "SE of Carousel"
class  side_room
with   nw_to Carousel_Room;

Object  side_room_sw "SW of Carousel"
class  side_room
with   ne_to Carousel_Room;

Object  side_room_s "S of Carousel"
class  side_room
with   n_to Carousel_Room;

Nearby  switch "large switch"
has    switchable static on
with   name "large" "switch" "lever",
       when_off "A large switch is down on the wall.",
       when_on  "A large switch is up on the wall.",
       before [;
        Pull: <<SwitchOff self>>;
        Push: <<SwitchOn self>>;
       ],
       after [;
        SwitchOn:  "Nothing obvious happens.";
        SwitchOff:
           give Carousel_Room ~general;

           !  Note that, since Inform is an untyped language, it is
           ! entirely legal to over-write the "before" of Carousel_Room
           ! with a number... in this case -1, which means "no before
           ! routine at all" and is the value of "before" for any object
           ! which doesn't provide one.  This conveniently deletes the
           ! "disoriented" rule from the game.

           Carousel_Room.before = -1;
           "There is a shower of sparks, and the whirring sound dies \
           down.";
       ];

End;