Rename game files to lowercase
[spiritwrak.git] / src / frostham.inf
diff --git a/src/frostham.inf b/src/frostham.inf
new file mode 100644 (file)
index 0000000..691db7e
--- /dev/null
@@ -0,0 +1,1162 @@
+
+! **************************************************************
+! frostham.inf
+! ------------
+! Frostham locations in SPIRITWRAK, included in spirit.inf
+! (Do not compile and/or use separately!)
+! **************************************************************
+
+Object FROSTHAM_Outskirts "Frostham Outskirts"
+   with description [;
+           print  "You are at the northern outskirts of Frostham. \
+The city proper is to the south. A few \
+snow covered residences are nearby. \
+A trail leads into a valley to the north";
+           if (self hasnt general) {
+              give self general;
+ ".^^The last time you saw Frostham was before you \
+entered the Monastery -- many years ago at least. \
+Oddly, it seemed bigger and less desolate then.";
+           }
+           else ".";
+        ],
+        name "city" "snow" "residences" "trail" "valley",
+        n_to Valley_trail,
+        s_to FROSTHAM_2,
+        cant_go "You walk around the local area a bit, finding \  
+                 nothing of interest.",
+   has light;
+
+Object FROSTHAM_2 "Frostham"
+   with description "You are in Frostham City, the famous winter-\
+lover's haven. The once booming ski vacation spot seems \
+to be a bit more run-down than in times past. \
+The city thins out towards the north, while \
+another section of town is to the south. To the west is \
+a large wood structure. To the southwest is a small \
+building. To the southeast is another small building, possibly a \
+store.",
+        name "wood" "structure" "building" "store",
+        n_to FROSTHAM_Outskirts,
+        w_to FROSTHAM_Resort,
+        sw_to FROSTHAM_Governer1,
+        s_to FROSTHAM_GUSStop,
+        se_to FROSTHAM_Store,
+        cant_go "You walk around the local streets a bit, finding \  
+                 nothing of interest.",
+        each_turn [ i ;
+           if (GROC_hall1 has general)
+              i = CheckHall();
+! Why check the grocery hallway here?  
+! Conceptually, if the player dies in the hallway (rather
+! difficult, but possible by swearing, for example),
+! the hallway should 'adjust' itself to the new weight.
+! I simply check this here, because the player must go
+! this way to reach the hallway for a second time.
+        ],
+   has light;
+
+Object FROSTHAM_Store "General Store"
+   with description [; 
+print "This appears to be a small grocery store, \
+strangely abandoned at the moment. Shelves line the walls, \
+although, since no one is minding \
+the store, the current stock seems to be a bit depleted. \
+You notice an exit south marked ~EMPLOYEES ONLY~ that \
+appears to lead to ";
+if (GROC_hall1.number == 1)
+print "some hallway.";
+else
+print "a dark hole.";
+" The way back out is to the northwest.";
+],
+        name "stock" "shelves",
+        nw_to FROSTHAM_2,
+        s_to [;
+if (GROC_hall1.number == 1) return GROC_hall1;
+else 
+   "You pull back before falling into what appears to be a deep \
+pit of some sort beyond the south exit."; 
+],
+   after [ i ;
+      Go:
+         if (noun == n_obj) {
+            i = CheckHall();
+            if (i == 1)
+               print "You hear a grinding noise from behind \
+you.^";
+         }
+   ],
+   has light;   
+
+Class Barrel_class
+   with name "crate",
+        before [;
+           Take, Pull, Turn: "It's rather heavy.";
+           Push:  "It's heavy, but you manage to make it slide \
+along the floor a bit.";
+           PushDir:
+if (location == FROSTHAM_Store && second == nw_obj)
+   "A portion of the door seal blocks the crate from going outside.";
+if (location == GROC_hall1 && second == s_obj) {
+   print "^You give the crate a good shove.^";
+   move self to GROC_hall2;
+   <<Go s_obj>>;
+}
+if (location == GROC_hall1 && second == n_obj) {
+   print "^You give the crate a good shove.^";
+   move self to FROSTHAM_Store;
+   <<Go n_obj>>;
+}
+if (location == GROC_hall2 && second == n_obj) {
+   print "^You give the crate a good shove.^";
+   move self to GROC_hall1;
+   <<Go n_obj>>;
+}
+if (location == FROSTHAM_Store && second == s_obj && GROC_hall1.number == 1) {
+   print "^You give the crate a good shove.^";
+   move self to GROC_hall1;
+   <<Go s_obj>>;
+}
+! (we do our own version to allow the CheckHall() to
+! work properly)
+AllowPushDir(); rtrue;
+        ],   
+   has static;
+
+Object BARREL1 "dusty crate" FROSTHAM_Store
+   class Barrel_class,
+   with name "dusty",
+        description "A dust-covered crate.",
+;
+Object BARREL2 "moldy crate" FROSTHAM_Store
+   class Barrel_class,
+   with name "moldy",
+        description "A mold-covered crate.",
+;
+Object BARREL3 "filthy crate" FROSTHAM_Store
+   class Barrel_class,
+   with name "filthy",
+        description "A filth-covered crate.",
+;
+
+Object GROC_hall1 "North end of Hallway"
+   with name "end" "hallway",
+        number 1,
+        description [;
+          print "You're at the north end of a short N-S hall. \
+The hallway";
+ switch (GROC_hall1.number) {
+ 1: print " slopes sharply upwards to the south. \
+You notice two dark doorways above you along the northern wall, \
+one above the other, \
+but no obvious means of getting to them";
+ 2: print " travels evenly to the south. \
+You notice a dark doorway above you along the northern wall, \
+but no obvious means of getting to it";
+ 3: print " slopes sharply downwards to the south";
+ }
+ ". To the north is an exit."; 
+],
+   each_turn [;
+      if (self hasnt general) {
+         give self general;
+         "^The hallway suddenly creaks underfoot! The floor \
+shakes briefly and dust seems to rise from cracks near the \
+walls. Apparently, your unexpected presence has jarred \
+some old mechanisms back to life!";
+      }
+   ],
+   n_to [;
+switch (GROC_hall1.number) {
+   1: return FROSTHAM_Store;
+   2: return GROC_stockroom;
+   3: return GROC_attic;
+}
+   ], 
+   after [ i ;
+      Go:
+         if (noun == n_obj or s_obj) {
+            i = CheckHall();
+            if (i == 2)
+print "^You hear a low grinding noise. \
+The hallway underfoot suddenly shifts and drops!^";
+         }
+   ],
+   s_to GROC_hall2,
+   before [;
+      Jump:  "You jump for a bit. The floor feels strangely \
+unsteady.";
+   ],
+   has light;
+
+
+Object GROC_hall2 "South end of Hallway"
+   with name "end" "hallway",
+        number 3,
+        description [;
+          print "You're at the south end of a short N-S hall \
+that seems to lead nowhere. The hallway";
+ switch (GROC_hall2.number) {
+ 1: "  slopes sharply upwards to the north.";
+ 2: "  travels evenly to the north.";
+ 3: "  slopes sharply downwards to the north.";
+ }
+ ],
+   after [ i ;
+      Go:
+         if (noun == s_obj) {
+            i = CheckHall();
+            if (i == 1)
+print "^You hear a low grinding noise. \
+The hallway underfoot suddenly shifts and drops!^";
+         }
+   ],
+   before [;
+      Jump:  "You jump for a bit. The floor feels strangely \
+unsteady.";
+   ],
+   n_to GROC_hall1,
+   has light;
+
+! (Routine for checking 'weights' of two sides of hallway)
+! (assumes called from room's _after_ routine, thus all
+! barrels and players are in their after_turn places)
+! RETURNS: 0 if no change
+!          1 if NORTH END now higher than before
+!          2 if NORTH END now lower than before
+[ CheckHall
+    i ! local total of weight points for north end
+    j ! local total of weight points for south end
+    k ! local -- orig setting of north end (.number)
+    ;
+  i = 0;  j = 0;
+  k = GROC_hall1.number;
+  if (player in GROC_hall1) 
+     i = i + 2;
+  if (player in GROC_hall2) 
+     j = j + 2;
+  if (BARREL1 in GROC_hall1) i = i + 1;
+  if (BARREL1 in GROC_hall2) j = j + 1;
+  if (BARREL2 in GROC_hall1) i = i + 1;
+  if (BARREL2 in GROC_hall2) j = j + 1;
+  if (BARREL3 in GROC_hall1) i = i + 1;
+  if (BARREL3 in GROC_hall2) j = j + 1;
+  if (i == j) {
+     GROC_hall1.number = 2;
+     GROC_hall2.number = 2;
+  }
+  if (i > j) {
+     GROC_hall1.number = 1;
+     GROC_hall2.number = 3;
+  }
+  if (i < j) {
+     GROC_hall1.number = 3;
+     GROC_hall2.number = 1;
+  }
+  if (GROC_hall1.number == k)
+     return 0;
+  if (GROC_hall1.number > k)
+     return 1;
+  if (GROC_hall1.number < k)
+     return 2;
+];  
+
+
+Object GROC_stockroom "Stockroom" 
+    with description [; 
+print "This is a tiny poorly lit room, that \
+is covered in dust. An exit south leads to a"; 
+if (GROC_hall1.number == 2) print " short hallway"; 
+else print " dark hole"; 
+if (GROC_attic has general) 
+   print ". Above, a hole has been exposed in the ceiling structure"; 
+"."; 
+     ],  
+      name "dust", 
+      u_to [; if (GROC_attic hasnt general)
+"You can't go that way.";
+           else return GROC_attic;
+        ],
+        s_to [;
+if (GROC_hall1.number == 2) return GROC_hall1;
+else 
+   "You pull back before falling into what appears to be a deep \
+pit of some sort beyond the south exit."; 
+        ],
+   after [ i ;
+      Go:
+         if (noun == n_obj) {
+            i = CheckHall();
+            if (i == 2 or 1)
+               print "You hear a low grinding noise behind you.^";
+         }
+   ],
+        has light;
+
+Object GROC_attic "Attic"
+   with description [;
+print "This is an exceptionally cramped attic, obviously \
+unused for some time. The floorboards are starting to crack.";
+if (self has general)
+   print " One section of the floor is particularly poor, and has \
+a gaping hole leading downwards into darkness.";
+" An exit heads south.";
+        ],       
+        name "sag" "crack" "hole",
+        d_to [;
+           if (GROC_attic hasnt general)
+"You can't go that way.";
+           else return GROC_stockroom;
+        ],
+        s_to [;
+if (GROC_hall1.number == 3) return GROC_hall1;
+else 
+   "You pull back at the edge of the exit. The floor, it \
+appears, is too far below you!";
+        ],
+   after [ i ;
+      Go:
+         if (noun == n_obj) {
+            i = CheckHall();
+            if (i == 2)
+               print "You hear a low grinding noise behind you.^";
+         }
+   ],
+        has light;
+
+Object attic_floorboards "floorboards" GROC_attic
+   with name "boards" "floorboards",
+        description [;
+print "Some badly rotting floorboards";
+if (GROC_attic has general)
+   " with a noticeable hole in one section.";
+else {
+   if (self has general)
+      " with a noticeable sag in one section.";
+   else ".";
+}
+        ],
+   before [;
+     Take: "They're nailed into the floor.";
+     Push, Pull, Attack, Shake:
+if (self has general)
+   "The floor shakes a bit, but nothing else happens.";
+else {
+   move loose_board to GROC_stockroom;
+   give self general;
+   "The floor shakes under your abuse, and suddenly, a \
+portion in the middle sags considerably! But nothing else \
+happens.";
+}
+   ],     
+   has scenery;
+
+Object loose_board "loose board"
+   with name "loose" "board",
+        initial "You notice a loose board, partially \
+broken, hanging from the ceiling structure.",
+        description "A portion of the ceiling boards \
+has apparently broken loose.",
+        before [;
+           Pull, Attack, Shake:
+give GROC_attic general;
+remove self;
+"You give the board a good couple of yanks. The board \
+soon breaks off, taking a small portion of the ceiling \
+with it! After the dust settles, you notice the rather \
+poor remodeling job you've done to the ceiling.";
+        ], 
+has static;
+
+
+! (the coffee was moved to the cafe in Borphee)
+Object decaf_coffee_can "can of decaf coffee" 
+   with name "can" "coffee" "decaf",
+        description "The can reads: ~Frobozz coffee crystals~^^\
+                    ~Rich, mountain-grown flavor.~^^DECAFFEINATED.",
+        before [;
+           Open:
+            "You'd need a good can-opener for that.";
+        ],
+        size 15,
+;
+   
+Object icebox_key "square key" GROC_attic
+   with name "key" "square",
+   size 5,
+;   
+   
+   
+Object icebox "icebox" GROC_stockroom
+   with name "icebox" "box",
+        description "A rather old-looking icebox.",
+        capacity 10,
+        size 20,
+        with_key icebox_key,
+        when_closed "A dust-covered icebox stands closed against \
+the northern wall.",
+        when_open [ x;
+         print "The icebox is open. ";
+         x = children(self);
+         if (x == 0) "It is also empty.";
+         print "Inside ";
+         if (x == 1) print "is: "; else print "are: ^";
+         x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT;
+         WriteListFrom (child(self), x, 1); 
+         rtrue;
+       ],
+   has static container openable lockable locked;
+
+Object cerealbox1 "blue cereal box" icebox
+   with name "box" "blue" "Crunchies",
+        description "A blue paper box with lettering that reads:^^\
+                    ~Grueslayer Crunchies!^^\
+                    (It's not just for adventurers anymore!)^^\
+                    [Free bonus scroll surprise inside!]~^^\
+                    Writing on the box reads ~50zm~.",
+        size 10, capacity 5,
+        before [;
+           Receive:
+              if (noun == cerealbox2 or cerealbox3) {
+                 "That doesn't quite fit.";
+              }
+           Cast:
+              if (the_spell_was == zemdor_spell) {
+                 if (self hasnt general) {
+                    give self general;
+                    move cerealbox2 to parent(cerealbox1);
+                    move cerealbox3 to parent(cerealbox1);
+                    Achieved(1);
+                    "The box of cereal suddenly seems to dance with magic! \
+                    Before your very eyes, the box suddenly splits into \
+                    three boxes! The magic fades, but the boxes remain.";
+                 }
+                 else
+                    "The magic fights against the cereal box, but fails. \
+                    I guess you can only triplicate once.";
+              }
+        ],                            
+   has container openable;
+   
+Object cerealbox2 "navy-blue cereal box"
+   with name "box" "navy-blue" "Sugarglobs",
+        description "A navy-blue paper box with lettering that reads:^^\
+                    ~Frobozz Super Sugar Globs!^^\
+                    (Seventeen times the sugar of any other cereal!)^^\
+                    [Free bonus Frobozz toy inside!]~^^\
+                    Writing on the box reads ~50zm~.",
+        !weight 10,
+        size 10, capacity 5,
+        before [;
+           Receive:
+              if (noun == cerealbox1 or cerealbox3) {
+                 "That doesn't quite fit.";
+              }
+        ],        
+   has container openable;
+
+Object cerealbox3 "royal-blue cereal box"
+   with name "box" "royal-blue" "Dornflakes",
+        description "A royal-blue paper box with lettering that reads:^^\
+                    ~Dornflakes^^\
+                    (Just like Grandma Dimwit used to make!)^^\
+                    [Free bonus Frobozz toy inside!]~^^\
+                    Writing on the box reads ~50zm~.",
+        !weight 10,
+        size 10, capacity 5,
+        before [;
+           Receive:
+              if (noun == cerealbox1 or cerealbox2) {
+                 "That doesn't quite fit.";
+              }
+        ],        
+   has container openable;
+      
+! A Breakfast cereal class -- what a concept   
+Class cereal_class   
+   with name "cereal",
+        description "A quantity of overly-sweetened breakfast cereal.",
+        !weight 5,
+        size 8,
+        before [;
+           Eat:  
+              remove self;
+              "You consume the cereal. The sugar rush occurs five seconds \
+              later and ends just as quickly.";
+        ],
+   has edible;
+   
+Object cereal1 "crunchy cereal" cerealbox1
+   class cereal_class
+   with name "crunchy";      
+Object cereal2 "sugary cereal" cerealbox2
+   class cereal_class
+   with name "sugary";      
+Object cereal3 "flaky cereal" cerealbox3
+   class cereal_class
+   with name "flaky";   
+   
+Object baking_powder "packet of baking powder" icebox
+   with name "powder" "baking" "packet",
+        short_name "packet of baking powder",
+        description "A single-use packet of baking powder from \
+~Port Foozle Bakers Guild~ products.",
+        !weight 5,
+        size 5,
+        before [;
+           Eat:
+             remove self;
+             "You eat the baking powder. Yuck.";
+        ],
+   has edible;
+
+Object butter "stick of butter" icebox
+   with name "butter" "stick" "fat",
+        description "A good-sized stick of butter.",
+        !weight 5,
+        size 5,
+        before [;
+           Eat:
+             remove self;
+             print "You eat the entire stick of butter.";
+             if (random(20) < 15)
+" Your heart will no doubt thank you for that someday.";
+             deadflag = 1;
+             " The sudden \
+intake of concentrated fat is too much of a shock to your \
+system, and an important artery somewhere bursts.";
+        ],
+   has edible;
+
+Object FROSTHAM_Resort "Ski Resort"
+   with description "You are inside a large ski resort. Perhaps \
+                    it's not ski-season, as the entire place is \
+                    basically empty. Frostham city lies to the \
+                    east.",
+        name "resort" "city" "ski" "skis" "earmuff" "earmuffs",
+        e_to FROSTHAM_2,
+        out_to FROSTHAM_2,
+        w_to "You don't have a lift-ticket. Also, you don't have \
+             skis. Most importantly, however, the slopes look \
+             pretty lousy.",
+   has light;
+
+Object FROSTHAM_Governer1 "Governor's House, Waiting Room"
+   with description "You are in a waiting room in the house of the Frostham \
+                    Governor. The carpet is surprisingly plush. \
+                    The walls have been painted a rather bland \
+                    peach-like color. The furnishings \
+                    are also colored peach, which complements the \
+                    walls without being too nouveau. The way out \
+                    is to the northeast.",
+        name "carpet" "furnishings",
+        ne_to FROSTHAM_2,
+        out_to FROSTHAM_2,
+        s_to Gov_door,
+        after [;
+           Go:
+              if (noun==n_obj) {
+                 give Gov_door ~open locked;
+                 print "You hear the door slam and lock behind you.^";
+              }
+        ],
+   has light;
+
+Object Gov_couch "couch" FROSTHAM_Governer1 
+   with name "couch" "peach",
+        initial "A comfortable-looking peach-colored couch is here.",
+        description "It looks pretty comfy, but the color wouldn't \
+have been your first choice.",
+        before [;
+           Search:
+              if (self hasnt general) {
+                 give self general;
+                 move c1 to FROSTHAM_Governer1;
+                 "You rummage through the cushions and a coin falls out!";
+              }
+              "You find nothing of interest.";
+        ],
+   has static enterable supporter;
+
+Object travel_posters "travel brochure" FROSTHAM_Governer1
+   with name "brochure" "travel",
+        description "The brochure has pictures of various cheerful-looking \
+                     people in rather cheerful-looking places. \
+                     Bold lettering reads ~FEEL BETTER IN MIZNIA~, \
+                     ~IT'S ARAGAIN, AGAIN~, \
+                     and ~NEW BORPHEE, EVERYONE'S FAVORITE CITY~",
+        size 10,
+   ;
+
+Object c1 "coin" class coin_class;
+
+Object Gov_desk1 "desk" FROSTHAM_Governer1
+   with name "desk" "waiting" "room",
+        description "A fairly plain-looking desk",
+   has scenery supporter;
+
+Object Gov_ledger "ledger" Gov_desk1
+   with name "ledger",
+        description [;
+           if (receptionist in FROSTHAM_Governer1) 
+              "The receptionist seems to be using it at the moment.";
+           "The ledger reads:^^\
+           ~ -- New signed petition for presentation and coronation of \
+new King delivered to Aragain Magistrate, awaiting word of \
+event schedule.~^^That's all. I guess the governor hasn't been \
+very busy as of late.";
+        ],
+        !weight 20,
+        size 15,
+        before [;
+           Take: 
+              if (receptionist in FROSTHAM_Governer1) 
+                 "The receptionist gives you a rather menacing look.";
+        ],
+;
+
+
+Object alarm_clock "alarm clock" Gov_desk1
+   with name "clock" "alarm",
+        description [; 
+print "A small round desk-clock, with a set of bells \
+on the top, and a small pull-knob on the back. \
+Strangely, the clock seems to be stopped. Two hands, black and golden, \
+are sitting at ",alarm_clock.number," and ",
+alarm_clock_dial.number;
+        " respectively.";
+                     ],
+        article "an",
+        number 9,   ! setting of the clock hand
+        time_left 0,
+        time_out [ x ;
+           alarm_clock.number = alarm_clock.number + 1;
+           if (alarm_clock.number > 12) alarm_clock.number = 1;
+           x = TestScope(alarm_clock,player);
+           if (x==1) print "^The alarm clock suddenly makes an \
+awful grinding noise";
+           if (alarm_clock.number == alarm_clock_dial.number) {
+              ! alarm goes off
+              if (x==1) print ", followed by a ear-splitting clang!^";
+              ! certain events follow:
+              ! if receptionist still in office and self in office,
+              ! receptionist leaves (if player in office, he'll
+              ! see this, or see it outside the office)
+              if ((receptionist in FROSTHAM_Governer1) &&
+          (((self in FROSTHAM_Governer1) || (self in Gov_desk1)) ||
+           ((self in player) && (player in FROSTHAM_Governer1))) ) {
+                 remove receptionist;  ! a long lunch hour, apparently...
+                 ! give alarm_clock general;
+                 Achieved(2);
+                 if (player in FROSTHAM_Governer1) 
+                    "^The receptionist suddenly jumps from her \
+seat and rushes out of the room, screaming ~Lunchtime!~";
+                 if (player in FROSTHAM_2)
+                    "^You see a woman rush out of the building \
+to the southwest, and quickly vanish.";
+                 rtrue;
+              }
+              ! future: boutique in Miznia -- brings salesman to front
+              if (((self in MIZNIA_Boutique) || (self in player)) && 
+                   (player in MIZNIA_Boutique)) {
+                   print "^From somewhere in the back of the \
+store, a tailor rushes out and";
+                   if (MIZNIA_Boutique hasnt general) {
+                      give MIZNIA_Boutique general;
+                      move fancy_scroll to player;
+                      Achieved(23);
+" sees you. ~We've got a rather \
+busy schedule,~ he explains, ~but let me see what I can do.~  \
+He gives you a somewhat unapproving look. ~The ascetic-monk \
+look is out, you know. Here.~ He pins a rolled paper object \
+to your clothes. ~The latest craze -- wearing magic scrolls. \
+Beats using them nowadays, I hear. Now, like I said, we're \
+very busy.~ He goes off to the back of the store."; 
+                   }
+                   else 
+" recognizes you. \
+~I've done all I can for you right now,~ he explains as \
+goes off to the back of the store."; 
+              }
+              rtrue;
+           }
+           else if (x==1) "!";
+        ],
+        size 5,
+        add_to_scope alarm_clock_dial alarm_clock_bells alarm_clock_hands,
+   has transparent;
+
+Object alarm_clock_dial "knob" 
+   with name "pull" "knob",
+        description "A small, pullable knob on the back of the clock.",
+        number 12,
+        before [;
+           Push:
+              print "The knob ";
+              if (self has general) {
+                 give self ~general;
+                 "pushes in a short bit.";
+              }
+              else "is as far in as it can go.";
+           Pull:
+              print "The knob ";
+              if (self hasnt general) {
+                 give self general;
+                 "pulls out a short bit.";
+              }
+              else "is as far out as it can go.";
+           Turn:
+              if (self hasnt general) {
+                 ! wind clock
+                 StartTimer(alarm_clock,1); 
+                 "The knob turns -- barely. You \
+hear a small clicking noise as well.";
+              }
+              else {
+                 ! set alarm hand
+                 alarm_clock_dial.number = alarm_clock_dial.number + 1;
+                 if (alarm_clock_dial.number > 12)
+                    alarm_clock_dial.number = 1;
+                 print "The knob turns easily. You notice the \
+golden hand on the front sweep to ",alarm_clock_dial.number;
+                 ".";
+              }
+            !  if (alarm_clock hasnt general) {
+            !  }
+            !  "It doesn't turn anymore.  I guess the receptionist \
+            !  broke the clock (not that it was in good shape to \
+            !  begin with).";
+       ],
+   has static;
+
+Object alarm_clock_hands "hands"
+   with name "hand" "hands"
+   has static;
+
+Object alarm_clock_bells "bells"
+   with name "bell" "bells"
+   has static;
+
+Object FROSTHAM_Governer2 "Governor's Office"
+   with description "You are in a rather spacious office. The \
+carpeting is quite plush, and all the furnishings seem \
+excessively lavish.",
+        name "carpeting" "furnishings", 
+        n_to Gov_door,
+   has light;
+
+Object Gov_desk2 "desk" FROSTHAM_Governer2
+   with name "desk" "office",
+        description "A fairly impressive looking desk, made from \
+                    a massive lacquered piece of black oak wood.",
+        before [;
+          Cast:
+           if (the_spell_was == egdelp_spell)
+              "The desk is covered with a ugly waxy film. \
+The governor looks extremely annoyed and wipes the desk clean with \
+a stack of papers.";
+          Push, Pull, Rub, Attack, Search:
+              "~Do you mind?~ the governor says.";
+        ],
+   has scenery supporter;
+
+Object Gov_door "door" 
+   with name "door" "office",
+        when_closed [;
+             print "There's a closed door to the ";
+             if (self in FROSTHAM_Governer1) 
+                   "south.";
+             else "north.";
+        ],
+        when_open [;
+             print "There's an open door to the ";
+             if (self in FROSTHAM_Governer1) 
+                   "south.";
+             else "north.";
+        ],
+        description "It's just a thick door.",
+        door_dir [ ; if (location==FROSTHAM_Governer1) return s_to;
+                    return n_to;
+                 ],
+        door_to [ ; if (location==FROSTHAM_Governer1)
+                      return FROSTHAM_Governer2;
+                   return FROSTHAM_Governer1;
+                ],
+        before [ ;
+           Open:
+              if ((location==FROSTHAM_Governer1) &&
+                  (receptionist in FROSTHAM_Governer1))
+              "The receptionist puts a hand in your way and says, \
+               ~The governor is currently busy.~";
+           Close:
+              if (location==FROSTHAM_Governer2)
+                 "~Close it on your way _out_~, the governor snarls.";
+        ],
+        found_in FROSTHAM_Governer1 FROSTHAM_Governer2,
+   has static door openable lockable;
+
+Object FROSTHAM_GUSStop "Subway Entrance"
+   with description "You're near the southern end of the city. \
+                     The rest of the city lies to the north. \
+                     There's also a rather conspicuous \
+                     stairway down here.",
+        name "stairway",
+        n_to FROSTHAM_2,
+        u_to "You can't go that way.",
+        d_to FROSTHAM_GUSStation,
+        cant_go "You walk around the local streets a bit, finding \  
+                 nothing of interest.",
+   has light; 
+
+            
+! ******************************************************************
+! People/Creatures
+! ******************************************************************
+
+Object ski_instructor "ski instructor" FROSTHAM_Resort
+   with name "instructor" "dude" "skier" "guy" "tall" "lanky",
+        initial [;
+           print "A tall lanky guy is here, holding two colorful \
+skis. He seems to be ";
+           if (waxy_scroll in self)
+               "waxing them with a scroll.";
+            "concentrating greatly on waxing \
+            his skis."; 
+        ],
+        description "A tall lanky guy, like I said. He's \
+            decked out in fancy bright winter clothes.",
+        life [;
+           Attack, ThrowAt:
+              "~Dude, you must chill.~";
+           Answer, Tell:
+             if (special_word == 'hello' or 'hi')
+                "The skier gives you the 'thumbs-up' sign. \
+~Hey, dude.~";
+             else "~Uh, whatever, dude.~";
+           Show:
+             if (noun==rag)
+                "~Hey dude, can I borrow that?~";
+             "~Uh, whatever, dude.~";
+           Order:
+             if (action==##Give) {
+             if (noun=='skis')
+                "~No way, dude.~";
+             if (((noun==waxy_scroll) && (self hasnt general)) ||
+                 ((noun==rag) && (self has general)))
+                "~I'm using it, dude.~";
+             }
+             "~Dude, I have no idea what you're talking about.~";
+           Ask: 
+             if (second=='rag')
+                "~A rag makes an excellent ski-maintenance accessory, dude.~";
+             if ((second=='scroll' or 'waxy') && (self hasnt general))
+                "~Something I found at the top of a run. \
+                 Doesn't work too well, but hey, I gotta wax.~";
+             if (second=='skis') 
+                "~My rad Grayslopes Slaloms. If you don't wax 'em \
+                 every 30 seconds, they lose their speed.~";  
+             if ((second=='slopes') || (second=='slope') ||
+                 (second=='powder') || (second=='runs') ||
+                 (second=='skiing'))
+                "The skier takes you aside. ~Listen dude, \
+                between you and me, the slopes here rot. They \
+                used to be way better. But you know, I hear there \
+                are some _killer_ drops up north.~";
+             "~Dude, I have no idea what you're talking about.~";
+           Give:
+             if (noun==rag) {
+                move waxy_scroll to FROSTHAM_Resort;
+                move rag to self;
+                give self general;
+                Achieved(3);
+                "The skier gladly takes the rag and starts \
+                polishing immediately. He lets the scroll \
+                fall to the ground. ~Excellent man, thanks!~";
+             }
+             "~No thanks, dude.~";
+           default: "At the moment, the skier is too busy waxing.";
+        ],
+        each_turn [;
+            if (waxy_scroll notin self && self hasnt general) {
+                Achieved(3);
+                remove self;
+                "^~Dude, like, that scroll thing just \
+vanished! What a cosmic experience!~ On that note, \
+the skier opts to head for the slopes, and leaves to the west.";
+            }
+            if (random(20) < 5)
+               "^The skier polishes a spot on his skis.";
+        ], 
+        before [;
+           Cast:
+              if (the_spell_was == foblub_spell or espnis_spell)
+                 "A pair of fluffy earmuffs the skier is wearing \
+prevents him from hearing the full impact of your sermon.";
+        ],
+   has animate transparent;
+
+Object receptionist "receptionist" FROSTHAM_Governer1
+   with name "receptionist",
+        initial "A receptionist sits behind a desk, engrossed in \
+                the ledger.",
+        description "A gruff-looking lady who apparently is far \
+                more interested in her work than you.",
+        each_turn [;
+           if (receptionist hasnt general) {
+              give receptionist general;
+              "^Without even looking up, the receptionist says, \
+              ~The governor is busy right now.~";
+           }
+           if (random(10) == 1)
+              "^The receptionist turns a page in the ledger.";
+        ],
+        life [;
+           Answer, Order:
+              print "The receptionist";
+              if (special_word=='hello')
+                 ", without looking up, says \
+                 ~Can I help you?~.";
+              " seems to be ignoring you.";
+           Ask:
+              print "The receptionist";
+              if (second=='governor')
+                 ", without looking up, says \
+                 ~He's very busy right now.~.";
+              " shrugs.";
+           default:
+              "The receptionist seems to be ignoring you.";
+        ],   
+        react_before [;
+           Cast: 
+"The receptionist, in a rather shrill voice says, \
+~If you're gonna wait, do it quietly,~ disrupting your chant.";
+           Blow:
+if (noun==whistle)
+"You make an unusually high-pitched noise. The receptionist, \
+in a rather shrill voice says, \
+~If you're gonna wait, do it quietly.~";
+           Sneeze:
+"~If you want to spread germs, do it outside.~";
+           Yell:
+"~If you're gonna wait, do it quietly.~";
+           Sing:
+"~We're not holding auditions, you know.~";
+        ],
+   has animate female;
+
+Object governor "governor" FROSTHAM_Governer2
+   with name "governor" "gov",
+        initial "The governor of Frostham is sitting behind a \
+                 desk here, trying to look busy.",
+        description "A sour-looking man who tries his best not \
+                 to notice you.",
+        each_turn [ i ;
+           if (governor hasnt general) {
+              give governor general;
+              move c2 to player;
+              "^The governor scowls as you enter. ~What do you want?~ \
+               he says, and doesn't wait for a response. ~Oh, I know. \
+               More complaints about the snow, I suppose? Well \
+               look, I didn't ask for this job. Do you want it? I \
+               didn't think so.~ He shoves something into your hand. \
+               ~Here, buy yourself a cup of coffee, and stop \
+               bothering me.~";
+           }
+           i = random(4);
+           print "^The governor ";
+           if (i == 1) 
+              "thumbs through some papers.";
+           if (i==2)
+              "balances a pencil on his nose.";
+           if (i==3)
+              "scribbles something meaningless.";
+           if (i==4)
+              "looks up and notices you. ~Don't you \
+              have anything else to do?~ he says.";
+        ],
+        life [;
+           Ask:
+              if (second=='key' or 'shiny') {
+                 print "~Some key an important visitor \
+forgot while visiting. Probably useless now";
+                 if (parent(cab_key) == player)
+                    print ". You can keep it, for all I care";
+                 ".~";
+              }
+              if (second=='receptionist')
+                 "~I think she's out to lunch,~ he says, \
+with obvious annoyance.";
+              if (second=='magistrate' or 'king' or 'sydney')
+                 "He looks at you suspiciously. \
+~Never heard of him,~ he says.";
+              if (second=='ledger')
+                 "~I think my receptionist has it.~";
+              if (second=='pencil')
+                 "~Please! I'm a very busy man!~";
+              "~Sorry, that's not my problem. Now run along.~";
+           Kiss:
+              "The governor brushes you off. ~Are you \
+planning on running for office or something?~";
+           Attack, ThrowAt:
+              deadflag = 1;
+              "As you make a threatening move, the governor \
+presses some unseen switch behind his desk. Before you \
+know it, a hidden trapdoor opens in the floor and you \
+plunge to your death. A good politician is always \
+prepared, it seems...";
+           Tell:
+              "~Sure, sure. Scram, will you?~";
+           Answer, Order:
+              if (special_word=='hello')
+                 "~Yeah, sure. So what's your problem?~";
+              "The governor is busy trying to look busy.";
+           Give:
+              "Bribing a politician, eh?";
+           Show:
+              if (noun==Gov_ledger)
+                 "~Hey, return that to the receptionist!~"; 
+              "~Please! I'm a very busy man!~";
+        ],
+        react_after [;
+           Take:
+              if (noun == cab_key)
+                 "~Oh sure, just go ahead and take things \
+from my office. See if I care.~";
+        ],
+        before [;
+           Cast:
+             if (the_spell_was == foblub_spell)
+                "Actually, the governor seems pretty glued to his \
+seat already. In any event, nothing seems to happen.";
+             if (the_spell_was == espnis_spell)
+                "The governor seems to nod off, but only for \
+a second.";
+        ],
+   has animate transparent;
+
+
+! ***************
+! More objects...
+! ***************
+
+Object pencil "pencil" governor
+   with name "pencil";
+
+Object c2 "coin" class coin_class;
+
+! (cereal box prizes)
+Object whistle "whistle" cerealbox2
+   with name "whistle",
+        description "A tiny plastic whistle.",
+        !weight 1,
+        size 1,
+        before [;
+           Blow: 
+              "You make an unusually high-pitched noise.";
+        ],
+;
+! (a fancier packaged prize :)
+Object plastic_wrapper "plastic wrapper" cerealbox3
+   with name "wrapper" "plastic",
+        description "A small plastic see-through package.",
+        before [;
+           Open:
+              while (child(self)~=0) move child(self) to parent(self);
+              remove plastic_wrapper;
+              "The wrapper rips open with ease, and disintegrates, \
+              leaving the contents behind.";
+        ],
+        !weight 0,
+        size 5,
+   has container openable transparent;
+   
+Object toy_volcano "toy volcano" plastic_wrapper
+   with name "toy" "volcano",
+        description "A strange thing indeed -- a miniature \
+              ceramic toy, that has been painted and shaped \
+              in painstaking detail to look like a volcano.",
+        !weight 5,
+        size 5,
+;
+
+Object volcano_note "instruction notice" plastic_wrapper
+   with name "notice" "instruction",
+        article "an",
+        description "~Frobozz Instant Volcano~^^\
+        (parental supervision recommended)^^\
+        To use:  Just add a good quantity of water! We suggest \
+        a very large safety radius.~",
+        size 5,
+;
+        
+
+
+! ******************
+! Scrolls and spells
+! ******************
+
+Object waxy_scroll "waxy scroll" ski_instructor
+   class scroll_class,
+   with name "waxy",
+;
+
+Object egdelp_spell "create waxy build-up on wood" waxy_scroll
+   class spell_class,
+   with name "egdelp",
+        magic [;
+           if (second ~= 0 && second ~= player) {
+           CDefArt(second); " looks pretty polished as is."; }
+           else { "The chant, seeking wood to polish, fails."; }
+        ],
+;
+
+Object sugar_scroll "sugar-coated scroll" cerealbox1
+   class scroll_class,
+   with name "sugar-coated" "coated",
+;
+
+Object zemdor_spell "triplicate object" sugar_scroll
+   class spell_class,
+   with name "zemdor",
+        number 0,
+        magic [;
+           if (second == 0)
+              "The chant, seeking a locus for \
+triplication, fails.";
+           if (second has animate)
+              "The chant, not designed for living creatures, fails.";
+           if (second has is_spell)
+"This violates certain unwritten laws of magic.";
+           if (second has is_coin) {
+              ! new twist for zemdor, as sugg. by player
+              print "The coin shimmers suddenly! You blink in \
+                 disbelief as the coin seems to split \
+                 into three copies of itself! ";
+              if (self hasnt general) {
+                 give self general;
+                 move c12 to parent(second);
+                 move c13 to parent(second);
+                 "You notice there are now three coins where \
+there was once but one!";   
+              }
+              "Suddenly, a financial nymph appears! She gives \
+you a denunciatory look. ~Line 7234-6 of the Pierpont \
+tax laws clearly states that repeated unauthorized \
+triplication of monetary \
+items is strictly forbidden,~ she says, and takes the \
+the two newly created coins before disappearing.";
+           }
+           print (The) second, " shimmers suddenly! You blink in \
+                 disbelief as ", (the) second, " seems to split \
+                 into three copies of itself! ";
+                 "But, as you finish the chant, \
+                 the mystic energy seems to fade, and the copies \
+                 coalesce back into one unchanged object. The \
+chant fails.";
+        ],
+;
+
+Object c12 "coin" class coin_class;
+Object c13 "coin" class coin_class;
+