Rename game files to lowercase
[spiritwrak.git] / src / gurth.inf
diff --git a/src/gurth.inf b/src/gurth.inf
new file mode 100644 (file)
index 0000000..8d420a0
--- /dev/null
@@ -0,0 +1,925 @@
+
+! **************************************************************
+! GURTH.INF -- Add-on for SPIRITWRAK
+! (all rights reserved, copyright 1996, D. Yu
+! **************************************************************
+
+! (author note to self -- Gurth currently isn't going to be too
+! exciting -- I'm running out of .z5 code space.  The main 
+! planned features are:
+!   1) The abandoned house with the oven for baking the cake
+!   2) A deep forest area somewhat north of the city where
+!      a sphere piece will be hidden  
+
+! The string array for labels on the GUE Oven dial (may be changed)
+Array OVEN_settings table [;
+   "Warm Soup"; 
+   "Hot Chocolate"; 
+   "Pizza"; 
+   "Cake";
+   "Fish";
+   "Roast Chicken";
+   "Baked Potato";
+   "Rib Roast";
+   "Thermo-nuclear Flash";
+];
+
+Object GURTH_GUSStop "Gurth City Streets"
+   with description "A foggy sky covers the ever-busy city of \
+Gurth. A road heads southeast into a larger \
+portion of the city, and stairs lead down here.",
+        name "fog" "sky" "road" "stairs",
+        d_to GURTH_GUSStation,
+        se_to GURTH_NDistrict,
+   has light;
+
+Object umbrella "umbrella" GURTH_GUSStop
+   with name "umbrella",
+        description [;
+           if (self has open)
+              print "An open";
+           else print "A closed";
+           " black-cloth umbrella.";
+        ],
+        !weight 25,
+        size 16,
+        article "an",
+        before [;
+           Open:
+              if (parent(self) == player) {
+              give self open;
+              umbrella.size = 20;
+              "You snap the umbrella open.";
+              }
+              else "You need to be holding the umbrella to do that.";
+           Close:
+              if (parent(self) == player) {
+              give self ~open;
+              umbrella.size = 16;
+              "You snap the umbrella closed.";
+              }
+              else "You need to be holding the umbrella to do that.";
+        ],
+   has openable;
+
+Object GURTH_NDistrict "North District"
+   with description "Probably the safest district in Gurth, the \
+North District is mostly cobblestone roads and barricaded \
+buildings. A main road heads south, or forks northwest and \
+northeast.",
+        name "cobblestone" "buildings" "road",
+        nw_to GURTH_GUSStop,
+        s_to GURTH_MDistrict,
+        ne_to GURTH_Forest,
+   has light;
+
+Object GURTH_Forest "Forest Edge"
+   with description "Dark forest meets dark city outskirts here. \
+The only exit is along an old path to the southwest -- \
+the forest is too thick for travel otherwise. \
+Rain falls periodically from a dark stormy sky.",
+        name "forest" "path" "rain",
+        sw_to GURTH_NDistrict,
+        each_turn [;
+        if (random(10) < 4) {
+           "^A rumble of thunder booms overhead.";
+        }
+        ],
+        before [;
+           Listen:
+              if (Treant in GURTH_Forest)
+                 "You hear muffled cries for help from \
+somewhere inside the log cabin!";
+        ],
+   has light;
+
+Object storm1 "storm" GURTH_Forest
+   with name "storm" "clouds" "sky" "dark",
+        description "It does look a bit stormy overhead.",
+        before [;
+           Cast:
+              if (the_spell_was == shazok_spell) {
+                 print "A bolt of lightning rips down from the \
+clouds overhead as you finish your chant! It strikes ";
+                 if (Treant in GURTH_Forest) {
+                    print "the angry treant! \
+A portion of its top branches catch fire! Howling in pain, \
+the creature runs off into the woods and disappears!";
+                    SaveWoodsman();
+                    rtrue;
+                 }
+                 else {
+                    deadflag = 1;
+                    "you, frying you to a crisp!";
+                 }
+              }
+        ],
+   has scenery;
+
+Object Treant "angry treant" GURTH_Forest
+   with name "treant" "angry" "blighted",
+        description "Treants are basically animated trees. They \
+are considered mythical creatures, usually solitary and quite \
+rare. This particular treant looks similar to a great elm tree. \
+You notice that it seems covered with spots of some sort of \
+blight.",
+   article "an",
+   each_turn [ i ;
+     i = random(20);
+     print "^The treant ";
+     if (i > 10) {
+        if (WOOD_House.number == 3) {
+           WOOD_House.number = 4;
+           remove self;  
+           "pounds the cabin, and it collapses into \
+splinters! The treant grabs a hapless woodsman from the \
+wreckage and stalks off into the forest with his victim!";
+        }
+        else {
+          WOOD_House.number = WOOD_House.number + 1;
+          "hammers on the house and you hear a \
+crack! The cabin sustains some damage!";
+        }        
+     }
+     else "angrily attacks the wood cabin, which shakes \
+with the continued blows.";
+   ],        
+   before [;
+      Cast:
+         if (the_spell_was == egdelp_spell) {
+            deadflag = 1;
+            "The treant is covered with a waxy buildup, which \
+washes off in the rain. The treant, already \
+rather incensed, turns his attentions to you and mauls you \
+with two giant branches/arms.";
+         }
+         if (the_spell_was == throck_spell) {
+            deadflag = 1;
+            "The treant grows a bit bigger. His current bad \
+mood seems to increase proportionately! He turns his attentions \
+to you and pounds you with two huge branches/arms.";
+         }
+         if (the_spell_was == taclor_spell) {
+            print "The treant seems to turn a shade of deep \
+green, and the patches of blight disappear! The ancient tree \
+creature pauses, regards you solemnly, and then walks \
+off into the forest.";
+            SaveWoodsman();
+            rtrue;
+         } 
+   ],
+   has animate;
+
+Object WOOD_House "log cabin" GURTH_Forest
+   with name "cabin" "log" "house",
+        description [; 
+            print "A small house built of logs";
+            switch (self.number) {
+            0: print ".";
+            1: print ". It looks slightly damaged.";
+            2: print ". It looks partially damaged, the roof logs \
+are broken in several places.";
+            3: print ". It looks very damaged. One wall is \
+nearly broken through.";
+            default: print " that has collapsed into little more \
+than a pile of broken logs."; 
+            } 
+            if (self has general)
+               " You notice some area of wood have spots of wax \
+on them.";
+            new_line;
+            rtrue;
+        ],
+        before [;
+           Enter:
+              if (Treant in GURTH_Forest)
+              "The angry treant seems to be in the way.";
+              "It's just a tiny log cabin that probably \
+has nothing interesting inside.";
+           Cast:
+              if (the_spell_was == egdelp_spell) {
+                 give self general;
+                 "The outside of the cabin is now covered \
+with spots of waxy buildup.";
+              }
+        ],
+        number 0,
+   has static;
+
+[ SaveWoodsman ;
+   remove Treant;
+   move red_sphere to player;
+   "^^Moments later, a woodsman appears from the battered log \
+cabin. ~Much thanks, sir,~ he says. ~Appears I mistook that \
+treant for a dead tree and tried to cut it down. Can't say \
+he took it too well.~ he says sheepishly. ~Say, you don't \
+look like you're from around these parts. Kinda like this \
+funny thing I found in the woods the other day.~ He hands \
+you a strange round object. ~Maybe you know what to do with \
+it?~ He hefts a small hatchet over his shoulder. ~Well, \
+back to do a little logging,~ he says, as he walks off into the \
+deep forest, whistling.";
+];
+
+Object GURTH_MDistrict "Market District"
+   with description "The famous Gurth Market District is as noisy, \
+crowded, and dangerous as it ever was. A cobblestone road heads \
+north and south here.",
+        name "cobblestone" "road",
+        n_to GURTH_NDistrict,
+        s_to GURTH_SDistrict,
+        e_to "~Get out 'o me way!~ some rude fellow says as you \
+try to pass.",
+        w_to "~No push'n, no shov'n!~ some old hag screams at you, \
+and promptly shoves you back.",
+        each_turn [;
+           if ((random(10) < 5) && (self hasnt general)) {
+              give self general;
+              move c7 to self;
+              "^A clumsy hawker stumbles into you as he \
+crosses the street, hustling off without so much as an \
+apology. You notice he dropped something in his hurry.";
+           }
+        ],
+        has light;
+
+Object c7 "coin" class coin_class;
+
+Object GURTH_SDistrict "South District"
+   with description "The general gloomy atmosphere is more noticeable \
+than ever here, in the extremely dangerous South District. The \
+general area is filled with boarded-up houses, and a few shifty-eyed \
+characters are the only people milling about here. A road leads \
+north. To the east is an abandoned flat, probably in better shape \
+than the rest.",
+        name "houses" "characters" "people" "road" "flat",
+        n_to GURTH_MDistrict,
+        s_to [;
+           print "You wander down ";
+           if (random(20) == 5) {
+              deadflag = 1;
+              "a back alleyway, and are immediately \
+assaulted by a group of vicious thugs, who batter you senseless.";
+           }
+           else "an alleyway, find a dead-end, and return \
+here.";
+        ],
+        w_to [;
+           print "You wander down ";
+           if (random(20) == 5) {
+              deadflag = 1;
+              "a sidestreet, and are immediately \
+assaulted by a group of vicious thugs. One of them seems to \
+recognize you. ~That's the Preacher-man who got Davey arrested! \
+Let's show 'em what we think'o that!~ They proceed to beat you senseless.";
+           }
+           else "a sidestreet, find a dead-end, and return \
+here.";
+        ],
+        e_to GURTH_House,
+   has light;
+
+Object GURTH_House "Front of House"
+   with description "You're standing at the rotting front steps of \
+a small flat. The front door to the east has been battered down and \
+you could probably walk right in, or return to the street to \
+the west.",
+        name "street" "steps" "flat",
+        w_to GURTH_SDistrict,
+        e_to House_Ent,
+        in_to House_Ent,
+   has light;
+
+Object GURTH_House2 "Front of House"
+   with description  "You're standing near a small construction site. \
+A city street lies west, and a construction ditch is east.",
+        name "street" "ditch",
+        w_to [;
+               deadflag = 1;
+              "You step into the street, and several locals \
+give you strange looks. The surrounding neighborhood seems \
+new and busy -- various construction sites mark the \
+work of enterprising shop-keepers of the area.^^\
+~Watch out there!~ someone cries. A sudden \
+pile of bricks falls from a nearby scaffolding, and \
+crushes you.";
+        ],
+        e_to Construction_site,
+   has light;                      
+
+
+Object bad_brick "dusty brick" GURTH_House2
+   with name "brick" "dusty" "old",
+        initial "An old discarded brick lies nearby.",
+        description "An old brick, slightly cracked in several places.",
+        size 15,
+        time_left 0,
+        time_out [;
+           ! Construction Worker appears
+           if ((good_brick in Construction_site) || 
+               ((good_brick notin Construction_site) && 
+                (bad_brick notin Construction_site))) {
+              remove good_brick; 
+              foundation_wall.number = 1;
+           }
+           else {
+              remove bad_brick;
+              foundation_wall.number = 2;
+           }
+           if (location == Construction_site) {
+              print "^From behind some scaffolding, a construction \
+worker appears. He walks to a part of the ditch and starts to \
+make some finishing touches on part of a low wall. \
+He finds a brick nearby and applies it to the wall with \
+a good patch of mortar.";
+              if (foundation_wall.number == 1) 
+" Brushing himself off, he walks off \
+and is soon out of sight.";
+              else 
+" He looks at the patch somewhat \
+unsatisfied, but shrugs, and walks off, soon out of sight.";
+           }
+           else 
+              "^You hear some brief noises from the east."; 
+        ],
+;
+
+Object Construction_site "Construction Site"
+with description "This is a long square ditch that is \
+likely to be the starting point for some building. It is \
+framed by wood slats and short brick walls. The only way \
+out is to the west.",
+   name "ditch" "slats" "wood",
+   w_to GURTH_House2,
+   has light;
+
+Object good_brick "thick brick" Construction_site
+   with name "brick" "thick",
+        !weight 30, 
+        size 15,
+        initial "A thick brick lies nearby.",
+        description "A thick brick, solid as a rock.",
+;
+
+Object foundation_wall "portion of wall" Construction_site
+   with name "wall" "foundation" "portion" "hole" "recess",
+        initial "You notice a foundation side wall \
+in the ditch.",
+        number 0,
+        size 15,
+        description [;
+           switch (self.number) {
+           0: "It looks somewhat unfinished. Part of it \
+is open into a dark recess in the side of the ditch.";
+           1: "The wall is a finished work of brick and \
+mortar. It looks quite strong.";
+           2: "The wall is a finished work of brick and \
+mortar. You see a spot where the brickwork seems a bit \
+lower in quality.";
+           } 
+        ],
+        before [;
+           Receive:
+              if (self.number > 0)
+                 "The wall is currently sealed shut.";
+              else {
+                 move noun to self;
+                 print "You put ", (the) noun, " into the ";
+                 "small hole in the wall.";
+              }
+           Search, LetGo:
+              if (self.number > 0)
+                 "The wall is currently sealed shut.";
+           Attack:
+              if (self.number == 0) {
+                 deadflag = 1;
+                 "You kick at the wall. Unfortunately, it wasn't \
+all that stable, and the wall falls apart, burying you under a \
+pile of loose bricks.";
+              } 
+              if (self.number == 1) {
+                 remove foundation;
+                 print "You try to break the wall, but only end up \
+hurting your hand. ";
+              }
+              else {
+              give foundation general;
+              print "You knock on the weak portion of the \
+wall, and produce a slight crack, that no doubt will \
+cause the homeowners some worry in the future. ";
+              }
+!              give GURTH_House ~general;
+              while (child(player) ~= 0) remove child(player);
+!              while (child(GURTH_House) ~= 0) remove child(GURTH_House);
+print "The wall seems to start to glow a purple color, and you \
+step back, to find your surroundings replaced by cold natural \
+cave walls.^";
+              Mystical_Cave.number = Mystical_Cave.number + 1;
+              PlayerTo(Mystical_Cave);
+              rtrue;
+        ],
+   has static container open;
+
+Object House_Ent "Entrance Room"
+   with description "A bare room, with peeling paint and rotting, \
+water-stained walls. There's a room to the east, and a rickety \
+stairway down. The outdoors lie west.",
+        name "paint" "stairway" "outdoors",
+        e_to House_Kitchen,
+        d_to House_Basement,
+        w_to GURTH_House,
+        out_to GURTH_House,
+   has light;
+
+Object House_Basement "Basement"
+   with description "A musty, smelly basement. Stairs head up.",
+        name "stairs",
+        u_to House_Ent,
+        before [;
+           Smell: "It's smells musty down here, as though \
+the place has been unused for quite some time.";
+        ],
+;
+
+Object House_switchbox "dusty metal box" House_Basement
+   with name "dusty" "metal" "box",
+        when_closed "There's a dusty metal box attached to the wall here.",
+        when_open [ x;
+         print "There's an open metal box attached to the wall here. ";
+         x = children(self);
+         if (x == 0) "It seems to be empty.";
+         print "It contains:^";
+         x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT;
+         WriteListFrom (child(self), x, 1); 
+         rtrue;
+        ],
+        capacity 3,
+        size 10,
+        description "A dusty metal box, attached to the wall.",
+        before [;
+           Open, Push, Pull, Turn, Touch:
+              if (GHOST in House_Basement)
+                 "Slowly, but quite deliberately, the zombie \
+prevents you from getting near the box.";
+        ],
+   has static container openable;
+
+
+Object wire "thin wire" House_switchbox
+   with name "wire" "thin",
+        ! initial "Inside the box is a loose wire.",
+        description "A thin stiff string of metal.",
+        !weight 2,
+        size 1,  ! must fit in subway gate slot...
+        before [;
+          Cast:
+if ((the_spell_was == huncho_spell or luncho_spell) &&
+   (self hasnt general))
+"Your chant goes unanswered.";
+          Take, Push, Pull, Touch, Rub, Squeeze:
+             if (self hasnt general) {
+                if (rubber_gloves has worn) {
+                   if (action==##Take) give self general;
+                   print "As you touch the wire, you notice a \
+bright spark! Good thing you were wearing rubber gloves! ";
+                }
+                else {
+                   print "As your fingers get near the wire, \
+a bright spark of electricity ";
+                   if (random(10) < 4) {
+                   deadflag = 1;
+                   move GHOST to House_Basement;
+"arcs into your hand! The results are quite shocking, I'm afraid.";
+                   }
+                   else
+"flashes near your fingers! You pull back just in time.";
+                }
+             }
+        ],
+;        
+
+Object foundation "foundation" House_Basement
+   with name "foundation" "break" "hole",
+        initial "A large break in the wall exposes a good portion of \
+        the house's foundation.",
+        description "Water damage, or simply age, has exposed a large \
+        hole in one of the walls, through which you can see exposed \
+        wood and brick, part of the foundation of the house.",
+        before [;
+           Receive:
+              "No need to put things in the foundation like that.";
+           Search:
+              if (self hasnt general)
+                 "You briefly search the decaying foundation, but find nothing.";
+              else {
+                 print "You dig around in a familiar spot in the hole ";
+                 give self ~general;
+                 if (children(foundation_wall) == 0)
+                    "but find nothing.";
+                 Achieved(17);
+                 while (child(foundation_wall) ~= 0)
+                     move child(foundation_wall) to House_Basement;
+                 "and find something!"; 
+              }
+        ],
+   has static;
+   
+Object House_Kitchen "Kitchen"
+   with description "You're in the kitchen, by the looks of things. \
+Some broken cabinets are on the wall. Light from partially boarded-up \
+windows lets you see the rotting wood floors. Rooms lie to the \
+north and west.",
+        name "cabinets" "windows" "wood",
+        w_to House_Ent,
+        n_to House_Pantry,
+   has light;
+
+! (An oven, a typical inform object)
+Object OVEN "GUE-Automatic oven" House_Kitchen
+   with name "oven" "GUE-Automatic",
+        when_closed "Strangely untouched and undamaged, a GUE-Automatic oven is \
+sitting closed in a corner of the room.",
+        capacity 1,
+        when_open [ x;
+         print "Strangely untouched and undamaged, a GUE-Automatic oven is \
+sitting open in a corner of the room.";
+         x = children(self);
+         if (x == 0) " It seems to be empty.";
+         print "  It contains:^";
+         x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT;
+         WriteListFrom (child(self), x, 1); 
+         rtrue;
+        ],
+        size 15,
+        description "A FrobozzCo best-seller -- this small green oven is \
+perfect for those adventurers who want a home-cooked meal, but are short \
+on time and space. There's a dial and a button \
+on the top.",
+        before 
+        [ x ;
+           Open:
+              if (self hasnt open) {
+              give self open;
+              print "You open the oven, ";
+              x = children(self);
+              if (x==0) "which is empty.";
+              print "revealing:^";
+              x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT;
+              WriteListFrom (child(self), x, 1); 
+              rtrue; }             
+        ], 
+        add_to_scope oven_dial oven_button,
+   has static container openable;
+            
+Object oven_dial "oven dial" 
+   with name "dial",
+        number 5,
+        description [;
+          print "A round dial with small printed words. A line on the \
+oventop marks which dial setting is currently active, which at the \
+moment is ~", (string) OVEN_settings-->(oven_dial.number); "~.";
+        ],
+        before [;
+          Turn:
+            oven_dial.number = oven_dial.number + 1;
+            if (oven_dial.number > 9) oven_dial.number = 1;
+            print "The line is now pointing to ~", (string) OVEN_settings-->(oven_dial.number);
+            "~ on the dial.";
+          SetTo:
+            "The dial has somewhat unusual \
+settings. You'll need to turn to the one you want.";
+        ],
+   has static;
+
+Object oven_button "oven button" 
+   with name "button" "black",
+        number 0,
+        description "A small round black button on the top of the oven.",
+        before [;
+           Push:
+              if (OVEN has open)
+                 "There is an irritated buzz.";
+              else {
+                 print "You press the button and hear a low spinning noise. \
+Suddenly, the oven makes a ";
+              if (oven_dial.number == 9) {
+                 ! Ye old nuclear flash setting
+                 if (children(OVEN) ~= 0)
+                    remove child(OVEN);       
+"tremendous 'bang', and nearly springs off \
+the floor! A bright flash of light seems to originate from somewhere \
+inside the oven! Then, just as suddenly, everything is quiet again.";
+              } 
+              ! check object in oven
+              ! if obj exists, check for edible
+              ! or cake, mutate appropriately.
+              if (children(OVEN) ~= 0) {
+                 if ((Baking_Pan in oven) && (cake in Baking_Pan)) {
+                    ! we're no doubt cooking the cake again.
+                    ! as a nice feature of the GUE auto, if the cake
+                    ! was undone, and the oven setting == 4, give
+                    ! the cake the 'done' result
+                    if ((cake.number == 1) && (oven_dial.number == 4))
+                       cake.number = 0;
+                    ! otherwise, nothing changes
+                 }
+                 if ((Baking_Pan in oven) && (dough in Baking_Pan)) {
+                    ! first, check oven setting (too cold or too hot)
+                    ! if setting ok, check number of times folded
+                    ! (too few, too many).  Move 'cake' to pan, make
+                    ! dough child of cake, and set the 'result' number
+                    ! of cake accordingly (0, ok, 1 underdone, 2
+                    ! overdone, 3 underfolded, 4 overfolded) 
+                    ! (assumption is that dough will be only thing
+                    ! in pan [add's are trapped by dough]
+                    move dough to cake;   ! Zen cooking...
+                    move cake to Baking_Pan;
+                    if (oven_dial.number == 4) {
+                       if (dough.number < 83)
+                          cake.number = 3;
+                       if (dough.number > 83)
+                          cake.number = 4;
+                       else cake.number = 0;   ! well done baker
+                    }
+                    else {
+                       if (oven_dial.number < 4)
+                          cake.number = 1;
+                       if (oven_dial.number > 4)
+                          cake.number = 2;
+                    } 
+                 }
+              }
+"a loud 'pop' and nearly springs off \
+the floor! Then, just as suddenly, everything is quiet again.";
+              }
+        ],
+   has static;
+
+Object House_Pantry "Pantry"
+   with description "This was once probably a pantry of some \
+sort. It's now a bare closet-sized room. The exit is south.",
+   s_to House_Kitchen,
+   has light;
+    
+Object Baking_Pan "baking pan" House_Pantry  
+   with name "pan" "baking",
+        description "It's a nice round flat-bottomed ceramic pan.",
+        capacity 20,
+        !weight 10,
+        size 14,
+        before 
+        [ i ;
+          Mix:
+             if (children(Baking_Pan) == 0)
+                "There doesn't seem to be anything in the pan to mix.";
+             else {
+                if (cake in Baking_Pan)
+                   "You can't mix anything with the already baked cake in the pan.";
+                ! if the dough is already in the pan, add the 
+                ! 'new children', if any
+                if (dough in Baking_Pan) {
+                   i = 0;
+                   move dough to OVEN;  ! Temp
+                   while (child(Baking_Pan) ~= 0) {
+                         i = i + 1;
+                         move child(Baking_Pan) to dough;
+                   }
+                   move dough to Baking_Pan;
+                   if (i == 0) 
+                      "You need to add something to the pan if you \
+want to mix something new into the dough.";
+                   "You mix in the new ingredients into the dough.";
+                }
+                ! Minimally, if the flour, butter and egg are in the 
+                ! pan, 'dough' will be produced 
+                if ((flour notin Baking_Pan) || 
+                    (corbie_egg notin Baking_Pan) ||
+                    (butter notin Baking_Pan))
+                   "You mix the contents of the pan around a bit, but \
+some things don't quite coagulate, and the contents remain unmixed.";
+                else {
+                   while (child(Baking_Pan) ~= 0) {
+                        move child(Baking_Pan) to dough;
+                   }
+                   move dough to Baking_Pan;
+                   "You start mixing. Like magic, in short time you \
+have a doughy mixture in the pan."; 
+                } 
+             }
+          LetGo:
+             if (noun == dough or cake) { 
+                CDefArt(noun); " is stuck fast in the pan and \
+                you can't get it out.";
+             }
+             else {
+             ! we've modified certain ingredient objs that we want \
+             ! to 'preserve' in the pan.
+                if ((noun == flour) || (noun == sugar_cube) ||
+                    (noun == baking_powder) || (noun == butter) ||
+                    (noun == corbie_egg) || (noun==dornberries)) 
+                   "It's somewhat scattered about in the pan right \
+now, and you can't quite remove it cleanly.";
+             }
+          Receive:
+             if (cake in self)
+                "The cake takes up the entire space in the pan.";
+             ! -- trap and nicely parse putting
+             ! ingredients in pan, will require modifying 
+             ! 'short_name's of various ingredients.
+             if (noun == flour) {
+                flour.short_name = "pile of flour";
+                move flour to Baking_Pan;
+                flour.description = "A heap of white flour.";
+                "You break open the bag and add the flour to the pan."; 
+             }
+             if (noun == sugar_cube) {
+                sugar_cube.short_name = "quantity of sugar";
+                move sugar_cube to Baking_Pan;
+                sugar_cube.description = "Some sugar scattered about.";
+                "You crumble the sugar cube into the pan.";
+             }
+             if (noun == baking_powder) {
+                baking_powder.short_name = "small sprinkling of baking powder";
+                move baking_powder to Baking_Pan;
+                baking_powder.description = "A small pile of very fine white powder.";
+                "You open the packet and add the powder to the pan.";
+             }
+             if (noun == corbie_egg) {
+                corbie_egg.short_name = "bit of raw egg";
+                move corbie_egg to Baking_Pan;
+                corbie_egg.description = "The yolk and the white parts from an egg.";
+                "You crack the egg and drop the gooey contents into the \
+                pan, discarding the shell.";
+             }
+        ],
+   has container open;
+
+Object pan_sticker "sticker" Baking_Pan
+   with name "sticker",
+        initial "There's a sticker stuck to the bottom of the pan.",
+        description "\
+Frobozz Magic Baking Pan^^\
+HELLO, BAKER!^^\
+To mix ingredients placed in pan, simply say 'MIX PAN'. \
+Baked goods should be removed with a Frobozz Magic \
+Spatula.",
+        !weight 1,
+        size 5,
+;
+
+Object dough "lump of dough"
+   with name "dough",
+        number 0,   ! equals the number of times folded
+        !weight 10,
+        size 14,
+        description "It looks like a nice beige lump of uncooked dough.", 
+        before [;
+          Eat, Taste:
+             if (action==##Eat) remove self;
+             "Ugg. Raw dough.";
+          Cast:
+             if (the_spell_was == gloth_spell) {
+                dough.number = dough.number + 83;
+                if (dough.number > 500) dough.number = 500;
+                "As you speak the chant, the dough seems to \
+twinkle! With a sudden puff of flour, the dough spins and \
+neatly kneads itself many times!";
+             }
+          Fold:
+             dough.number = dough.number + 1;
+             print "You roll up your sleeves and start kneading. \
+The dough "; 
+             if (dough.number > 500) dough.number = 500;
+             if (dough.number < 50)
+                "folds easily.";
+             if (dough.number > 200)
+                "has the consistency of a soft rock.";
+             "is pliable.";
+        ], 
+   has edible;
+
+Object cake "cake" 
+   with name "cake",
+        number 0,  
+! number = condition:
+! 0 ok, 1 undercooked, 2 overck, 3 underfld, 4 overfld
+        description [;
+              print "It's a ";
+              switch (cake.number) {
+                1: "somewhat raw-looking cake.";
+                2: "nice-looking cake, except that it \
+looks a little burned.";
+                default: "nice-looking cake.";
+                ! The player will have to taste the cake to check the
+                ! 'fold quality'.
+              }
+        ],
+        before [;
+           Eat:
+                remove self;
+                "Not bad. Unfortunately, it looks like you can't have \
+your cake and eat it too.";
+           Taste:
+              print "You taste a tiny bit of the cake. ";
+              switch (cake.number) {
+                1: "It tastes a bit underdone.";
+                2: "It tastes a little burned.";
+                3: "It's a little too soft.";
+                4: "It's a bit tough.";
+                default: "It tastes great!";
+              }
+           ], 
+        !weight 10,
+        size 14,
+   has edible;
+
+
+
+! ***************
+! animated beings
+! ***************
+
+Object GHOST "frightening zombie" House_Basement
+   with name "zombie" "frightening",
+        description "A frightening gaunt member of the \
+living dead, with pale skin, and even paler eyes.",
+        before [;
+           Cast:
+              if (the_spell_was == wigro_spell) {
+                 remove self;
+                 "The zombie crumbles into dust, turned.";
+              }
+        ],
+        life [;
+           ThrowAt:
+              if (noun==holywater) {
+                 remove holywater; remove self;
+                 "The vial breaks into shards, scattering \
+holy water all over the zombie. The zombie shrieks, and \
+crumbles into dust."; 
+              }
+           Attack: "Your attack knocks it back, but it \
+seems completely unharmed, somehow!";
+           Give:
+if (noun==rubber_gloves) {
+   move wire to House_Basement;
+   move rubber_gloves to House_Basement;
+   give rubber_gloves ~worn;
+   give wire general;
+   give House_switchbox open;
+   remove self;
+   "The zombie seems to regard the gloves, and slowly puts \
+them on. It proceeds to open the metal box and remove a \
+loose wire, producing a few sparks in the process. Finally, \
+it places the loose wire on the floor, satisfied. It \
+slowly crumbles into dust, but you just manage to hear, \
+~Thanks, I've been trying to get rid of that wire for ages,~ \
+in the faintest of whispers.";
+}    
+           default: "Zombies are usually not very responsive to \
+those among the living. This one is no exception.";
+        ],
+   has animate;
+
+! ***************
+! spells/scrolls
+! ***************
+
+Object gray_scroll "gray scroll" House_Basement
+  class scroll_class,
+  with name "gray",
+;
+
+Object tossio_spell "turn granite to pasta" gray_scroll
+  class spell_class,
+  with name "tossio",
+       magic [;
+         if ((location == THIEF_Storeroom) && 
+             (second == w_obj) && (THIEF_Storeroom hasnt general)) {
+         give THIEF_Storeroom general;
+         move pasta to THIEF_Storeroom;
+         move c50 to THIEF_Storeroom;
+         "As you finish the chant, the granite wall is replaced \
+by a large mass of pasta. A hidden section of the room is revealed, \
+along with the mass of gold coins it was holding! The coins spill \
+out, and nearly flood the room.^^In a flash, a large group of \
+financial nymphs appear on the scene. ~It looks like we found the \
+missing GUS earnings,~ one nymph says to another. Producing large \
+sacks, they quickly collect the mass of coins and disappear with a \
+twinkle.^^Moments later, a single coin falls out of a crack in the \
+previously hidden alcove, rolling to a stop near your feet.";
+         }
+         "Your chant goes unanswered. I guess you need pure granite.";
+       ],
+;
+
+! ***************
+! misc items
+! ***************
+
+Object red_sphere "red sphere"
+   class sphere_class
+   with name "red",
+        description "A tiny perfect red sphere, made of some strange \
+         unknown metal.",
+;