Implement per-file license notices
[spiritwrak.git] / src / special.inf
1 ! *********************************************************************
2 ! SPECIAL.INF  -- Add-on for SPIRITWRAK
3 ! Contains: 'specials' that I wanted to keep separate from
4 ! the other 'city-based' .INF files (Atrii, NPC homes)
5 !
6 ! SPIRITWRAK is free software; you can redistribute it and/or modify
7 ! it under the terms of the GNU General Public License as published by
8 ! the Free Software Foundation; either version 3 of the License, or
9 ! (at your option) any later version.
10 !
11 ! SPIRITWRAK is distributed in the hope that it will be useful, but
12 ! WITHOUT ANY WARRANTY; without even the implied warranty of
13 ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 ! General Public License for more details.
15 !
16 ! You should have received a copy of the GNU General Public License
17 ! along with SPIRITWRAK. If not, see <https://www.gnu.org/licenses/>.
18 ! *********************************************************************
19
20 ! ----------------- (Frobar's home) -------------------------
21
22 Object FROBAR_Foyer "Entrance Foyer"
23    with description "You are in the Entrance Foyer of a \
24 small but tasteful home. The exit is to the southwest. \
25 The general area is tastefully done in maroon carpeting \
26 and brass fixtures. Another room lies to the north.",
27    name "maroon" "carpeting" "brass" "fixtures",
28    sw_to FROBAR_Ent,
29    out_to FROBAR_Ent,
30    n_to FROBAR_Parlor,
31    has light;
32    
33 Object FROBAR_Parlor "Parlor"
34    with description "You are in a very decorative parlor. \
35 Various furnishings of high quality are arranged around \
36 an enormous rug with intricate golden symbols in the weave \
37 design. Open doorways lead south, north, east and west.",
38    name "rug" "doorways" "furnishings" "symbols",
39    s_to FROBAR_Foyer,
40    n_to FROBAR_Bedroom,
41    e_to FROBAR_Study,
42    w_to FROBAR_Lounge,
43    has light;
44
45 Object frobar_plant "large potted plant" FROBAR_Parlor
46    with name "plant" "large" "potted",
47    initial "A large potted plant sits in one corner.",
48    description "A well-tended house-plant.",
49    before [;
50       Cast:
51          if (the_spell_was == throck_spell) {
52             "The plant seems even healthier now.";   
53 !            if (Frobar in FROBAR_Bedroom) 
54 ! (couldn't think of a proper reaction...:)
55          }
56    ],        
57    has static;
58                     
59 Object FROBAR_Lounge "Lounge"
60    with description "A large room here apparently serves as a lounge \
61 for entertaining. The walls and furniture all have interesting \
62 design work that gives an impression of dignified age. A doorway \
63 heads east.",
64    name "furniture" "doorway",
65    e_to FROBAR_Parlor,
66    has light;
67    
68 Object FROBAR_Study "Study"
69    with description "This is a study room with fancy wood paneling and \
70 plush carpeting. There is an exit to the west.",
71    name "wood" "paneling" "carpeting",
72    w_to FROBAR_Parlor,
73    has light;
74
75 Nearby FROBAR_shelves "large bookshelf"
76    with name "shelves" "shelf" "bookshelf",
77         initial "A large bookshelf takes up most of the north wall.",
78         description "It's filled with odds and ends, mostly uninteresting.",
79         capacity 30,
80    has static supporter;
81
82 Object FROBAR_Journal "plain journal" FROBAR_shelves
83    with name "journal" "plain",
84    ! weight 15, 
85    size 15,
86    description "This is a short journal of notes that \
87 Frobar was keeping. The contents are quite dull, mostly \
88 consisting of entries like ~Remember to water plant~ and \
89 so forth. In fact, the only non-trivial entry follows:^^\
90 ~Perhaps today I will go visit Barsap's latest creation. \
91 Then again, maybe I won't. This so-called 'Gambit' of his \
92 is supposed to be some silly diversion where people can \
93 hop around floating platforms trying to reach the southeast \
94 corner \
95 platform on the bottom level, just so they can get \
96 teleported back to the top, and start all over again! \
97 Can this be a monetarily beneficial thing? I doubt it.~";
98
99 ! (twisted -- four ancient ones)
100 Object p5 "twisted parchment" FROBAR_shelves
101    class parchment_class,
102    with name "twisted",
103 description "~...understand. I, like many of the Order, \
104 have understood that the greatest Saints of our Order were \
105 the Three, those Three that we know as the Ancient Ones. \
106 Why then, do I find in ancient cairns, in hidden temples, \
107 and in versions of the Scriptures found in unsettled lands, \
108 that _four_ beings that called themselves the Ancient Ones \
109 did do battle with evil and were defeated? This surely is \
110 not to be believed, but I...~";
111
112 Object FROBAR_Desk "large wood desk" FROBAR_Study
113    with name "desk",
114         description "A massive wood desk carved from a single block of wood.",
115         capacity 20,
116    has static supporter;
117    
118 Object FROBAR_Bedroom "Bedroom"
119    with description "A nice cozy bedroom. The exit is south.",
120    s_to FROBAR_Parlor,
121    has light;
122    
123 Object FROBAR_bed "large bed" FROBAR_Bedroom
124    with name "bed",
125         description "A large comfortable-looking bed.",
126         before [;
127            LookUnder: "Sorry, no monsters here.";
128         ],
129    has static enterable supporter;
130    
131 !Object FROBAR_Painting "large painting" FROBAR_Bedroom
132 !   with name "painting",
133 !        initial "There is a large painting hanging on the wall.",
134 !        description [;
135 !        if (self hasnt general)
136 !        "It appears to be an oil painting of a \
137 !        scroll on a table.  A small note on the frame says, \
138 !        ~Still-life with Scroll, -FF, 791~";
139 !        else
140 !        "It appears to be an oil painting of a \
141 !        table.  A small note on the frame says, \
142 !        ~Still-life, -FF, 791~";
143 !        ],
144 !        before [;
145 !           Touch, Rub, Push:
146 !              if (self hasnt general) {
147 !                 give self general;
148 !                 move painted_scroll to player;
149 !                 Achieved(23);
150 !                 print "As you touch the painting, your hands \
151 !run across the scroll, and the oil takes on a three-dimensional \
152 !quality!  You ignore the strange sensations as you reach \
153 !into the painting, and withdraw the scroll";
154 !                 if (Frobar in FROBAR_Bedroom) 
155 !                    "!  Frobar watches the events over your \
156 !shoulder, and seems puzzled.  ~Now, why didn't I ever think to try \
157 !that,~ he muses.";
158 !                 else "!";
159 !              }
160 !              else 
161 !                 "The painting seems to be nothing more than \
162 !an oil painting now.";
163 !        ],
164 !   has static;
165
166 ! ----------------- (Thief's home) -------------------------
167    
168 Object THIEF_Bottom_of_staircase "Wondrous Stairway"
169    with description "An enormous spiral staircase seems to wind miles \
170 above your head in this curious column-like chamber. Strange \
171 points of light brighten the chamber from above. \
172 To the west is a small exit.",
173    name "points" "light" "staircase" "stairway" "stairs",
174 ! TODO -- fix this weirdness...
175    u_to THIEF_Ent,
176    w_to "You can't go that way.",  ! but later...
177    before [;
178       Go: 
179          if (noun == u_obj)
180             print "^You begin the long trek upwards. Strangely, \
181             the stair seems to twist and move as you step on it, \
182             turning like a corkscrew, until you are \
183             graciously deposited at the top, far above your \
184             previous location.^";
185    ],
186    has light;
187          
188    
189 Object THIEF_Ent "Fancy Hall"
190    with description "This must be an apartment or penthouse in the \
191 skyscraper. You are in a very high hall, with black slate stone \
192 walls that seem to reflect shadows everywhere. There is a room \
193 to the north. The southern edge of this room drops off into the \
194 darkness, followed by a long spiral staircase. The ceiling overhead \
195 seems to have tiny points of light like a night sky.",
196      name "slate" "shadows" "staircase" "points" "light",
197      d_to THIEF_Bottom_of_staircase,
198      n_to THIEF_Foyer,
199    has light;
200
201 Object THIEF_Foyer "Magnificent Foyer"
202    with description "This is an exceptionally grand entrance foyer, \
203 with sweeping arched ceilings and sparkling chandeliers. The \
204 room is dimly lit. Open hallways lead south and west.",
205    name "chandeliers",
206    s_to THIEF_Ent,
207    w_to THIEF_Lounge,
208    has light;
209    
210 Object THIEF_Lounge "Fancy Lounge"
211    with description "A tastefully overdone lounge with tapestries \
212 and gold enamel finished walls. The room is dimly lit, although \
213 you see no windows or other sources of light. Open hallways lead \
214 east and west.",
215    name "tapestries" "enamel",
216    e_to THIEF_Foyer,
217    w_to THIEF_Storeroom,
218    has light;
219
220 Object THIEF_Journal "short journal" THIEF_Lounge
221    with name "journal",
222    initial "There's an open journal sitting here.",
223    ! weight 15, 
224    size 15,
225    description "This appears to be a short collection of notes:^^\
226    ~TIPS ON CRACKING THE NEW FROBOZZCO 3-DIAL COMBO LOCKS: ^\
227    Remember, there's a slight flaw in the design. For every \
228    correct number in the correct dial, pressing the opening button \
229    with cause a small click. Dials with the correct number in the \
230    wrong dial place will cause a small thunk. The lock mechanism \
231    scans for correct numbers in correct places first, and then \
232    for correct numbers in the wrong place in the 'remaining dials'. \
233    Simple! But don't forget, closing the locks will automatically \
234    lock and reset the dials!^^\
235    NEW FLATHEAD PAINTING: ^\
236    I've completed making the copy of the new Leonardo Flathead painting, \
237    received courtesy of the Royal Museum. Glad to say my skills in \
238    art forgery are undiminished -- I can barely tell the difference \
239    between the two myself! I'll soon replace the original with the \
240    copy, and no one will be the wiser!~";
241          
242
243 Object THIEF_Storeroom "Workroom"
244    with description [;
245       print "A sight to inspire even the most avaricious, this \
246        storeroom is filled with all sorts of rare and precious treasures. \
247        A hallway leads east";
248       if (self hasnt general)
249          print ". You notice that the west wall appears to be made of \
250 solid granite";
251       ".";
252    ],
253    name "hallway",
254    e_to THIEF_Lounge,
255    before [;
256       Examine:
257          if ((noun == w_obj) && (self hasnt general))
258             "The west wall is a solid piece of granite, which \
259 seems very odd, considering the other walls are clearly made of \
260 slate.";
261       Cast:
262          if ((the_spell_was==ledak_spell) && (Painting_FAKE in self)) {
263             if (Painting_REAL in self)
264                print "One of the paintings";
265             else print "The painting";
266             remove Painting_FAKE;
267             " is surrounded by a yellow glow! It crumbles into \
268 dust!";
269          }
270    ],
271    has light;   
272    
273 Nearby THIEF_treasure "precious treasures"
274    with name "treasure" "jewels" "gemstones" "artifacts",
275         description "Piles of rare gemstones, precious jewelry, \
276         priceless artifacts, and other treasures line the walls \
277         here.",
278         before [;
279            Take:
280            "Fortunately, your high moral standing allows you \
281            the benefit of having no need for such materials of excess.";
282         ],
283    has scenery;
284
285 Object pasta "pile of fettucini carbonari"
286    with name "pile" "fettucini" "carbonari" "pasta",
287         description "A large pile of fettucini dripping in \
288 carbonari sauce.",
289         before [;
290            Eat:
291               if (self hasnt general) {
292                  give self general;
293                  "You manage to stuff yourself with pasta, \
294 but there's still quite a lot left."; 
295               }
296               else 
297                  "You've already had enough of this stuff \
298 to last a lifetime. Just the thought of eating more is enough to \
299 make you queasy.";
300         ],
301         size 16,        
302    has edible;
303
304 Object c50 "coin" class coin_class;
305    
306 Object Painting_FAKE "priceless painting" THIEF_Storeroom
307    with name "painting",
308         plural "priceless paintings",
309         short_name "priceless painting",
310         description "It's a beautiful oil painting of a dark stormy \
311 scene. On the horizon, you can see the edges of mountaintops. Near \
312 the top of the painting, two winged figures are carrying a lone \
313 individual towards a break in the clouds, where a bright white light \
314 seems to emanate.",
315         ! weight 25, 
316         size 25,
317         before [;
318         Drop:
319             if (location == Museum_north) { ! player returned fake painting to museum! 
320                remove self;
321                "A museum curator appears and takes the \
322 painting. With an expert eye, he looks closely at it. ~This is \
323 a fake! I warn you sir, art forgery is a dangerous game.~ He \
324 leaves, much disgusted.";              
325             }
326         Take:
327             if (Painting_REAL in parent(self))
328                "They both look so genuine! You can't decide!";
329         Cast:
330             if (the_spell_was == ledak_spell) {
331                remove self;
332                "One of the paintings is surrounded by a bright \
333 yellow glow, and disintegrates!";
334             }
335         Search:
336                if (Painting_REAL in parent(self))
337                   "Search which one? Goodness, you can't decide!";
338         ],        
339         ;
340                    
341
342 ! -------------ETHEREAL PLANE OF ATRII ------------
343
344 Object ATRII_1 "Ethereal Plane of Atrii"
345    with description "Standing on a featureless gray plane that \
346    stretches to the infinite horizon against a gray sky, you \
347    can only conclude one thing -- you're on the Ethereal Plane \
348    of Atrii. Well, at least it fits the description Brother \
349    Palemon gave you. It seems like you could go in any \
350    direction from here.",
351    cant_go "An invisible force blocks your way!",
352    name "plane" "horizon" "sky",
353    sw_to ATRII_2,
354    se_to ATRII_3,
355    has light;
356    
357 Object ATRII_2 "Ethereal Plane of Atrii"
358    with description "Flat, featureless gray is in every direction \
359    you look. Stranger still is the upright rectangular hole in the \
360    fabric of space that stands in the center of this area. \
361    Otherwise, you could wander this gray dimension in any direction, \
362    it seems.",
363    cant_go "An invisible force blocks your way!",
364    ne_to ATRII_1,
365    sw_to ATRII_4,
366    e_to ATRII_3,
367    s_to ATRII_6,
368    has light;
369    
370 Nearby ATRII_2_hole "rectangular hole"
371    with name "hole" "rectangle" "opening",
372         description "Surely you are in a place where the very laws of \
373         nature and the Gods work by different rules! Here stands a \
374         rectangular hole, seemingly torn out of the very space you \
375         stand in. You see some curious metal chamber through the \
376         opening, but there is nothing behind the opening.",
377         before [;
378            Enter:
379               print "^You step through and feel your stomach twist. \
380               You stumble past a set of open metal doors into...^";
381               in_atrii = 0;
382               PlayerTo(Skyscraper);
383               return 2;  ! allow, but print nothing...
384         ],
385    has scenery enterable;
386    
387 Object ATRII_3 "Ethereal Plane of Atrii"
388    with description "Flat, featureless gray is in every direction \
389    you look. Stranger still is the flat, glass-like square in the \
390    center of the 'floor' of this area. \
391    Otherwise, you could wander this gray dimension in any direction, \
392    it seems.",
393    cant_go "An invisible force blocks your way!",
394    nw_to ATRII_1,
395    w_to ATRII_2,
396    se_to ATRII_5,
397    s_to ATRII_7,
398    has light;
399    
400 Nearby ATRII_3_ice "square of ice"
401    with name "square" "ice" "glass-like",
402         description "It looks and feels like a perfect square of ice, \
403         flush with the featureless gray surface you stand on.",
404         before [;
405            Enter:
406  print "You step onto the square, and before you know it, your \
407 surroundings shift and start to fade! You feel a \
408 sudden chilling wind. The ice seems to lengthen and stretch. The \
409 gray plane slowly turns white and bumpy.^";
410               in_atrii = 0;
411               PlayerTo(Frozen_river2);
412               return 2;
413         ],
414    has scenery enterable;
415     
416 Object ATRII_4 "Ethereal Plane of Atrii"
417    with description "Flat, featureless gray is in every direction \
418 you look. Stranger still is the large black hole to the south. \
419 Otherwise, you could wander this gray dimension in any direction, \
420 it seems.",
421    cant_go "An invisible force blocks your way!",
422    ne_to ATRII_2,
423    se_to ATRII_6,
424    s_to [; <<Enter ATRII_4_hole>>; ],
425    has light;
426    
427 Nearby ATRII_4_hole "black hole"
428    with name "hole" "black",
429         description "It looks like a large hole, probably twice your \
430         height. It's completely black and featureless.",
431         before [;
432            Enter:
433              print "^You step into the black hole. You stumble \
434        forward, surrounded by blacker-than-night darkness.^";
435              in_atrii = 0;
436              PlayerTo(Subway_Tunnel);
437              return 2;
438         ],
439    has scenery enterable;
440    
441 ! (secret subway tunnel)
442 Object Subway_Tunnel "Dark Tunnel"
443    with description "You're in a large dark tunnel that seems \
444    to run north and south. To the south you see light. There \
445    seem to be two metal tracks running along the ground.",
446        s_to GURTH_GUSPlatform,
447        n_to "You walk north, and run into a invisible force!",
448        before [;
449           Go:
450              if (noun==s_obj) {
451                 Achieved(25);
452                 print "^You step out into an underground chamber. \
453     A burly uniformed figure sees you exit the tunnel and yells, \
454     ~Hey, no playing in the tunnels, pal!~^";
455              }
456        ],
457        each_turn [ i ;
458           i = random(40);
459           if (i > 35)
460              "^You hear a rumbling noise echoed from somewhere, and \
461              the entire tunnel seems to shake! Then, all is quiet.";
462           if (i == 17 or 18) {
463              deadflag = 1;
464              "^Suddenly, without warning, a huge train car appears \
465              heading south! It plows straight into you!";
466           }
467           if (i==6 or 7) 
468              "^Suddenly, a huge train car appears heading north! \
469              You barely avoid getting pulverized! Strangely, \
470              you watch as the train continues north, and \
471              seems disappear into blackness nearby. It's as \
472              though the train was simply removed from the tunnel \
473              somehow.";
474        ],
475 ;
476
477 Nearby ST_tracks "tracks"
478    with name "tracks" "tracks" "metal",
479         description "Two long metal tracks, running north and south. \
480         There's something oddly familiar about them.",
481    has scenery;
482                
483 Object ATRII_5 "Ethereal Plane of Atrii"
484    with description "Flat, featureless gray is in every direction \
485    you look. It seems like you could go in any \
486    direction from here.",
487    cant_go "An invisible force blocks your way!",
488    nw_to ATRII_3,
489    sw_to ATRII_7
490    has light;
491    
492 Object p9 "ripped parchment" ATRII_5
493    class parchment_class,
494    with name "ripped",
495 description "~...now know that the Rod we believe is \
496 the Rod of the Ancients, sequestered in our Monastery, is \
497 an artifact of evil! Imprisoned inside, \
498 true to the scriptures (at least this much is, what \
499 isn't, I can nowadays say is much) we know, is Anabais. \
500 What is worse, is that this very Rod is an artifact of \
501 evil power created by Anabais, in the image of the True \
502 Rod of the Ancients, which he planned to use to aid \
503 him in his evil gains! \
504 Were that evil one free again, and had about him both \
505 his brothers and his Rod of Evil, we would witness a \
506 reckoning \
507 greater than Quendor has ever known! I take relief in \
508 the knowledge that he will never be freed, and he will \
509 never regain his implement of evil; only an innocent \
510 being can break the false rod and \
511 free him from his prison, and subsequently, \
512 the false rod cannot be regained by Anabais through his \
513 own will, or another evil being. \
514 In fact, only a being of good again can gather \
515 the resulting pieces, and only through this being \
516 can Anabais regain his evil artifact, for...~";
517
518
519 Object ATRII_6 "Ethereal Plane of Atrii"
520    with description "Flat, featureless gray is in every direction \
521    you look. It seems like you could go in any \
522    direction from here.",
523    cant_go "An invisible force blocks your way!",
524    nw_to ATRII_4,
525    e_to ATRII_7,
526    n_to ATRII_2,
527    se_to ATRII_8,
528    has light;
529    
530 Object ATRII_7 "Ethereal Plane of Atrii"
531    with description "Flat, featureless gray is in every direction \
532    you look. Stranger still is the odd-shaped depression in the gray \
533    plane here. \
534    Otherwise, you could wander this gray dimension in any direction, \
535    it seems.",
536    cant_go "An invisible force blocks your way!",
537    ne_to ATRII_5,
538    w_to ATRII_6,
539    sw_to ATRII_8,
540    n_to ATRII_3,
541    has light;
542
543 Nearby ATRII_7_depression "depression"
544    with name "depression" "cavity",
545         description "It's a large elongated depression in the gray 'floor'. \
546         The cavity has a flat bottom, and somewhat cigar-like shape.",
547         before [;
548            Enter:
549               print "^You step into the depression. Your very \
550               surroundings start to fade, replaced by sunlight that \
551               makes you squint! The gray plane undulates and \
552               buckles and turns into a great body of water \
553               before your very eyes.^";
554               in_atrii = 0;
555               PlayerTo(sailboat); ! useful if the player 'lost' the boat at sea.
556               return 2;
557         ],
558    has scenery enterable;
559    
560 Object ATRII_8 "Ethereal Plane of Atrii"
561    with description "Flat, featureless gray is in every direction \
562    you look. Directly overhead, you notice odd streaks of \
563    light. From here, you could wander this gray dimension in any direction, \
564    it seems.",
565    name "streaks",
566    cant_go "An invisible force blocks your way!",
567    nw_to ATRII_6,
568    ne_to ATRII_7,
569    has light;
570  
571 ! ----------- Special Implementor's Residence -----------
572
573 Object Imp_Liv "Strange Room"
574    with description [;
575       print "You ";
576       if (player in Imp_Curtains)
577          "can't see much behind these curtains.";
578       else "feel a great sense of dread! Surely, given the way \
579 you got here, this must be the domicile of a dreaded Implementor! \
580 The entire place feels strange and \
581 alien and, well, ~modern~. There's some sort of kitchen to the \
582 east. Long curtains cover what must be a window to the south.";
583         ],
584         number 1,
585         e_to Imp_Kitchen,
586         w_to Imp_door,
587         s_to [; <<Enter Imp_Curtains>>; ],
588         each_turn [ ;
589         if (Imp in Imp_Bedroom) {
590            if (Imp_Liv.number == 3) {
591               StartDaemon(Imp); 
592               Imp_Liv.number = 4;
593            }
594            else "^You hear some faint noises to the west.";
595         }
596         ! create some noises if player in curtains
597         if (player in Imp_Curtains) {
598            if (Imp in Imp_Liv)
599               "^You hear some faint noises nearby.";
600            if (Imp in Imp_Kitchen)
601               "^You hear some faint noises to the east.";
602         }
603         ],
604         time_left 0,
605         time_out [;
606             ! if player hasn't 'listened' twice to start Imp, 
607             ! start him anyway (otherwise, in truth, player 
608             ! would be permanently stuck in (my) apartment.
609             if (Imp_Liv.number < 4) {
610               StartDaemon(Imp);
611               Imp_Liv.number = 4;
612             }
613         ], 
614         before [;
615            ! if player actually listens, better noises...
616            Listen:
617         if (Imp in Imp_Bedroom) {
618            if (Imp hasnt general) { ! i.e. -- awake
619               if (Imp_Liv.number == 1) {
620                  Imp_Liv.number = 2;
621                  "It sounds like someone is talking to himself to \
622 the west. You hear: ~Now, wait just a second here, the player object \
623 is gone! How did that happen?~";
624               }
625               if (Imp_Liv.number == 2) {
626                  Imp_Liv.number = 3;
627                  "It sounds like someone is talking to himself to \
628 the west. You hear: ~That can't be right. I must be getting tired. \
629 Think I'll make myself a nice hot cup of coffee.~";
630 ! on next turn via Imp_Liv.each_turn, Imp daemon will be started...
631               }
632               ! otherwise, Imp has already made his rounds and
633               ! returned to bedroom, _not_ falling asleep
634               "You hear someone whistling a merry tune to the west."; 
635            }
636            else
637               "You hear someone snoring loudly to the west.";
638         }
639         if (Imp in Imp_Liv) {
640            if (Imp.number == 1)
641               "You hear someone walking nearby. The footsteps \
642 soon fade to the east.";
643            if (Imp.number == 4)
644               "You hear someone walking nearby. The footsteps \
645 soon fade to the west.";
646         }
647         if (Imp in Imp_Kitchen) {
648            ! This assumes the daemon will run before the player turn.
649            if (Imp.number == 2) {
650            switch (Imp.weight) {
651            118: print "You hear an irritated voice say, \ 
652 ~What happened to my coffee maker?~ Slightly softer, you \ 
653 hear ~Well, I guess I'll have that iced tea.~";
654            119, 122: print "You hear a voice to the east say, \ 
655 ~Looks like I've got coffee, thank goodness.~";
656            121: print "You hear a voice to the east say, \ 
657 ~Great, I'm all out of coffee. Good thing I still have some \ 
658 iced tea.~";
659            }  
660            " Shortly after this, you hear sounds of someone to \
661 the east starting some kitchen activity.";
662            }
663            else "You hear some brief busy noises from the west, \
664 followed by what sounds like someone drinking something. Shortly \
665 thereafter, you hear the sounds of someone walking into the area \
666 from the east.";
667         }
668         ],
669    has light;       
670
671 Nearby Imp_Curtains "set of curtains"
672    with name "curtain" "curtains",
673         description "Some heavy-cloth curtains along the south wall.",
674         before [;
675            Open: "You draw back the curtains and see a sight that \
676 beggars the mind! Through the windows, the night sky falls across \
677 some unknown landscape, dotted with strange bright points of light. \
678 Tall buildings seem to be everywhere. Whatever world you've stumbled \
679 onto, it certainly is not your own! You hastily close \
680 the curtains.";
681            Enter: print "In an attempt to hide, you part the curtains. ";
682         ],
683    has static enterable;
684
685 Object Imp_Kitchen "Strange Kitchen"
686    with description "A room that could be a kitchen, \
687 if it didn't seem completely strange. Harsh bright lights seem to \
688 be coming from some unknown source. Strange-looking white countertops and \
689 cabinets fill the area, along with a curious white closet-like object. \
690 A room lies to the west.",
691    name "cabinet" "cabinets" "closet" "refrigerator" "countertops",
692         w_to Imp_Liv,
693    has light;
694    
695 Object Coffee_maker "curious machine" Imp_Kitchen
696    with name "machine" "curious",
697         description "A white plastic device that seems to \
698 encase a glass pitcher or kettle of some sort. Most odd.",
699         ! weight 15, 
700         size 15,
701 ;
702
703 Object regular_coffee_can "can of regular coffee" Imp_Kitchen
704    with name "can" "coffee" "regular",
705         description [;
706                     "The can reads: ~Brand-X coffee crystals~^^\
707                     ~Rich, mountain-grown flavor.~";
708         ],
709         before [;
710            Open:
711             "You'd need a good can-opener for that.";
712         ],
713         ! weight 15, 
714         size 15,
715 ;
716
717
718 Object Imp_Bedroom "Strange Bedroom"
719    with description "A very curious small bedroom. \
720    A white desk sits here amongst other odd furnishings.",
721    name "furnishings" "bed" "chair",
722    e_to Imp_door,
723    has light;
724    
725 !Nearby Imp_Bed "furnishings"   
726 !   with name "furnishings" "bed" "chair",
727 !        description "Some weird bedroom furniture.",
728 !   has scenery;
729
730 Object Imp_Desk "desk" Imp_Bedroom
731    with name "desk",
732         description "A white desk, with a strange, modern look.",
733         capacity 6,
734    has scenery supporter;
735
736 Object Imp_Computer "strange machine" Imp_Desk
737    with name "machine" "computer",
738         description 
739         [ ;
740            print "It's a strange metal box. On top, perhaps connected in some \
741 way, is another metal box with a glass plate on the front. Strange wires \
742 seem to be attached to the boxes somehow. \
743 In front of the boxes is an odd plastic \
744 flat object with rows and rows of plastic buttons labeled every letter in \
745 the alphabet";
746            if (self hasnt general) {
747               give self general;
748               print ".^^Looking closer, you notice curious glowing \
749 letters on the glass plate. You read the letters, and \
750 feel drawn to respond...^^\
751 SPIRITWRAK DEVELOPMENT SYSTEM:^\
752 (AUTOMATIC OBJECT GARBAGE-COLLECTION)^\
753 REMOVE OBJECT IMPENETRABLE_STEEL_WALL? (Y/N) ";
754 if (YesOrNo() == 0)  "You press a button labeled ~N~. The strange box \
755 emits a tiny beep, and the glass plate is covered with fantastic colorful \
756 designs.";
757 else {
758         ! set-up the secret room 
759         remove steel_wall;
760         give cave_intersection general;
761         Achieved(18);
762 "You press a button labeled ~Y~. The strange box \
763 emits a tiny beep, and the glass plate is covered with fantastic colorful \
764 designs.";
765      }           
766            }
767            else ". The glass plate currently has strange glowing colorful \
768 patterns displayed on it.";                                 
769         ],        
770    has static;
771    
772 [ ImpSendBack ;
773     print "~I'm afraid you'll have to go back.~ The Implementor \
774 snaps his fingers, and suddenly, you're back in...^";    
775     spell_block = 0;
776     StopDaemon(Imp);
777     StopTimer(Imp_Liv);
778     PlayerTo(ATRII_8);
779 ];   
780    
781 Nearby Imp_door "door"
782    with name "door",
783         when_closed [;
784              if (self in Imp_Liv) {
785                 if (player notin Imp_Curtains)
786                    "There's a closed door to the west.";
787                 else rtrue;
788              }
789              else "There's a closed door to the east.";
790         ],
791         when_open [;
792              if (self in Imp_Liv) {
793                 if (player notin Imp_Curtains)
794                    "There's an open door to the west.";
795                 else rtrue;
796              }
797              else "There's an open door to the east.";
798         ],
799         description "A plain-looking door. A note \
800 attached to it says ~DO NOT DISTURB, IMPLEMENTOR AT WORK~.",
801         door_dir [;
802              if (self in Imp_Liv) return w_to;
803              else return e_to;
804         ], 
805         door_to [;
806              if (self in Imp_Liv) return Imp_Bedroom;
807              else return Imp_Liv;
808         ],
809         found_in Imp_Liv Imp_Bedroom,
810         before [;
811         Open:
812            if ((Imp in Imp_Bedroom) && (Imp hasnt general)) {
813               print "You open the door, revealing a small room with \
814 what must be an Implementor sitting behind a desk. The Implementor looks \
815 up, startled. ~You're here?~ he says, observantly. ";
816               ImpSendBack();     
817               return 1;                    
818            }             
819         ],
820     has static door openable;
821
822    
823 ! *************** And, for my final trick, the endgame **************
824
825 Object Mystical_Cave "Mystical Cave"
826    with description "You've entered a wondrous natural cave, lit \
827 everywhere by reflected light from some sort of purple crystalline substance \
828 in the walls. A tunnel exits to the northwest.",
829    name "reflected" "crystal" "crystalline" "substance",
830    number 0,
831    nw_to [;
832       if (Mystical_Cave.number ~= 4)
833          "The purple light in the chamber seems to pulse with energy, \
834 and find your way blocked by an invisible force!";
835       else {
836          spell_block = 0;
837          ! fill with things, if necc.
838          print "As you leave, a sudden tremor shakes the \
839 cave! You just narrowly avoid a sudden cave-in behind you!^";
840          give cave_intersection ~general;
841          return cave_intersection;      
842       }
843    ],
844    has light;         
845    
846 Nearby purple_sphere "purple sphere"
847    with name "sphere" "purple",
848         initial "There's a purple crystal sphere partially embedded \
849 in the rock floor here.",
850         description "A large purple sphere that seems to pulse with \
851 strange energy.",
852         before [;
853           Push, Touch, Rub:
854             ! various endgame trickery...
855             if (silver_rod_piece in player) {
856                while (child(player)~=0) {
857                   give child(player) ~worn;
858                   move child(player) to Mystical_Cave;
859                }
860                move silver_rod_piece to player;
861                spell_block = 1;
862                print "The sphere pulses with angry energy! It seems to \
863 be fighting the silver rod piece you hold! With a sudden burst, you \
864 feel your mind reel and your very surroundings change!^";
865                give stone_marker general;
866 !               give snowy_intersection general ~visited;
867                give snowy_intersection general;
868                StartTimer(White_Dragon,3);
869                PlayerTo(Dragon_Cave);
870                rtrue;
871             }
872             if (green_rod_piece in player) {
873                while (child(player)~=0) {
874                   give child(player) ~worn;
875                   move child(player) to Mystical_Cave;
876                }
877                move green_rod_piece to player;
878                spell_block = 1;
879                print "The sphere pulses with angry energy! It seems to \
880 be fighting the green rod piece you hold! With a sudden burst, you \
881 feel your mind reel and your very surroundings change!^";
882                StartTimer(captain,3);
883                PlayerTo(On_Boat);
884                rtrue;
885             }
886             if (red_rod_piece in player) {
887                while (child(player)~=0) {
888                   give child(player) ~worn;
889                   move child(player) to Mystical_Cave;
890                }
891                move red_rod_piece to player;
892                spell_block = 1;
893                print "The sphere pulses with angry energy! It seems to \
894 be fighting the red rod piece you hold! With a sudden burst, you \
895 feel your mind reel and your very surroundings change!^";
896 !               give Stadium_entrance general ~visited;
897 !               remove stadium_sign;
898 !               remove stadium_statue;
899 !               move statue_base to Stadium_entrance;
900                StartTimer(statue_base,2);
901                PlayerTo(Stadium_entrance2);
902                rtrue;
903             }
904             if (brown_rod_piece in player) {
905                while (child(player)~=0) {
906                   give child(player) ~worn;
907                   move child(player) to Mystical_Cave;
908                }
909                move brown_rod_piece to player;
910                spell_block = 1;
911                print "The sphere pulses with angry energy! It seems to \
912 be fighting the brown rod piece you hold! With a sudden burst, you \
913 feel your mind reel and your very surroundings change!^";
914 !               give GURTH_House general ~visited;
915 !               move bad_brick to GURTH_House;
916                StartTimer(bad_brick,7);
917                PlayerTo(GURTH_House2);
918                rtrue;
919             }
920             ! default...
921             "A purple blast of force throws you back!";
922         ],
923    has static;                   
924
925 Object skeleton "skeleton" Mystical_Cave
926    with name "skeleton" "bones",
927         initial "Lying in one corner of the room is a skeleton.",
928         description "Just some bones, not much else, is all.",
929         before [;
930            Pull, Push, Turn, ThrownAt, Touch, Attack, Rub,
931 Cut, Shake, Squeeze, Kiss:
932               remove self;
933               "The skeleton crumbles into dust, as though \
934 many years of time had suddenly caught up with it in one \
935 moment.";
936         ],
937 has static;
938
939 ! (black -- final parchment of Palemon's final words)
940 Object p8 "blackened parchment" Mystical_Cave
941    class parchment_class,
942    with name "blackened",
943 description "~I write these final words not in the hope \
944 that others will find and heed them, for this is too great \
945 a hope in my moment of death, but rather, to try and maintain my mind and soul \
946 in the face of the terror I now know is the truth.^^\
947 For how can a man survive, knowing that his entire life, \
948 his entire belief, has been a ruse, a dupe, from the \
949 early beginning? That he has merely been a pawn in a \
950 working of evil that cannot be stopped?^^\
951 I have fought all manner of terrors, and recovered that which \
952 I know is the _true_ Rod of the Ancients, broken and scattered \
953 eons ago in the face of great evil. I sought also those \
954 ancient spheres that the Four Ancients never had the chance to \
955 use against the evil four elemental demons, but alas, I could \
956 not find them all, and sequestered those which I did with \
957 good people that the elemental evil could not touch.^^\
958 Alas, my quest has ended here. I lie trapped here, \
959 with the pieces of the true Rod in hand, unable to go forward, trapped by the \
960 elemental mystic locks on the rod that prevent it from leaving this \
961 very room, yet unable to go back, to leave the rod here and \
962 deny the very real danger of the defeat of the Ancients, of \
963 the power that the evil elementals hold.^^\
964 What is a faith destroyed? Who can help me to believe, in my moment \
965 of disbelief?^^\
966 --P--~"; 
967
968
969
970
971 Object Dragon_Cave "Giant Cavern"
972    with description "You find yourself in a huge cavern. To the west \
973 is a large exit that looks out into a void of snow-covered mountains.",
974         name "mountains",
975         w_to "You hesitate. The cave seems to just \
976 exit off the side of a mountain, and all you can see below is whiteness. \
977 It could be a long way down.",
978         d_to [; <<Jump>>; ],
979         out_to [; <<Jump>>; ],
980         before [;
981             Jump:
982                print "You close your eyes and leap out of the cave! \
983 You plummet through silent white winds. \
984 Moments later, you fall right into an enormous snowbank, and \
985 roll downwards, into...^";
986                PlayerTo(snowy_intersection2);
987                rtrue;
988         ],
989    has light;
990
991 Object On_Boat "On strange boat"
992    with description "You are on a long open boat, riding the waves of \
993 some great sea. The boat seems to be filled with sailors from \
994 some militia.",
995         name "waves" "sea" "mast" "floorboards" "ship" "boat",
996         before [;
997            Drop:
998               if (captain has general) {
999                  if (noun==green_rod_piece) {
1000                     remove green_rod_piece;  ! it'll be back           
1001                     give shipwreck general;
1002                     Mystical_Cave.number = Mystical_Cave.number + 1;
1003                     StopTimer(captain);
1004                     StopTimer(militia);
1005                     print "You drop the green rod and watch it roll near \
1006 a mast and get stuck in the floorboards.^^\
1007 There's a load crack! The ship is breaking apart! Sailors \
1008 scramble in vain for safety! You hang onto the side of the \
1009 boat, but the vessel rocks wildly, and you fall into the waters. \
1010 ^^As you sink, you notice the waters seem to change to a purplish \
1011 hue, and you find yourself back in...^";
1012                     PlayerTo(Mystical_Cave);
1013                     rtrue;
1014                  }
1015               } 
1016               else  
1017                 "The sailors are holding you fast, so you \
1018 can't do this at the moment.";
1019         ],
1020    has light;
1021
1022 Nearby militia "sailors"
1023    with name "sailors" "militia" "navy",
1024         description "A bunch of dour-looking navy sailors.",
1025         time_left 0,
1026         time_out [;
1027            deadflag = 1;
1028            "The ship breaks asunder! Sailors scramble madly \
1029 and fall into the violent waves! You hear \
1030 the captain scream ~Blast! I can't swim!~ before the \
1031 waters cover you completely.";
1032         ],
1033    has scenery;
1034
1035 Object ENDGAME_ROOM "Nothingness"
1036    with description "Nothingness surrounds you. Yet, you feel like \
1037 your conscious being extends into worlds and dimensions never \
1038 imagined. You float in a void of total being.",
1039         number 0,  ! number of elementals banished
1040         each_turn [;
1041            switch (ENDGAME_timer.number) {
1042            0:  ENDGAME_timer.number = 1; 
1043                if (black_elemental in ENDGAME_ROOM) 
1044                "^Echoing in your mind, you hear a voice, that you \
1045 somehow know is from the black sphere. ~Give me the rod priest, \
1046 and you shall be immortalized as a symbol to an entire civilization!~";
1047            1:  ENDGAME_timer.number = 2; 
1048                if (smoke_elemental in ENDGAME_ROOM) 
1049                "^Echoing in your mind, you hear a voice, that you \
1050 somehow know is from the smoke-colored sphere. ~Give me the rod priest, \
1051 and I shall let you be witness to a feat of great magic, never \
1052 before witnessed!~";
1053            2:  ENDGAME_timer.number = 3; 
1054                if (gray_elemental in ENDGAME_ROOM) 
1055                "^Echoing in your mind, you hear a voice, that you \
1056 somehow know is from the gray-colored sphere. ~Give me the rod priest, \
1057 and I will grant you power over all who surround you!~";
1058            3:  ENDGAME_timer.number = 4; 
1059                if (white_elemental in ENDGAME_ROOM) 
1060                "^Echoing in your mind, you hear a voice, that you \
1061 somehow know is from the white sphere. ~Give me the rod priest, \
1062 and you will gain the attention of one of the more powerful \
1063 figures of your time!~";
1064            }
1065         ],  
1066 has light;
1067
1068 Object ENDGAME_timer "void" ENDGAME_ROOM
1069    with name "void" "nothingness",
1070         description "The absence of anything. Yet, at the same \
1071 time, the sense that everything possible is near.",
1072         number 0,
1073         time_left 0,
1074         time_out [;
1075            deadflag = 1;
1076            if (ENDGAME_ROOM.number < 3)
1077               print "The spheres nearby suddenly converge";
1078            else print "The sphere nearby suddenly converges";
1079            " towards you! In your mind, you hear \
1080 ~Hesitation, foolish priest, was the downfall of the Ancient \
1081 Ones~ before you feel the full force of the void.";
1082         ],  
1083    has scenery;
1084
1085 ! *** fake room/encounter for bad ending #x
1086 Object badend1 "On Giant Cube"
1087    with description "You stand on a single giant floating white \
1088 cube, in the middle of some dimly lit cavern. \
1089 ^^A small newt floats nearby, concentrating on something.^^\
1090 The newt suddenly opens its eyes! ~What?~ it croaks in \
1091 surprise. ~Who are you? You've broken my concentration on \
1092 the spell, you fool!~ the newt croaks. You feel the cube \
1093 shift, then stop floating! You plummet into the lava you \
1094 feared was below..."
1095    has light;
1096
1097 Object badend2 "Top of Pyramid"
1098    with description "You are on top of a pyramid in some \
1099 ancient city. You see dense jungle to the horizon. \
1100 An ancient civilization spreads before you, in all its \
1101 mysterious glory.^^Several robed figures surround you.^^\
1102 Suddenly, you realize you are tightly bound! One of the \
1103 figures points towards the horizon and makes a complicated \
1104 gesture. In a language you do not understand, he seems \
1105 to make a prayer to some nameless god! Fearing the \
1106 inevitable, you struggle mightily, but to no avail. \ 
1107 In moments, the group of robed figures hurls you off the \
1108 pyramid to your death!"
1109    has light;
1110
1111 ! *************
1112 ! Creatures
1113 ! *************
1114
1115 Object Imp "Implementor" Imp_Bedroom
1116    with name "Implementor",
1117         article "an",
1118         description [;
1119            print "Some Implementor. Looks more like a oddly-dressed \
1120 young man badly in need of a haircut";
1121            if (self has general)
1122               ". He's also sound asleep!";
1123            else ".";
1124         ],
1125         describe [;
1126            print "^Someone you assume must be an Implementor \
1127 is here";
1128            if (self has general)
1129               ", sound asleep.";
1130            else ".";
1131         ],           
1132         number 0,
1133         weight 120,  !  about right
1134              life [;
1135                 ! if asleep, which is usually the case
1136                 if (self has general) {
1137                    if (action==##WakeOther or ##Attack) {
1138                       print "You manage to rouse the Implementor from his \
1139 slumber. He stares at you, bewildered. ~What are you doing here?~ \
1140 he asks. ";
1141 ImpSendBack(); rtrue;
1142            }
1143                    else
1144                    "He appears to be sound asleep right now, and isn't very \
1145 responsive.";
1146            }
1147 !               else {
1148 ! (I suppose this is unnecessary. -- i.e. the player shouldn't be able to 
1149 ! interact with the implementor unless the implementor is asleep)
1150 !                  print "Well, that got his attention. The Implementor \
1151 !looks completely startled. ~What are you doing here?~  he says. ";
1152 !ImpSendBack(); rtrue;
1153 !           }                              
1154              ],
1155              daemon [;
1156                 ! ASSUMPTION -- daemon started by start event
1157                 StopTimer(Imp_Liv);
1158                 if (Imp.number == 0) {
1159                    give Imp_door open;
1160                    if ((player in Imp_Liv) && (player notin Imp_Curtains)) {
1161                       print "^The door to the west suddenly flies open! \
1162 A somewhat bedraggled Implementor steps out! He spots you and his \
1163 jaw drops. ~You, here?~ he says. ";
1164 ImpSendBack(); rtrue;
1165               }               
1166               else 
1167                  print "^You hear a door open to the west.^";
1168               Imp.number = 1;
1169               move Imp to Imp_Liv;
1170               }
1171            else {
1172               ! first a little 'lazy' clause that kicks the player
1173               ! out if the Imp is moving around and the player isn't
1174               ! in the curtains
1175               if ((Imp.number < 5) && (player notin Imp_Curtains)) {
1176                  if (Imp in location) print "^The Implementor ";
1177                  else print "^From nearby, an Implementor rushes up and \
1178 ";
1179                  print " grabs you by the shoulder! \
1180 ~What are you doing here?~ he \
1181 says. "; ImpSendBack(); return 1;
1182               }
1183               ! now, otherwise, we move the Imp and set his
1184               ! number accordingly.  Room descs and 'Listen'
1185               ! traps in Imp_Liv will need to use this info  
1186               switch (Imp.number) {
1187               ! [step 1, moving to Kitchen]
1188               1: move Imp to Imp_Kitchen;
1189                  Imp.number = 2;
1190                  if (Coffee_maker notin Imp_Kitchen) Imp.weight = 118;
1191                  else {
1192                     if (regular_coffee_can in Imp_Kitchen) {
1193                        Imp.weight = 119;
1194                        remove regular_coffee_can;
1195                     }
1196                     else {
1197                        if (decaf_coffee_can in Imp_Kitchen) {
1198                           Imp.weight = 122;
1199                           remove decaf_coffee_can;
1200                        }
1201                        else {
1202                        ! no coffee, gosh darn it
1203                           Imp.weight = 121;
1204                        }
1205                     }
1206                  }
1207                  return 0;
1208               ! [step 2, making/drinking the beverage]
1209               2: Imp.number = 3;
1210               ! [step 3, leaving kitchen, back to living room]
1211               3: Imp.number = 4;
1212                  move Imp to Imp_Liv;
1213               ! [step 4, goes back into bedroom]
1214               4: Imp.number = 5;
1215                  give Imp_door ~open;
1216                  if (player in Imp_Curtains) 
1217                     print "^You hear a door close to the west.^";
1218                  move Imp to Imp_Bedroom;
1219 !                 move coffee_cup to Imp_Bedroom;
1220                  if (Imp.weight == 122)
1221                     give Imp general;  ! asleep
1222                  StopDaemon(Imp);
1223               }                         
1224            }         
1225              ],
1226 has animate;
1227
1228 !Object coffee_cup "large cup"
1229 !   with name "cup" "large",
1230 !        description "A large mug, with the residue of some brown liquid \
1231 !left in it.",
1232         ! weight 5, 
1233 !        size 4,
1234 !   has container open;        
1235
1236 ! MOVEPRINTNPC routine, from Gareth Rees' 'THIEF.INF' 
1237 ! (TODO -- you really don't need this, since only Frobar moves in this fashion)
1238 [ MovePrintNPC n dest dir;
1239     if (n in location) {
1240         print "^", (The) n, " walks off";
1241         if (dir ~= in_obj or out_obj or u_obj && dir ~= d_obj)
1242             print " to the ", (DirectionName) dir.door_dir;
1243         print ".^";
1244     }
1245     if (dest == 0) remove n;  ! This seems odd - if dest bogus, 'unlink' NPC?
1246     else move n to dest;        
1247     if (n in location)
1248         print "^", (The) n, " walks in.^";
1249 ];
1250
1251 Object White_Dragon "White Dragon" Dragon_Cave
1252    with name "dragon" "white" "giant",
1253         describe [;
1254            print "There is a gigantic white dragon here";
1255            if (self has general)
1256               " sleeping peacefully.";
1257            "!";
1258         ],
1259         description "A giant white dragon, the size of a small house.",
1260         time_left 0,
1261         time_out [;
1262            give self ~general;
1263            if (location == Dragon_Cave) {
1264               deadflag = 1;
1265               "^The dragon suddenly snorts and wakes! It sees you \
1266 and attacks! In moments, you are no more...";
1267            }
1268            else {
1269               remove self;
1270               give stone_marker ~general;
1271               move stone_marker_top to snowy_intersection2;  
1272               "^You hear a roar from the east! From out of the \
1273 sky, a giant white dragon descends! It draws near, spots you, \
1274 and bellows in rage! You shrink back, and pray for a quick but \
1275 painless end.^^There is a loud crack! The dragon, in trying to \
1276 land, almost impales itself on the obelisk marker! Part of the \
1277 marker breaks off, and the dragon flies off, whimpering in pain!"; 
1278            }          
1279         ],
1280         life [;
1281         Attack, ThrowAt, WakeOther:
1282 deadflag = 1;
1283 "You disturb the sleeping dragon, who promptly makes you wish \
1284 you hadn't.";
1285         default: "Best not to disturb the dragon, I'd guess.";
1286         ],
1287   has animate;
1288
1289 Object captain "sea captain" On_Boat
1290    with name "captain",
1291         description "A rough-looking navy captain.",
1292         number 0,
1293         each_turn [;
1294            if (self hasnt general) {
1295               if (captain.number == 0) {
1296                  captain.number = 1;
1297                  "^You suddenly realize that you are being \
1298 held fast by two navy sailors! The captain walks forward and \
1299 points his cutlass near your ear.^^\
1300 ~What we have here, lads, is a stowaway!~ Some sailor cries out \
1301 ~Overboard with the stowaway!~ The captain smiles. \
1302 ~Now, we was planning on feeding you to the groupers, \
1303 but we could use a scullion in the hold. One things for sure, \
1304 ye ain't finding passage on this ship if ye ain't aligned with \
1305 the Antharian Navy cause!~ Some sailor cries out \
1306 (unnecessarily) ~The Antharian Navy cause!~. ~So, tell us lad, \
1307 are ye with us? If ye are true, you'll tell me the Antharian \
1308 Navy patron saint! So speak quickly, lad, if ye wish to stay \
1309 dry!~";
1310               }
1311               else "^~Speak up fellow! We havn't got all day!~";
1312            } 
1313         ],
1314         time_left 0,
1315         time_out [;
1316            deadflag = 1;
1317            "The captain sighs. ~Into the water with ye, then,~ \
1318 he says, and the two sailors push you roughly overboard. \
1319 You land in the sea with a splash, and struggle to stay afloat. \
1320 The ship sails off, but oddly, moments later, it seems to \
1321 stall and start to sink! Before you get a chance to reflect on \
1322 this, a large grouper swallows you whole.";
1323         ], 
1324         life [;
1325            if (self has general)
1326               "The captain's a bit too busy trying to save \
1327 a sinking ship.";
1328            Answer:
1329              if (noun=='minirva') {
1330                 give self general;
1331                 StopTimer(self);
1332                 StartTimer(militia,2);
1333                 "~Aye, that's right. Escort the new scullion \
1334 down to the hold where --~^^\
1335 The captain's orders are cut short by a sudden grinding noise, \
1336 and the boat rocks violently! ~Reef, captain!~ you hear someone \
1337 cry. ~Blast!~ the captain says, ~quickly men, we've got to --~ \
1338 But it's too late. The boat starts to tip and sway, and \
1339 the two sailors release you and hastily try to help raise the \
1340 rigging!";
1341              }
1342              else {
1343                 if (noun=='duncanthrax') {
1344                   deadflag = 1;
1345                   "The sailors suddenly pale at the mention of \
1346 Lord Duncanthrax. ~A traitor in our midst, eh?~ the captain \
1347 shouts and beheads you with one stroke.";
1348                 }
1349                 if (noun=='ulysses' or 'odysseus')
1350                    "~Nay lad, me thinks that \
1351 was a sailor.~";                   
1352                 else "~Nay lad, that doesn't sound right.~";
1353              }
1354            Attack, ThrowAt, Kiss, Show, Give:
1355              "Given that you are in the grips of several \
1356 strong navy sailors, this is impossible.";
1357         ],
1358    has animate;
1359
1360 ! ***** THE EVIL ELEMENTALS
1361 Object black_elemental "black sphere" ENDGAME_ROOM
1362    with name "anabais" "black" "sphere" "earth",
1363         description "A black sphere of energy.",
1364         life [;
1365            ThrowAt:
1366               if (noun==brown_sphere) {
1367                  remove self; remove brown_sphere;
1368                  ENDGAME_ROOM.number = ENDGAME_ROOM.number + 1;
1369                  if (ENDGAME_ROOM.number == 4) {
1370                     GameWinner(); rtrue; }
1371                  "The black sphere howls in rage and is no more!";
1372               }
1373            Give:
1374               if (noun==TRUEROD) {
1375                  remove TRUEROD;
1376                  print "You feel a strange foreboding feeling as \
1377 the black sphere seems to engulf the rod, then you! Your \
1378 surroundings change once again!^";
1379                  deadflag = 1;
1380                  PlayerTo(badend2);
1381                  rtrue;
1382               }
1383            default: "The black sphere is unresponsive.";
1384         ], 
1385    has animate; 
1386
1387 Object smoke_elemental "smoke-colored sphere" ENDGAME_ROOM
1388    with name "smoke" "sphere" "fire", ! TODO new name...
1389         description "A smoke-filled sphere of energy.",
1390         life [;
1391            ThrowAt:
1392               if (noun==red_sphere) {
1393                  remove self; remove red_sphere;
1394                  ENDGAME_ROOM.number = ENDGAME_ROOM.number + 1;
1395                  if (ENDGAME_ROOM.number == 4) {
1396                     GameWinner(); rtrue; }
1397                  "The smoke-filled sphere howls in rage and is no more!";
1398               }
1399            Give:
1400               if (noun==TRUEROD) {
1401                  remove TRUEROD;
1402                  print "You feel a strange foreboding feeling as \
1403 the smoke-filled sphere seems to engulf the rod, then you! Your \
1404 surroundings change once again!^";
1405                  deadflag = 1;
1406                  PlayerTo(badend1);
1407                  rtrue;
1408               }
1409            default: "The smoke-filled sphere is unresponsive.";
1410         ], 
1411    has animate; 
1412
1413 Object gray_elemental "gray sphere" ENDGAME_ROOM
1414    with name "gray" "sphere" "water", ! TODO new name
1415         description "A gray sphere of energy.",
1416         life [;
1417            ThrowAt:
1418               if (noun==green_sphere) {
1419                  remove self; remove green_sphere;
1420                  ENDGAME_ROOM.number = ENDGAME_ROOM.number + 1;
1421                  if (ENDGAME_ROOM.number == 4) {
1422                     GameWinner(); rtrue; }
1423                  "The gray sphere howls in rage and is no more!";
1424               }
1425            Give:
1426               if (noun==TRUEROD) {
1427                  remove TRUEROD;
1428                  print "You feel a strange foreboding feeling as \
1429 the gray sphere seems to engulf the rod, then you! Your \
1430 surroundings change once again!^";
1431                  PlayerTo(FUBLIO_Cave);  
1432                  StartTimer(mad_hermit,3);
1433                  rtrue;
1434               }
1435            default: "The gray sphere is unresponsive.";
1436         ], 
1437    has animate; 
1438
1439 Object white_elemental "white sphere" ENDGAME_ROOM
1440    with name  "white" "sphere" "air",  ! TODO new name
1441         description "A white sphere of energy.",
1442         life [;
1443            ThrowAt:
1444               if (noun==silver_sphere) {
1445                  remove self; remove silver_sphere;
1446                  ENDGAME_ROOM.number = ENDGAME_ROOM.number + 1;
1447                  if (ENDGAME_ROOM.number == 4) {
1448                     GameWinner(); rtrue; }
1449                  "The white sphere howls in rage and is no more!";
1450               }
1451            Give:
1452               if (noun==TRUEROD) {
1453                  remove TRUEROD;
1454                  print "You feel a strange foreboding feeling as \
1455 the white sphere seems to engulf the rod, then you! Your \
1456 surroundings change once again!^";
1457                  PlayerTo(TROPHY_SECRET);  
1458                  rtrue;
1459               }
1460            default: "The white sphere is unresponsive.";
1461         ], 
1462    has animate; 
1463
1464
1465 ! ******************
1466 ! scrolls/spells 
1467 ! ******************
1468
1469 Object fancy_scroll "fancy scroll" 
1470   class scroll_class,
1471   with name "fancy",
1472 ;
1473
1474 Object wigro_spell "turn undead" fancy_scroll
1475    class spell_class,
1476    with name "wigro",
1477    magic [;
1478       "You speak the chant. Nothing seems to happen.";
1479    ],
1480 ;
1481
1482 Object briefcase "briefcase" Subway_Tunnel
1483    with name "briefcase" "case",
1484         description "A somewhat battered brown-leather briefcase.",
1485         capacity 5,
1486         ! weight 20, 
1487         size 15,
1488    has container openable;
1489
1490 Object red_scroll "red scroll" briefcase
1491   class scroll_class,
1492   with name "red",
1493 ;
1494
1495 Object luncho_spell "send object to lower plane" red_scroll
1496   class spell_class,
1497   with name "luncho",
1498        magic [;
1499           if (second == 0)
1500 "You see a brief flash of smoke, but nothing happens.";
1501           if (second has animate)
1502              "You feel a slight rumbling beneath your feet, but nothing else \
1503 happens.";
1504           else {
1505              if ((second hasnt static) && (second hasnt scenery)) {
1506                 if (second has clothing) give second ~worn;
1507                 if (in_atrii == 1) {
1508                    move second to MON_Chapel2;
1509                 }
1510                 else
1511                 move second to Hades_5;
1512                 print "There is a sudden puff of smoke, and "; DefArt(second); 
1513                 " suddenly vanishes!";
1514              }
1515              "Your chant goes unanswered.";
1516           }
1517       ],
1518 ;
1519
1520 ! ******************
1521 ! special obs
1522 ! ******************
1523
1524 Object Atrii_gate "strange contraption" GUE_Labs_SECRET
1525    with name "contraption" "plate" "disc" "strange",
1526         description "It looks like a large, slightly convex round disc \
1527         made of some silvery material.",
1528         before [;
1529            Enter:
1530               print "As you step onto the silvery disc, you feel a \
1531               strange jolt run through your body. A bright white \
1532               flash blinds you momentarily!^^You blink, trying to \
1533               register your surroundings.^";
1534               in_atrii = 1;
1535               PlayerTo(ATRII_1);
1536               return 2;
1537            Receive:
1538               move noun to ATRII_1;
1539               CDefArt(noun); " suddenly disappears in a bright \
1540               flash of light as you place it on the silver disc!";              
1541            Push, Pull, Touch, Take:
1542               "As you reach for the strange contraption, you notice \
1543               white sparks of something arc from the silver surface \
1544               to your fingers! You hastily draw back.";              
1545         ],
1546    has static supporter enterable;
1547
1548 ! *** the true rod pieces, and the golden rod (after joined)
1549 Object silver_rod_piece "silver rod piece" Mystical_Cave
1550    class rod_class,
1551    with name "silver",
1552         description "A strange short section of rod colored \
1553 silver.",
1554         before [;
1555            Join:
1556               if (location ~= Mystical_Cave) {
1557               if (second == TRUEROD) 
1558                  <<Join TRUEROD self>>;
1559               if ((second == brown_rod_piece) ||
1560                  (second == red_rod_piece) ||
1561                  (second == green_rod_piece)) {
1562                  if (TRUEROD.number == 0) {
1563                     TRUEROD.number = 1;
1564                     move TRUEROD to parent(self);
1565                     remove self;  remove second;
1566                     "There is a dazzling golden light as \
1567 you join the two rod pieces! What remains is a new, strange \
1568 rod piece!"; 
1569                  }
1570                  else "There is a dazzling burst of \
1571 golden light. However, the pieces will not join, and seem \
1572 to be seeking out something else...";
1573               }
1574               }
1575               else "Some strange purple flash of force \
1576 blocks your efforts.";
1577         ],
1578 ;
1579 Object red_rod_piece "red rod piece" Mystical_Cave
1580    class rod_class,
1581    with name "red",
1582         description "A strange short section of rod colored \
1583 red.",
1584         before [;
1585            Join:
1586               if (location ~= Mystical_Cave) {
1587               if (second == TRUEROD) 
1588                  <<Join TRUEROD self>>;
1589               if ((second == silver_rod_piece) ||
1590                  (second == brown_rod_piece) ||
1591                  (second == green_rod_piece)) {
1592                  if (TRUEROD.number == 0) {
1593                     TRUEROD.number = 1;
1594                     move TRUEROD to parent(self);
1595                     remove self;  remove second;
1596                     "There is a dazzling golden light as \
1597 you join the two rod pieces! What remains is a new, strange \
1598 rod piece!"; 
1599                  }
1600                  else "There is a dazzling burst of \
1601 golden light. However, the pieces will not join, and seem \
1602 to be seeking out something else...";
1603               }
1604               }
1605               else "Some strange purple flash of force \
1606 blocks your efforts.";
1607         ],
1608 ;
1609 Object green_rod_piece "green rod piece" Mystical_Cave
1610    class rod_class,
1611    with name "green",
1612         description "A strange short section of rod colored \
1613 green.",
1614         before [;
1615            Join:
1616               if (location ~= Mystical_Cave) {
1617               if (second == TRUEROD) 
1618                  <<Join TRUEROD self>>;
1619               if ((second == silver_rod_piece) ||
1620                  (second == red_rod_piece) ||
1621                  (second == brown_rod_piece)) {
1622                  if (TRUEROD.number == 0) {
1623                     TRUEROD.number = 1;
1624                     move TRUEROD to parent(self);
1625                     remove self;  remove second;
1626                     "There is a dazzling golden light as \
1627 you join the two rod pieces! What remains is a new, strange \
1628 rod piece!"; 
1629                  }
1630                  else "There is a dazzling burst of \
1631 golden light. However, the pieces will not join, and seem \
1632 to be seeking out something else...";
1633               }
1634               }
1635               else "Some strange purple flash of force \
1636 blocks your efforts.";
1637         ],
1638 ;
1639 Object brown_rod_piece "brown rod piece" Mystical_Cave
1640    class rod_class,
1641    with name "brown",
1642         description "A strange short section of rod colored \
1643 brown.",
1644         before [;
1645            Join:
1646               if (location ~= Mystical_Cave) {
1647               if (second == TRUEROD) 
1648                  <<Join TRUEROD self>>;
1649               if ((second == silver_rod_piece) ||
1650                  (second == red_rod_piece) ||
1651                  (second == green_rod_piece)) {
1652                  if (TRUEROD.number == 0) {
1653                     TRUEROD.number = 1;
1654                     move TRUEROD to parent(self);
1655                     remove self;  remove second;
1656                     "There is a dazzling golden light as \
1657 you join the two rod pieces! What remains is a new, strange \
1658 rod piece!"; 
1659                  }
1660                  else "There is a dazzling burst of \
1661 golden light. However, the pieces will not join, and seem \
1662 to be seeking out something else...";
1663               }
1664               }
1665               else "Some strange purple flash of force \
1666 blocks your efforts.";
1667         ],
1668 ;
1669 Object TRUEROD "golden rod" 
1670    class rod_class,
1671    with name "golden",
1672         number 0,
1673         description [;
1674            print "A wondrous, shimmering golden rod";
1675            if (TRUEROD.number < 3) 
1676               " that seems slightly short.";
1677            else "."; 
1678         ],
1679         before [;
1680            Wave:
1681              if (TRUEROD.number == 3) {
1682                 deadflag = 1;
1683 ! TODO -- this is essentially another 'win', but not a good one
1684                 "You wave the rod, and feel a sudden blast of force! \
1685 The spheres howl in terror and \
1686 suddenly explode! The jolt of power from the rod sends you \
1687 hurtling through space, and you are lost in an endless \
1688 tumble through the void..."; 
1689              }
1690            Join:
1691              if ((second == silver_rod_piece) ||
1692                  (second == red_rod_piece) ||
1693                  (second == green_rod_piece) ||
1694                  (second == brown_rod_piece)) {
1695                 remove second;
1696                 TRUEROD.number = TRUEROD.number + 1;
1697                 print "You feel a strange surge of \
1698 mystic energy as you join the rod pieces. ", (The) second,  " \
1699 joins with the golden rod";
1700                 if (TRUEROD.number == 3) {
1701                    Achieved(19);
1702                    print "!^^Time and space seem to grind to \
1703 a halt.^^\
1704 Your surroundings and the very ground you stand on shatter like \
1705 planes of glass, revealing a strange, new dimension...^";
1706                    spell_block = 1;
1707                    PlayerTo(ENDGAME_ROOM);
1708                    StartTimer(ENDGAME_timer,12);
1709                    rtrue;
1710                 }
1711                 else "!";
1712              } 
1713         ],
1714 ;
1715
1716 ! *** The results of winning the game ***
1717 [ GameWinner ;
1718    Achieved(26);
1719    print "The last sphere howls in rage and disappears!";
1720    deadflag = 2;
1721    " You scream in agony as the void that surrounds you \
1722 seems to implode! You feel yourself dissipating into the \
1723 surrounding nothingness. ~Is this my reward?~ you scream, \
1724 ~Is this, then, the end?~^^\
1725 A white light makes you open your eyes.^^\
1726 You are lying on a beach. The Great Sea laps at your \
1727 tattered garments. Slowly, you rise to your knees.^^\
1728 The sun, like a bloated, radiant bird, is sinking below the \
1729 wave on the horizon. Another day is coming to an end.^^\
1730 A voice startles you. ~Tis a fine spot for watching \
1731 sunsets.~ You turn to see Morgan the Ranger, Frobar and \
1732 the Thief nearby. The Thief helps you to your feet, and Frobar \
1733 glances your way. ~I sensed a great upheaval in the \
1734 fabric of time and space not long ago. I gather you \
1735 have quite a story to tell,~ he says. ~We \
1736 probably can relate to much of what you have seen, \
1737 although your unwavering faith is something we \
1738 desire to understand.~ Morgan explains, ~Belief in the \
1739 face of the unbelievable is an enviable strength.~ \
1740 The Thief chuckles quietly. \
1741 ~Perhaps you will join us at Delbins, where we will \
1742 partake in a belief of fine cuisine while you tell all?~ he says. \
1743 He notices your weary expression and \
1744 adds with surprising seriousness, ~Not that I \
1745 prepose to offer advice from one as myself, \
1746 but humbly, I admit, that many a time, a belief in myself \
1747 was often sufficient.~ He pauses. \
1748 ~Gods or no, now, you make your own destiny.~";
1749 ];