Rename game files to lowercase
[spiritwrak.git] / src / frostham.inf
1
2 ! **************************************************************
3 ! frostham.inf
4 ! ------------
5 ! Frostham locations in SPIRITWRAK, included in spirit.inf
6 ! (Do not compile and/or use separately!)
7 ! **************************************************************
8
9 Object FROSTHAM_Outskirts "Frostham Outskirts"
10    with description [;
11            print  "You are at the northern outskirts of Frostham. \
12 The city proper is to the south. A few \
13 snow covered residences are nearby. \
14 A trail leads into a valley to the north";
15            if (self hasnt general) {
16               give self general;
17  ".^^The last time you saw Frostham was before you \
18 entered the Monastery -- many years ago at least. \
19 Oddly, it seemed bigger and less desolate then.";
20            }
21            else ".";
22         ],
23         name "city" "snow" "residences" "trail" "valley",
24         n_to Valley_trail,
25         s_to FROSTHAM_2,
26         cant_go "You walk around the local area a bit, finding \  
27                  nothing of interest.",
28    has light;
29
30 Object FROSTHAM_2 "Frostham"
31    with description "You are in Frostham City, the famous winter-\
32 lover's haven. The once booming ski vacation spot seems \
33 to be a bit more run-down than in times past. \
34 The city thins out towards the north, while \
35 another section of town is to the south. To the west is \
36 a large wood structure. To the southwest is a small \
37 building. To the southeast is another small building, possibly a \
38 store.",
39         name "wood" "structure" "building" "store",
40         n_to FROSTHAM_Outskirts,
41         w_to FROSTHAM_Resort,
42         sw_to FROSTHAM_Governer1,
43         s_to FROSTHAM_GUSStop,
44         se_to FROSTHAM_Store,
45         cant_go "You walk around the local streets a bit, finding \  
46                  nothing of interest.",
47         each_turn [ i ;
48            if (GROC_hall1 has general)
49               i = CheckHall();
50 ! Why check the grocery hallway here?  
51 ! Conceptually, if the player dies in the hallway (rather
52 ! difficult, but possible by swearing, for example),
53 ! the hallway should 'adjust' itself to the new weight.
54 ! I simply check this here, because the player must go
55 ! this way to reach the hallway for a second time.
56         ],
57    has light;
58
59 Object FROSTHAM_Store "General Store"
60    with description [; 
61 print "This appears to be a small grocery store, \
62 strangely abandoned at the moment. Shelves line the walls, \
63 although, since no one is minding \
64 the store, the current stock seems to be a bit depleted. \
65 You notice an exit south marked ~EMPLOYEES ONLY~ that \
66 appears to lead to ";
67 if (GROC_hall1.number == 1)
68 print "some hallway.";
69 else
70 print "a dark hole.";
71 " The way back out is to the northwest.";
72 ],
73         name "stock" "shelves",
74         nw_to FROSTHAM_2,
75         s_to [;
76 if (GROC_hall1.number == 1) return GROC_hall1;
77 else 
78    "You pull back before falling into what appears to be a deep \
79 pit of some sort beyond the south exit."; 
80 ],
81    after [ i ;
82       Go:
83          if (noun == n_obj) {
84             i = CheckHall();
85             if (i == 1)
86                print "You hear a grinding noise from behind \
87 you.^";
88          }
89    ],
90    has light;   
91
92 Class Barrel_class
93    with name "crate",
94         before [;
95            Take, Pull, Turn: "It's rather heavy.";
96            Push:  "It's heavy, but you manage to make it slide \
97 along the floor a bit.";
98            PushDir:
99 if (location == FROSTHAM_Store && second == nw_obj)
100    "A portion of the door seal blocks the crate from going outside.";
101 if (location == GROC_hall1 && second == s_obj) {
102    print "^You give the crate a good shove.^";
103    move self to GROC_hall2;
104    <<Go s_obj>>;
105 }
106 if (location == GROC_hall1 && second == n_obj) {
107    print "^You give the crate a good shove.^";
108    move self to FROSTHAM_Store;
109    <<Go n_obj>>;
110 }
111 if (location == GROC_hall2 && second == n_obj) {
112    print "^You give the crate a good shove.^";
113    move self to GROC_hall1;
114    <<Go n_obj>>;
115 }
116 if (location == FROSTHAM_Store && second == s_obj && GROC_hall1.number == 1) {
117    print "^You give the crate a good shove.^";
118    move self to GROC_hall1;
119    <<Go s_obj>>;
120 }
121 ! (we do our own version to allow the CheckHall() to
122 ! work properly)
123 AllowPushDir(); rtrue;
124         ],   
125    has static;
126
127 Object BARREL1 "dusty crate" FROSTHAM_Store
128    class Barrel_class,
129    with name "dusty",
130         description "A dust-covered crate.",
131 ;
132 Object BARREL2 "moldy crate" FROSTHAM_Store
133    class Barrel_class,
134    with name "moldy",
135         description "A mold-covered crate.",
136 ;
137 Object BARREL3 "filthy crate" FROSTHAM_Store
138    class Barrel_class,
139    with name "filthy",
140         description "A filth-covered crate.",
141 ;
142
143 Object GROC_hall1 "North end of Hallway"
144    with name "end" "hallway",
145         number 1,
146         description [;
147           print "You're at the north end of a short N-S hall. \
148 The hallway";
149  switch (GROC_hall1.number) {
150  1: print " slopes sharply upwards to the south. \
151 You notice two dark doorways above you along the northern wall, \
152 one above the other, \
153 but no obvious means of getting to them";
154  2: print " travels evenly to the south. \
155 You notice a dark doorway above you along the northern wall, \
156 but no obvious means of getting to it";
157  3: print " slopes sharply downwards to the south";
158  }
159  ". To the north is an exit."; 
160 ],
161    each_turn [;
162       if (self hasnt general) {
163          give self general;
164          "^The hallway suddenly creaks underfoot! The floor \
165 shakes briefly and dust seems to rise from cracks near the \
166 walls. Apparently, your unexpected presence has jarred \
167 some old mechanisms back to life!";
168       }
169    ],
170    n_to [;
171 switch (GROC_hall1.number) {
172    1: return FROSTHAM_Store;
173    2: return GROC_stockroom;
174    3: return GROC_attic;
175 }
176    ], 
177    after [ i ;
178       Go:
179          if (noun == n_obj or s_obj) {
180             i = CheckHall();
181             if (i == 2)
182 print "^You hear a low grinding noise. \
183 The hallway underfoot suddenly shifts and drops!^";
184          }
185    ],
186    s_to GROC_hall2,
187    before [;
188       Jump:  "You jump for a bit. The floor feels strangely \
189 unsteady.";
190    ],
191    has light;
192
193
194 Object GROC_hall2 "South end of Hallway"
195    with name "end" "hallway",
196         number 3,
197         description [;
198           print "You're at the south end of a short N-S hall \
199 that seems to lead nowhere. The hallway";
200  switch (GROC_hall2.number) {
201  1: "  slopes sharply upwards to the north.";
202  2: "  travels evenly to the north.";
203  3: "  slopes sharply downwards to the north.";
204  }
205  ],
206    after [ i ;
207       Go:
208          if (noun == s_obj) {
209             i = CheckHall();
210             if (i == 1)
211 print "^You hear a low grinding noise. \
212 The hallway underfoot suddenly shifts and drops!^";
213          }
214    ],
215    before [;
216       Jump:  "You jump for a bit. The floor feels strangely \
217 unsteady.";
218    ],
219    n_to GROC_hall1,
220    has light;
221
222 ! (Routine for checking 'weights' of two sides of hallway)
223 ! (assumes called from room's _after_ routine, thus all
224 ! barrels and players are in their after_turn places)
225 ! RETURNS: 0 if no change
226 !          1 if NORTH END now higher than before
227 !          2 if NORTH END now lower than before
228 [ CheckHall
229     i ! local total of weight points for north end
230     j ! local total of weight points for south end
231     k ! local -- orig setting of north end (.number)
232     ;
233   i = 0;  j = 0;
234   k = GROC_hall1.number;
235   if (player in GROC_hall1) 
236      i = i + 2;
237   if (player in GROC_hall2) 
238      j = j + 2;
239   if (BARREL1 in GROC_hall1) i = i + 1;
240   if (BARREL1 in GROC_hall2) j = j + 1;
241   if (BARREL2 in GROC_hall1) i = i + 1;
242   if (BARREL2 in GROC_hall2) j = j + 1;
243   if (BARREL3 in GROC_hall1) i = i + 1;
244   if (BARREL3 in GROC_hall2) j = j + 1;
245   if (i == j) {
246      GROC_hall1.number = 2;
247      GROC_hall2.number = 2;
248   }
249   if (i > j) {
250      GROC_hall1.number = 1;
251      GROC_hall2.number = 3;
252   }
253   if (i < j) {
254      GROC_hall1.number = 3;
255      GROC_hall2.number = 1;
256   }
257   if (GROC_hall1.number == k)
258      return 0;
259   if (GROC_hall1.number > k)
260      return 1;
261   if (GROC_hall1.number < k)
262      return 2;
263 ];  
264
265
266 Object GROC_stockroom "Stockroom" 
267     with description [; 
268 print "This is a tiny poorly lit room, that \
269 is covered in dust. An exit south leads to a"; 
270 if (GROC_hall1.number == 2) print " short hallway"; 
271 else print " dark hole"; 
272 if (GROC_attic has general) 
273    print ". Above, a hole has been exposed in the ceiling structure"; 
274 "."; 
275      ],  
276       name "dust", 
277       u_to [; if (GROC_attic hasnt general)
278 "You can't go that way.";
279            else return GROC_attic;
280         ],
281         s_to [;
282 if (GROC_hall1.number == 2) return GROC_hall1;
283 else 
284    "You pull back before falling into what appears to be a deep \
285 pit of some sort beyond the south exit."; 
286         ],
287    after [ i ;
288       Go:
289          if (noun == n_obj) {
290             i = CheckHall();
291             if (i == 2 or 1)
292                print "You hear a low grinding noise behind you.^";
293          }
294    ],
295         has light;
296
297 Object GROC_attic "Attic"
298    with description [;
299 print "This is an exceptionally cramped attic, obviously \
300 unused for some time. The floorboards are starting to crack.";
301 if (self has general)
302    print " One section of the floor is particularly poor, and has \
303 a gaping hole leading downwards into darkness.";
304 " An exit heads south.";
305         ],       
306         name "sag" "crack" "hole",
307         d_to [;
308            if (GROC_attic hasnt general)
309 "You can't go that way.";
310            else return GROC_stockroom;
311         ],
312         s_to [;
313 if (GROC_hall1.number == 3) return GROC_hall1;
314 else 
315    "You pull back at the edge of the exit. The floor, it \
316 appears, is too far below you!";
317         ],
318    after [ i ;
319       Go:
320          if (noun == n_obj) {
321             i = CheckHall();
322             if (i == 2)
323                print "You hear a low grinding noise behind you.^";
324          }
325    ],
326         has light;
327
328 Object attic_floorboards "floorboards" GROC_attic
329    with name "boards" "floorboards",
330         description [;
331 print "Some badly rotting floorboards";
332 if (GROC_attic has general)
333    " with a noticeable hole in one section.";
334 else {
335    if (self has general)
336       " with a noticeable sag in one section.";
337    else ".";
338 }
339         ],
340    before [;
341      Take: "They're nailed into the floor.";
342      Push, Pull, Attack, Shake:
343 if (self has general)
344    "The floor shakes a bit, but nothing else happens.";
345 else {
346    move loose_board to GROC_stockroom;
347    give self general;
348    "The floor shakes under your abuse, and suddenly, a \
349 portion in the middle sags considerably! But nothing else \
350 happens.";
351 }
352    ],     
353    has scenery;
354
355 Object loose_board "loose board"
356    with name "loose" "board",
357         initial "You notice a loose board, partially \
358 broken, hanging from the ceiling structure.",
359         description "A portion of the ceiling boards \
360 has apparently broken loose.",
361         before [;
362            Pull, Attack, Shake:
363 give GROC_attic general;
364 remove self;
365 "You give the board a good couple of yanks. The board \
366 soon breaks off, taking a small portion of the ceiling \
367 with it! After the dust settles, you notice the rather \
368 poor remodeling job you've done to the ceiling.";
369         ], 
370 has static;
371
372
373 ! (the coffee was moved to the cafe in Borphee)
374 Object decaf_coffee_can "can of decaf coffee" 
375    with name "can" "coffee" "decaf",
376         description "The can reads: ~Frobozz coffee crystals~^^\
377                     ~Rich, mountain-grown flavor.~^^DECAFFEINATED.",
378         before [;
379            Open:
380             "You'd need a good can-opener for that.";
381         ],
382         size 15,
383 ;
384    
385 Object icebox_key "square key" GROC_attic
386    with name "key" "square",
387    size 5,
388 ;   
389    
390    
391 Object icebox "icebox" GROC_stockroom
392    with name "icebox" "box",
393         description "A rather old-looking icebox.",
394         capacity 10,
395         size 20,
396         with_key icebox_key,
397         when_closed "A dust-covered icebox stands closed against \
398 the northern wall.",
399         when_open [ x;
400          print "The icebox is open. ";
401          x = children(self);
402          if (x == 0) "It is also empty.";
403          print "Inside ";
404          if (x == 1) print "is: "; else print "are: ^";
405          x = FULLINV_BIT + INDENT_BIT + NEWLINE_BIT + RECURSE_BIT;
406          WriteListFrom (child(self), x, 1); 
407          rtrue;
408        ],
409    has static container openable lockable locked;
410
411 Object cerealbox1 "blue cereal box" icebox
412    with name "box" "blue" "Crunchies",
413         description "A blue paper box with lettering that reads:^^\
414                     ~Grueslayer Crunchies!^^\
415                     (It's not just for adventurers anymore!)^^\
416                     [Free bonus scroll surprise inside!]~^^\
417                     Writing on the box reads ~50zm~.",
418         size 10, capacity 5,
419         before [;
420            Receive:
421               if (noun == cerealbox2 or cerealbox3) {
422                  "That doesn't quite fit.";
423               }
424            Cast:
425               if (the_spell_was == zemdor_spell) {
426                  if (self hasnt general) {
427                     give self general;
428                     move cerealbox2 to parent(cerealbox1);
429                     move cerealbox3 to parent(cerealbox1);
430                     Achieved(1);
431                     "The box of cereal suddenly seems to dance with magic! \
432                     Before your very eyes, the box suddenly splits into \
433                     three boxes! The magic fades, but the boxes remain.";
434                  }
435                  else
436                     "The magic fights against the cereal box, but fails. \
437                     I guess you can only triplicate once.";
438               }
439         ],                            
440    has container openable;
441    
442 Object cerealbox2 "navy-blue cereal box"
443    with name "box" "navy-blue" "Sugarglobs",
444         description "A navy-blue paper box with lettering that reads:^^\
445                     ~Frobozz Super Sugar Globs!^^\
446                     (Seventeen times the sugar of any other cereal!)^^\
447                     [Free bonus Frobozz toy inside!]~^^\
448                     Writing on the box reads ~50zm~.",
449         !weight 10,
450         size 10, capacity 5,
451         before [;
452            Receive:
453               if (noun == cerealbox1 or cerealbox3) {
454                  "That doesn't quite fit.";
455               }
456         ],        
457    has container openable;
458
459 Object cerealbox3 "royal-blue cereal box"
460    with name "box" "royal-blue" "Dornflakes",
461         description "A royal-blue paper box with lettering that reads:^^\
462                     ~Dornflakes^^\
463                     (Just like Grandma Dimwit used to make!)^^\
464                     [Free bonus Frobozz toy inside!]~^^\
465                     Writing on the box reads ~50zm~.",
466         !weight 10,
467         size 10, capacity 5,
468         before [;
469            Receive:
470               if (noun == cerealbox1 or cerealbox2) {
471                  "That doesn't quite fit.";
472               }
473         ],        
474    has container openable;
475       
476 ! A Breakfast cereal class -- what a concept   
477 Class cereal_class   
478    with name "cereal",
479         description "A quantity of overly-sweetened breakfast cereal.",
480         !weight 5,
481         size 8,
482         before [;
483            Eat:  
484               remove self;
485               "You consume the cereal. The sugar rush occurs five seconds \
486               later and ends just as quickly.";
487         ],
488    has edible;
489    
490 Object cereal1 "crunchy cereal" cerealbox1
491    class cereal_class
492    with name "crunchy";      
493 Object cereal2 "sugary cereal" cerealbox2
494    class cereal_class
495    with name "sugary";      
496 Object cereal3 "flaky cereal" cerealbox3
497    class cereal_class
498    with name "flaky";   
499    
500 Object baking_powder "packet of baking powder" icebox
501    with name "powder" "baking" "packet",
502         short_name "packet of baking powder",
503         description "A single-use packet of baking powder from \
504 ~Port Foozle Bakers Guild~ products.",
505         !weight 5,
506         size 5,
507         before [;
508            Eat:
509              remove self;
510              "You eat the baking powder. Yuck.";
511         ],
512    has edible;
513
514 Object butter "stick of butter" icebox
515    with name "butter" "stick" "fat",
516         description "A good-sized stick of butter.",
517         !weight 5,
518         size 5,
519         before [;
520            Eat:
521              remove self;
522              print "You eat the entire stick of butter.";
523              if (random(20) < 15)
524 " Your heart will no doubt thank you for that someday.";
525              deadflag = 1;
526              " The sudden \
527 intake of concentrated fat is too much of a shock to your \
528 system, and an important artery somewhere bursts.";
529         ],
530    has edible;
531
532 Object FROSTHAM_Resort "Ski Resort"
533    with description "You are inside a large ski resort. Perhaps \
534                     it's not ski-season, as the entire place is \
535                     basically empty. Frostham city lies to the \
536                     east.",
537         name "resort" "city" "ski" "skis" "earmuff" "earmuffs",
538         e_to FROSTHAM_2,
539         out_to FROSTHAM_2,
540         w_to "You don't have a lift-ticket. Also, you don't have \
541              skis. Most importantly, however, the slopes look \
542              pretty lousy.",
543    has light;
544
545 Object FROSTHAM_Governer1 "Governor's House, Waiting Room"
546    with description "You are in a waiting room in the house of the Frostham \
547                     Governor. The carpet is surprisingly plush. \
548                     The walls have been painted a rather bland \
549                     peach-like color. The furnishings \
550                     are also colored peach, which complements the \
551                     walls without being too nouveau. The way out \
552                     is to the northeast.",
553         name "carpet" "furnishings",
554         ne_to FROSTHAM_2,
555         out_to FROSTHAM_2,
556         s_to Gov_door,
557         after [;
558            Go:
559               if (noun==n_obj) {
560                  give Gov_door ~open locked;
561                  print "You hear the door slam and lock behind you.^";
562               }
563         ],
564    has light;
565
566 Object Gov_couch "couch" FROSTHAM_Governer1 
567    with name "couch" "peach",
568         initial "A comfortable-looking peach-colored couch is here.",
569         description "It looks pretty comfy, but the color wouldn't \
570 have been your first choice.",
571         before [;
572            Search:
573               if (self hasnt general) {
574                  give self general;
575                  move c1 to FROSTHAM_Governer1;
576                  "You rummage through the cushions and a coin falls out!";
577               }
578               "You find nothing of interest.";
579         ],
580    has static enterable supporter;
581
582 Object travel_posters "travel brochure" FROSTHAM_Governer1
583    with name "brochure" "travel",
584         description "The brochure has pictures of various cheerful-looking \
585                      people in rather cheerful-looking places. \
586                      Bold lettering reads ~FEEL BETTER IN MIZNIA~, \
587                      ~IT'S ARAGAIN, AGAIN~, \
588                      and ~NEW BORPHEE, EVERYONE'S FAVORITE CITY~",
589         size 10,
590    ;
591
592 Object c1 "coin" class coin_class;
593
594 Object Gov_desk1 "desk" FROSTHAM_Governer1
595    with name "desk" "waiting" "room",
596         description "A fairly plain-looking desk",
597    has scenery supporter;
598
599 Object Gov_ledger "ledger" Gov_desk1
600    with name "ledger",
601         description [;
602            if (receptionist in FROSTHAM_Governer1) 
603               "The receptionist seems to be using it at the moment.";
604            "The ledger reads:^^\
605            ~ -- New signed petition for presentation and coronation of \
606 new King delivered to Aragain Magistrate, awaiting word of \
607 event schedule.~^^That's all. I guess the governor hasn't been \
608 very busy as of late.";
609         ],
610         !weight 20,
611         size 15,
612         before [;
613            Take: 
614               if (receptionist in FROSTHAM_Governer1) 
615                  "The receptionist gives you a rather menacing look.";
616         ],
617 ;
618
619
620 Object alarm_clock "alarm clock" Gov_desk1
621    with name "clock" "alarm",
622         description [; 
623 print "A small round desk-clock, with a set of bells \
624 on the top, and a small pull-knob on the back. \
625 Strangely, the clock seems to be stopped. Two hands, black and golden, \
626 are sitting at ",alarm_clock.number," and ",
627 alarm_clock_dial.number;
628         " respectively.";
629                      ],
630         article "an",
631         number 9,   ! setting of the clock hand
632         time_left 0,
633         time_out [ x ;
634            alarm_clock.number = alarm_clock.number + 1;
635            if (alarm_clock.number > 12) alarm_clock.number = 1;
636            x = TestScope(alarm_clock,player);
637            if (x==1) print "^The alarm clock suddenly makes an \
638 awful grinding noise";
639            if (alarm_clock.number == alarm_clock_dial.number) {
640               ! alarm goes off
641               if (x==1) print ", followed by a ear-splitting clang!^";
642               ! certain events follow:
643               ! if receptionist still in office and self in office,
644               ! receptionist leaves (if player in office, he'll
645               ! see this, or see it outside the office)
646               if ((receptionist in FROSTHAM_Governer1) &&
647           (((self in FROSTHAM_Governer1) || (self in Gov_desk1)) ||
648            ((self in player) && (player in FROSTHAM_Governer1))) ) {
649                  remove receptionist;  ! a long lunch hour, apparently...
650                  ! give alarm_clock general;
651                  Achieved(2);
652                  if (player in FROSTHAM_Governer1) 
653                     "^The receptionist suddenly jumps from her \
654 seat and rushes out of the room, screaming ~Lunchtime!~";
655                  if (player in FROSTHAM_2)
656                     "^You see a woman rush out of the building \
657 to the southwest, and quickly vanish.";
658                  rtrue;
659               }
660               ! future: boutique in Miznia -- brings salesman to front
661               if (((self in MIZNIA_Boutique) || (self in player)) && 
662                    (player in MIZNIA_Boutique)) {
663                    print "^From somewhere in the back of the \
664 store, a tailor rushes out and";
665                    if (MIZNIA_Boutique hasnt general) {
666                       give MIZNIA_Boutique general;
667                       move fancy_scroll to player;
668                       Achieved(23);
669 " sees you. ~We've got a rather \
670 busy schedule,~ he explains, ~but let me see what I can do.~  \
671 He gives you a somewhat unapproving look. ~The ascetic-monk \
672 look is out, you know. Here.~ He pins a rolled paper object \
673 to your clothes. ~The latest craze -- wearing magic scrolls. \
674 Beats using them nowadays, I hear. Now, like I said, we're \
675 very busy.~ He goes off to the back of the store."; 
676                    }
677                    else 
678 " recognizes you. \
679 ~I've done all I can for you right now,~ he explains as \
680 goes off to the back of the store."; 
681               }
682               rtrue;
683            }
684            else if (x==1) "!";
685         ],
686         size 5,
687         add_to_scope alarm_clock_dial alarm_clock_bells alarm_clock_hands,
688    has transparent;
689
690 Object alarm_clock_dial "knob" 
691    with name "pull" "knob",
692         description "A small, pullable knob on the back of the clock.",
693         number 12,
694         before [;
695            Push:
696               print "The knob ";
697               if (self has general) {
698                  give self ~general;
699                  "pushes in a short bit.";
700               }
701               else "is as far in as it can go.";
702            Pull:
703               print "The knob ";
704               if (self hasnt general) {
705                  give self general;
706                  "pulls out a short bit.";
707               }
708               else "is as far out as it can go.";
709            Turn:
710               if (self hasnt general) {
711                  ! wind clock
712                  StartTimer(alarm_clock,1); 
713                  "The knob turns -- barely. You \
714 hear a small clicking noise as well.";
715               }
716               else {
717                  ! set alarm hand
718                  alarm_clock_dial.number = alarm_clock_dial.number + 1;
719                  if (alarm_clock_dial.number > 12)
720                     alarm_clock_dial.number = 1;
721                  print "The knob turns easily. You notice the \
722 golden hand on the front sweep to ",alarm_clock_dial.number;
723                  ".";
724               }
725             !  if (alarm_clock hasnt general) {
726             !  }
727             !  "It doesn't turn anymore.  I guess the receptionist \
728             !  broke the clock (not that it was in good shape to \
729             !  begin with).";
730        ],
731    has static;
732
733 Object alarm_clock_hands "hands"
734    with name "hand" "hands"
735    has static;
736
737 Object alarm_clock_bells "bells"
738    with name "bell" "bells"
739    has static;
740
741 Object FROSTHAM_Governer2 "Governor's Office"
742    with description "You are in a rather spacious office. The \
743 carpeting is quite plush, and all the furnishings seem \
744 excessively lavish.",
745         name "carpeting" "furnishings", 
746         n_to Gov_door,
747    has light;
748
749 Object Gov_desk2 "desk" FROSTHAM_Governer2
750    with name "desk" "office",
751         description "A fairly impressive looking desk, made from \
752                     a massive lacquered piece of black oak wood.",
753         before [;
754           Cast:
755            if (the_spell_was == egdelp_spell)
756               "The desk is covered with a ugly waxy film. \
757 The governor looks extremely annoyed and wipes the desk clean with \
758 a stack of papers.";
759           Push, Pull, Rub, Attack, Search:
760               "~Do you mind?~ the governor says.";
761         ],
762    has scenery supporter;
763
764 Object Gov_door "door" 
765    with name "door" "office",
766         when_closed [;
767              print "There's a closed door to the ";
768              if (self in FROSTHAM_Governer1) 
769                    "south.";
770              else "north.";
771         ],
772         when_open [;
773              print "There's an open door to the ";
774              if (self in FROSTHAM_Governer1) 
775                    "south.";
776              else "north.";
777         ],
778         description "It's just a thick door.",
779         door_dir [ ; if (location==FROSTHAM_Governer1) return s_to;
780                     return n_to;
781                  ],
782         door_to [ ; if (location==FROSTHAM_Governer1)
783                       return FROSTHAM_Governer2;
784                    return FROSTHAM_Governer1;
785                 ],
786         before [ ;
787            Open:
788               if ((location==FROSTHAM_Governer1) &&
789                   (receptionist in FROSTHAM_Governer1))
790               "The receptionist puts a hand in your way and says, \
791                ~The governor is currently busy.~";
792            Close:
793               if (location==FROSTHAM_Governer2)
794                  "~Close it on your way _out_~, the governor snarls.";
795         ],
796         found_in FROSTHAM_Governer1 FROSTHAM_Governer2,
797    has static door openable lockable;
798
799 Object FROSTHAM_GUSStop "Subway Entrance"
800    with description "You're near the southern end of the city. \
801                      The rest of the city lies to the north. \
802                      There's also a rather conspicuous \
803                      stairway down here.",
804         name "stairway",
805         n_to FROSTHAM_2,
806         u_to "You can't go that way.",
807         d_to FROSTHAM_GUSStation,
808         cant_go "You walk around the local streets a bit, finding \  
809                  nothing of interest.",
810    has light; 
811
812             
813 ! ******************************************************************
814 ! People/Creatures
815 ! ******************************************************************
816
817 Object ski_instructor "ski instructor" FROSTHAM_Resort
818    with name "instructor" "dude" "skier" "guy" "tall" "lanky",
819         initial [;
820            print "A tall lanky guy is here, holding two colorful \
821 skis. He seems to be ";
822            if (waxy_scroll in self)
823                "waxing them with a scroll.";
824             "concentrating greatly on waxing \
825             his skis."; 
826         ],
827         description "A tall lanky guy, like I said. He's \
828             decked out in fancy bright winter clothes.",
829         life [;
830            Attack, ThrowAt:
831               "~Dude, you must chill.~";
832            Answer, Tell:
833              if (special_word == 'hello' or 'hi')
834                 "The skier gives you the 'thumbs-up' sign. \
835 ~Hey, dude.~";
836              else "~Uh, whatever, dude.~";
837            Show:
838              if (noun==rag)
839                 "~Hey dude, can I borrow that?~";
840              "~Uh, whatever, dude.~";
841            Order:
842              if (action==##Give) {
843              if (noun=='skis')
844                 "~No way, dude.~";
845              if (((noun==waxy_scroll) && (self hasnt general)) ||
846                  ((noun==rag) && (self has general)))
847                 "~I'm using it, dude.~";
848              }
849              "~Dude, I have no idea what you're talking about.~";
850            Ask: 
851              if (second=='rag')
852                 "~A rag makes an excellent ski-maintenance accessory, dude.~";
853              if ((second=='scroll' or 'waxy') && (self hasnt general))
854                 "~Something I found at the top of a run. \
855                  Doesn't work too well, but hey, I gotta wax.~";
856              if (second=='skis') 
857                 "~My rad Grayslopes Slaloms. If you don't wax 'em \
858                  every 30 seconds, they lose their speed.~";  
859              if ((second=='slopes') || (second=='slope') ||
860                  (second=='powder') || (second=='runs') ||
861                  (second=='skiing'))
862                 "The skier takes you aside. ~Listen dude, \
863                 between you and me, the slopes here rot. They \
864                 used to be way better. But you know, I hear there \
865                 are some _killer_ drops up north.~";
866              "~Dude, I have no idea what you're talking about.~";
867            Give:
868              if (noun==rag) {
869                 move waxy_scroll to FROSTHAM_Resort;
870                 move rag to self;
871                 give self general;
872                 Achieved(3);
873                 "The skier gladly takes the rag and starts \
874                 polishing immediately. He lets the scroll \
875                 fall to the ground. ~Excellent man, thanks!~";
876              }
877              "~No thanks, dude.~";
878            default: "At the moment, the skier is too busy waxing.";
879         ],
880         each_turn [;
881             if (waxy_scroll notin self && self hasnt general) {
882                 Achieved(3);
883                 remove self;
884                 "^~Dude, like, that scroll thing just \
885 vanished! What a cosmic experience!~ On that note, \
886 the skier opts to head for the slopes, and leaves to the west.";
887             }
888             if (random(20) < 5)
889                "^The skier polishes a spot on his skis.";
890         ], 
891         before [;
892            Cast:
893               if (the_spell_was == foblub_spell or espnis_spell)
894                  "A pair of fluffy earmuffs the skier is wearing \
895 prevents him from hearing the full impact of your sermon.";
896         ],
897    has animate transparent;
898
899 Object receptionist "receptionist" FROSTHAM_Governer1
900    with name "receptionist",
901         initial "A receptionist sits behind a desk, engrossed in \
902                 the ledger.",
903         description "A gruff-looking lady who apparently is far \
904                 more interested in her work than you.",
905         each_turn [;
906            if (receptionist hasnt general) {
907               give receptionist general;
908               "^Without even looking up, the receptionist says, \
909               ~The governor is busy right now.~";
910            }
911            if (random(10) == 1)
912               "^The receptionist turns a page in the ledger.";
913         ],
914         life [;
915            Answer, Order:
916               print "The receptionist";
917               if (special_word=='hello')
918                  ", without looking up, says \
919                  ~Can I help you?~.";
920               " seems to be ignoring you.";
921            Ask:
922               print "The receptionist";
923               if (second=='governor')
924                  ", without looking up, says \
925                  ~He's very busy right now.~.";
926               " shrugs.";
927            default:
928               "The receptionist seems to be ignoring you.";
929         ],   
930         react_before [;
931            Cast: 
932 "The receptionist, in a rather shrill voice says, \
933 ~If you're gonna wait, do it quietly,~ disrupting your chant.";
934            Blow:
935 if (noun==whistle)
936 "You make an unusually high-pitched noise. The receptionist, \
937 in a rather shrill voice says, \
938 ~If you're gonna wait, do it quietly.~";
939            Sneeze:
940 "~If you want to spread germs, do it outside.~";
941            Yell:
942 "~If you're gonna wait, do it quietly.~";
943            Sing:
944 "~We're not holding auditions, you know.~";
945         ],
946    has animate female;
947
948 Object governor "governor" FROSTHAM_Governer2
949    with name "governor" "gov",
950         initial "The governor of Frostham is sitting behind a \
951                  desk here, trying to look busy.",
952         description "A sour-looking man who tries his best not \
953                  to notice you.",
954         each_turn [ i ;
955            if (governor hasnt general) {
956               give governor general;
957               move c2 to player;
958               "^The governor scowls as you enter. ~What do you want?~ \
959                he says, and doesn't wait for a response. ~Oh, I know. \
960                More complaints about the snow, I suppose? Well \
961                look, I didn't ask for this job. Do you want it? I \
962                didn't think so.~ He shoves something into your hand. \
963                ~Here, buy yourself a cup of coffee, and stop \
964                bothering me.~";
965            }
966            i = random(4);
967            print "^The governor ";
968            if (i == 1) 
969               "thumbs through some papers.";
970            if (i==2)
971               "balances a pencil on his nose.";
972            if (i==3)
973               "scribbles something meaningless.";
974            if (i==4)
975               "looks up and notices you. ~Don't you \
976               have anything else to do?~ he says.";
977         ],
978         life [;
979            Ask:
980               if (second=='key' or 'shiny') {
981                  print "~Some key an important visitor \
982 forgot while visiting. Probably useless now";
983                  if (parent(cab_key) == player)
984                     print ". You can keep it, for all I care";
985                  ".~";
986               }
987               if (second=='receptionist')
988                  "~I think she's out to lunch,~ he says, \
989 with obvious annoyance.";
990               if (second=='magistrate' or 'king' or 'sydney')
991                  "He looks at you suspiciously. \
992 ~Never heard of him,~ he says.";
993               if (second=='ledger')
994                  "~I think my receptionist has it.~";
995               if (second=='pencil')
996                  "~Please! I'm a very busy man!~";
997               "~Sorry, that's not my problem. Now run along.~";
998            Kiss:
999               "The governor brushes you off. ~Are you \
1000 planning on running for office or something?~";
1001            Attack, ThrowAt:
1002               deadflag = 1;
1003               "As you make a threatening move, the governor \
1004 presses some unseen switch behind his desk. Before you \
1005 know it, a hidden trapdoor opens in the floor and you \
1006 plunge to your death. A good politician is always \
1007 prepared, it seems...";
1008            Tell:
1009               "~Sure, sure. Scram, will you?~";
1010            Answer, Order:
1011               if (special_word=='hello')
1012                  "~Yeah, sure. So what's your problem?~";
1013               "The governor is busy trying to look busy.";
1014            Give:
1015               "Bribing a politician, eh?";
1016            Show:
1017               if (noun==Gov_ledger)
1018                  "~Hey, return that to the receptionist!~"; 
1019               "~Please! I'm a very busy man!~";
1020         ],
1021         react_after [;
1022            Take:
1023               if (noun == cab_key)
1024                  "~Oh sure, just go ahead and take things \
1025 from my office. See if I care.~";
1026         ],
1027         before [;
1028            Cast:
1029              if (the_spell_was == foblub_spell)
1030                 "Actually, the governor seems pretty glued to his \
1031 seat already. In any event, nothing seems to happen.";
1032              if (the_spell_was == espnis_spell)
1033                 "The governor seems to nod off, but only for \
1034 a second.";
1035         ],
1036    has animate transparent;
1037
1038
1039 ! ***************
1040 ! More objects...
1041 ! ***************
1042
1043 Object pencil "pencil" governor
1044    with name "pencil";
1045
1046 Object c2 "coin" class coin_class;
1047
1048 ! (cereal box prizes)
1049 Object whistle "whistle" cerealbox2
1050    with name "whistle",
1051         description "A tiny plastic whistle.",
1052         !weight 1,
1053         size 1,
1054         before [;
1055            Blow: 
1056               "You make an unusually high-pitched noise.";
1057         ],
1058 ;
1059 ! (a fancier packaged prize :)
1060 Object plastic_wrapper "plastic wrapper" cerealbox3
1061    with name "wrapper" "plastic",
1062         description "A small plastic see-through package.",
1063         before [;
1064            Open:
1065               while (child(self)~=0) move child(self) to parent(self);
1066               remove plastic_wrapper;
1067               "The wrapper rips open with ease, and disintegrates, \
1068               leaving the contents behind.";
1069         ],
1070         !weight 0,
1071         size 5,
1072    has container openable transparent;
1073    
1074 Object toy_volcano "toy volcano" plastic_wrapper
1075    with name "toy" "volcano",
1076         description "A strange thing indeed -- a miniature \
1077               ceramic toy, that has been painted and shaped \
1078               in painstaking detail to look like a volcano.",
1079         !weight 5,
1080         size 5,
1081 ;
1082
1083 Object volcano_note "instruction notice" plastic_wrapper
1084    with name "notice" "instruction",
1085         article "an",
1086         description "~Frobozz Instant Volcano~^^\
1087         (parental supervision recommended)^^\
1088         To use:  Just add a good quantity of water! We suggest \
1089         a very large safety radius.~",
1090         size 5,
1091 ;
1092         
1093
1094
1095 ! ******************
1096 ! Scrolls and spells
1097 ! ******************
1098
1099 Object waxy_scroll "waxy scroll" ski_instructor
1100    class scroll_class,
1101    with name "waxy",
1102 ;
1103
1104 Object egdelp_spell "create waxy build-up on wood" waxy_scroll
1105    class spell_class,
1106    with name "egdelp",
1107         magic [;
1108            if (second ~= 0 && second ~= player) {
1109            CDefArt(second); " looks pretty polished as is."; }
1110            else { "The chant, seeking wood to polish, fails."; }
1111         ],
1112 ;
1113
1114 Object sugar_scroll "sugar-coated scroll" cerealbox1
1115    class scroll_class,
1116    with name "sugar-coated" "coated",
1117 ;
1118
1119 Object zemdor_spell "triplicate object" sugar_scroll
1120    class spell_class,
1121    with name "zemdor",
1122         number 0,
1123         magic [;
1124            if (second == 0)
1125               "The chant, seeking a locus for \
1126 triplication, fails.";
1127            if (second has animate)
1128               "The chant, not designed for living creatures, fails.";
1129            if (second has is_spell)
1130 "This violates certain unwritten laws of magic.";
1131            if (second has is_coin) {
1132               ! new twist for zemdor, as sugg. by player
1133               print "The coin shimmers suddenly! You blink in \
1134                  disbelief as the coin seems to split \
1135                  into three copies of itself! ";
1136               if (self hasnt general) {
1137                  give self general;
1138                  move c12 to parent(second);
1139                  move c13 to parent(second);
1140                  "You notice there are now three coins where \
1141 there was once but one!";   
1142               }
1143               "Suddenly, a financial nymph appears! She gives \
1144 you a denunciatory look. ~Line 7234-6 of the Pierpont \
1145 tax laws clearly states that repeated unauthorized \
1146 triplication of monetary \
1147 items is strictly forbidden,~ she says, and takes the \
1148 the two newly created coins before disappearing.";
1149            }
1150            print (The) second, " shimmers suddenly! You blink in \
1151                  disbelief as ", (the) second, " seems to split \
1152                  into three copies of itself! ";
1153                  "But, as you finish the chant, \
1154                  the mystic energy seems to fade, and the copies \
1155                  coalesce back into one unchanged object. The \
1156 chant fails.";
1157         ],
1158 ;
1159
1160 Object c12 "coin" class coin_class;
1161 Object c13 "coin" class coin_class;
1162