1 ! *****************************************************************
2 ! SPIRITWRAK -- An exercise in copyright infringement :)
4 ! Release 1, 12/95 -- 3/96
7 ! Copyright (C) 1996, D. S. Yu
9 ! This program is free software; you can redistribute it and/or modify
10 ! it under the terms of the GNU General Public License as published by
11 ! the Free Software Foundation; either version 3 of the License, or
12 ! (at your option) any later version.
14 ! This program is distributed in the hope that it will be useful,
15 ! but WITHOUT ANY WARRANTY; without even the implied warranty of
16 ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 ! GNU General Public License for more details.
19 ! You should have received a copy of the GNU General Public License
20 ! along with this program; if not, write to the Free Software
21 ! Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 ! To contact the author (Dan Yu), send email to dsyu@holonet.net.
25 ! *****************************************************************
28 ! Mr. Blank, Lebling, Meretzky, Moriarty for the Zork universe.
29 ! Graham Nelson for Inform, and for various code I've shamelessly cribbed.
31 ! NUTRITION NOTE: No Microsoft(tm) products were used in the
32 ! construction of this game
34 ! ** inform compile switches here **
38 Include "spirita.inf";
40 ! ** Story Constants **
41 Constant Story "SPIRITWRAK";
42 Constant Headline "^An Interactive Fantasy Adventure^\
43 Copyright (C) 1996, by D.S. Yu.^\
44 Portions copyright Graham Nelson.^^\
45 'SPIRITWRAK' comes with ABSOLUTELY NO WARRANTY ^\
46 This is free software, and you are welcome to redistribute it \
47 under conditions as described in the GNU General Public License as published by \
48 the Free Software Foundation; either version 3 of the License, or \
49 (at your option) any later version.^^";
55 Constant MAX_SCORE 250;
56 Constant NUMBER_TASKS 27;
57 Constant TASKS_PROVIDED;
58 Constant OBJECT_SCORE 2;
59 ! Constant ROOM_SCORE 1;
60 ! Global task_scores initial t1 t2 t3.....
61 Array task_scores -> 2 5 5 5 10 15 5 5 5 5 5 5 10 10 10 5 5 5 10 10 5 5 10 5 5 5 10;
63 ! ** Player inventory and weight system
64 Constant MAX_CARRIED 15; ! Max of 15 items carried at start
65 ! This can be changed on the fly by adjusting player.capacity
67 ! Entire weight system removed 3/16/96, however certain puzzles
68 ! inadvertently depend on this, so...
71 global Player_HP_MAX = 20; ! number of hp MAX (should be 20 + score)
72 global Player_HP_CUR = 20; ! number of hp left (< MAX)
73 global Player_Lives_Left = 3; ! number of resurrects left
74 global in_hades = 0; ! Is the player in Hades? (we certainly hope not)
75 global in_atrii = 0; ! Is the player in Atrii?
76 ! global all_my_spells data 32; array for spells in spell book
77 Array all_my_spells -> 64; ! array for spells in spell book
78 global has_resist_gravity = 0; ! is player resisting gravity?(see feeyuk spell)
79 global spell_block = 0; ! block spell-related stuff (end-game)
81 ! Any actions that are replaced get mentioned here
84 Replace InsertSub; ! for relative sizes
86 ! *** Include Parser and VerbLib
90 ! -- two global location ptrs for Barsap's Gambit
94 ! ******************* CLASS DEFS *****************
96 ! ** rod (part) class and attribute
101 description "A thin rod made from some undeterminable material.",
106 "You complete the chant, but the rod lies unaffected! \
107 Perhaps it is protected from magic somehow?";
109 if (second has is_rod)
110 "You try to bring the rods together, but a \
111 sudden blast of energy prevents you, and stings your hands!";
112 ! (note that true rod pieces have their own Join befores, which
113 ! should, in theory, get called instead of this one).
117 Class parchment_class
118 with name "parchment",
119 description "A piece of blank parchment.",
128 description "A small hard sphere made from some undeterminable material.",
133 "You complete the chant, but the sphere lies unaffected! \
134 Perhaps it is protected from magic somehow?";
136 has is_sphere scored;
141 with name "flag" "cloth",
143 description "A short square piece of colored cloth.",
148 Class trophy_dep_class
149 with name "depression" "niche" "hole" "keyhole",
151 print "There is a circular depression in the center of the floor";
153 ". Sitting in the depression is a trophy.";
157 print "A small circular depression in the center \
160 ". At the moment, the depression holds a trophy.";
161 else ". There seem to be three small concave \
162 marks in the otherwise flat stone of the depression.";
166 has static container open;
169 Property counter_niche;
170 Property niche_dir; ! assoc with the dir a niche is facing.
175 niche_dir 1, ! default north
176 description "It looks like a chiseled-out niche in the floor.",
178 switch (self.niche_dir) {
179 1: print "There's a square niche in the northern edge of the floor here";
180 2: print "There's a square niche in the western edge of the floor here";
181 3: print "There's a square niche in the southern edge of the floor here";
182 4: print "There's a square niche in the eastern edge of the floor here";
184 if (children(self) ~= 0) {
185 print ". Resting in the niche is ";
186 InDefArt(child(self));
187 print " that extends into the darkness";
188 ! weird -- There is no "CInDefArt(), equiv to (A) obj, which
189 ! is probably pretty simple...
196 if (noun hasnt is_wood_beam)
197 "That's not going to stay in the niche.";
199 ! (odd capacity check, seems like I'm stepping in front...)
200 if (children(self) ~= 0)
201 "The niche space is currently full.";
202 ! place both pieces in niches
203 j = child(noun); ! child piece (whichever)
204 move j to self.counter_niche;
206 "You carefully place one end of the beam in the niche and \
207 extend the other end into the darkness. You feel something \
208 solid support the far end!";
211 ! (reconstruct wood beam) Assumption is that noun must have
213 move child(self.counter_niche) to child(self);
214 move child(self) to player;
217 has static container open is_niche;
219 ! ** multiple coins, cribbed from "Balances"
224 description "A round metal disc, with ~1zm~ stamped on both sides.",
229 if (parser_action==##TheSame)
230 { if ((parser_one.&name)-->0 == (parser_two.&name)-->0) return -1;
236 if (j=='coins') parser_action=##PluralFound;
237 else if (j~='coin' or w) return i;
243 ! ** Spell-casting system, again cribbed from Graham's "Balances",
244 ! except stuffy priests call them 'chants'...
245 ! ----------------------------------------------------------------------------
246 ! Now the whole spell-casting system
247 ! ----------------------------------------------------------------------------
250 Attribute known_about;
252 Attribute is_spell_book;
256 [ SpellName obj; print (address) (obj.&name)-->0; ];
259 with name "spell" "spells" "chant" "chants", article "the", number 0,
261 [; SpellName(self); print " chant"; give self known_about; rtrue;
265 ! SayName: SpellName(self); print " chant: ", object self;
266 SayName: SpellName(self); print " chant: ", self;
267 give self known_about; rtrue;
268 Examine: <SayName self>; ".";
273 Object memory "memory"
274 with capacity 5, ! will change periodically, given God-granted powers...
280 if (spell_block == 1)
281 "Currently, your mystic powers don't seem to be working.";
282 objectloop (i in self) if (i.number==100) j++;
285 objectloop (i in self)
288 if (k==j-1) print " and ";
289 if (k<j-1) print ", ";
291 if (j==1) print " chant is"; else print " chants are";
292 print " yours forever. Other than that, y";
297 objectloop (i in self) if (i.number<100) j++;
300 objectloop (i in self)
304 if (i.number==2) print " (twice)";
305 if (i.number==3) print " (thrice)";
306 if (i.number==4) print " (four times)";
307 if (i.number>=5) print " (many times)";
308 if (k==j-1) print " and ";
309 if (k<j-1) print ", ";
312 else print "no chants";
316 "Currently, your mystic powers don't seem to be working.";
317 if (second.number==100) "You always know that chant.";
318 self.number=self.number+1;
319 print "Making a quick prayer to the Gods, you prepare the ";
322 if (second notin self) second.number=0;
324 second.number=second.number+1;
325 if (second.number==1) print ".";
326 if (second.number==2) print " once again.";
327 if (second.number==3) print " a third time.";
328 if (second.number>3) print " yet another time.";
329 if (self.number <= self.capacity) { new_line; rtrue; }
330 i=youngest(self); <Remove self i>;
331 "^A voice booms out ~Do not try to exceed your powers, mortal!~";
333 if (second notin self || second.number==100) rtrue;
334 if (self.number>0) self.number=self.number-1;
335 second.number=second.number-1;
336 if (second.number==0) remove second;
340 Object gnusto_spell "copy a chant into your prayer book" memory
347 "Currently, your mystic powers don't seem to be working.";
348 if (amulet hasnt worn)
349 "You speak the chant, and absolutely nothing happens!";
350 if (second has is_spell_book)
351 "Unlike scrolls, prayer books are magically guarded against \
352 the 'theft' of their lore.";
353 if (second==0 || second hasnt is_scroll)
354 "Your chant goes unanswered.";
355 if (second notin player)
356 "A gnusto chant would require close scrutiny of the scroll \
357 it is to copy, which you do not seem to be holding.";
358 objectloop (i in player)
359 if (i has is_spell_book) a_book=i;
361 "Your chant fails, as you have no prayer book.";
363 if (i==0 || i hasnt is_spell)
364 { print "Your chant fails, as "; DefArt(second);
367 <Learn a_book i>; remove second;
368 print "Your prayer book begins to shake! Slowly, ornately, \
369 the words of "; DefArt(i); " are inscribed, \
370 into the book with a violet glow. \
371 The book's brightness fades, but the chant remains! \
372 However, the scroll on which it was written vanishes as \
373 the last word is copied.";
376 Class spell_book_class
382 CDefArt(self); " will always open to the desired page thanks \
383 to the powers of the Gods, may they never forget us.";
385 print "When you are done, "; DefArt(self); " remains unmarred.";
387 if (self.magic==0) "(This prayer book has no pages.)";
389 for (i=0:i<self.capacity && (p-->i)~=0:i++) ;
390 if (i==self.capacity) rtrue;
396 if (self.magic==0) "(This prayer book has no pages.)";
398 for (i=0:i<self.capacity && (p-->i)~=0:i++)
399 { j=p-->i; <Examine j>;
408 if (self has general)
409 { if (child(self)~=0 && child(self) has is_spell)
410 j=(child(self).&name)-->0; else j='illegible';
414 if (k=='scrolls') parser_action = ##PluralFound;
415 if ((k=='scrolls' or 'scroll' or j) || (k==(self.&name)-->0))
419 ! while (NextWord()==j or 'scroll' or (self.&name)-->0) i++;
426 if (i==0 || i hasnt is_spell)
427 "The scroll has faded, and you cannot read it.";
428 print "The scroll reads ~"; <SayName i>; "~.";
431 [; if (inventory_stage==2 && self has general)
432 { if (child(self)==0 || child(self) hasnt is_spell)
433 print " (which is illegible)";
435 { print " (of "; DefArt(child(self)); print ")"; }
439 has scored is_scroll;
441 ! NOTE: This routine has a slight bug (as cribbed from GN's
442 ! Balances, rel2) in that Examine, if the routine reaches
443 ! scope_stage 3, prints a rather confusing msg. However,
444 ! the appropriate msg is printed for, say, Learn, if the
445 ! spell is unknown/out-of-scope. Oddly, action can't
446 ! be checked at stage 3, so I copied a second version of
447 ! the routine for Examine only. -DY
448 ! 3/19 update: Checking Graham's release 3 of Balances,
449 ! I stumble across the "action_to_be" var. Most useful.
450 [ ReadableSpell i j k;
451 if (scope_stage==1) return 1;
453 { objectloop (i in player)
454 if (i has is_spell_book)
455 { for (k=0:k<i.capacity && (i.magic)-->k~=0:k++)
456 { j=(i.magic)-->k; PlaceInScope(j);
461 if (action_to_be == ##Examine)
462 "You can't see any such thing.";
463 !"You have never seen or heard of such a chant.";
464 "You can't see such a chant, if that is indeed a chant.";
467 [ SpellsSub; <Examine memory>; ]; ! for our case, 'chants' will work also
469 [ LearnSub; if (location==thedark)
470 print "(The magic purple glow of the chants casts enough light \
471 that you can read them.)^";
472 <Insert memory noun>;
475 global the_spell_was = gnusto_spell;
477 [ CastOneSub; <Cast the_spell_was noun>; ];
479 ! Property long unmagic;
482 ! (wood beams and niches -- for Barsap's Gambit)
483 ! (put after 'the_spell_was' global defined)
485 Attribute is_wood_beam;
487 Class wood_beam_class
488 with name "wood" "beam",
490 description "A long thin wooden beam.",
493 number 0, ! number is the 'strength left' qualifier
496 if (the_spell_was == egdelp_spell)
497 "The wood beam is covered in a waxy film! Thinking \
498 better of this, you hastily wipe off the offending build-up.";
499 if ((the_spell_was == luncho_spell or huncho_spell) &&
500 (parent(self) has is_niche)) {
501 ! reconstruct beam before teleporting
502 ! due to problem below, I'm denying this...
503 "Your chant goes unanswered.";
504 ! move child(parent(self).counter_niche) to self;
505 ! <<Cast the_spell_was self>>;
506 ! NOTE NOTE This may recursively explode...
511 Class balsa_beam_class
512 class wood_beam_class,
514 plural "balsa wood beams",
515 description "A long thin balsa wood beam.",
516 number 0; ! always breaks
518 Class pine_beam_class
519 class wood_beam_class,
521 plural "pine wood beams",
522 description "A long thin pine wood beam.",
525 Class ebony_beam_class
526 class wood_beam_class,
529 plural "ebony wood beams",
530 description "A long thin ebony wood beam.",
534 the_spell_was = noun; <Remove memory noun>;
536 ! if (noun has general)
537 ! { give noun ~general;
538 ! if (RunRoutines(noun,unmagic)~=0) rfalse;
539 ! "Nothing happens.";
542 if (amulet hasnt worn)
543 "You speak the chant, and absolutely nothing happens!";
545 "Currently, your mystic powers don't seem to be working.";
547 "Your Gods can't save you now...";
549 { ResetVagueWords(second); ! Set "it", "him", "her"
550 if (RunRoutines(second,before)~=0) rfalse; ! Run before routine(s)
555 "You speak the chant, but the Gods are not kind this time, as nothing happens!";
557 "You speak the chant, but something sounds wrong. Nothing happens \
560 if (RunRoutines(noun,magic)~=0) rfalse;
565 if (verb_word=='c,cast' or 'cast')
566 objectloop (i in memory) PlaceInScope(i);
570 [ ParserError x i flag vb;
571 if (etype==VERB_PE or ASKSCOPE_PE)
572 { if (etype==ASKSCOPE_PE)
573 { if (verb_word=='cast') vb=1;
574 if (verb_word=='learn' or 'memorise' or 'memorize') vb=2;
575 if (verb_word=='copy') vb=3;
576 if (vb==0) { etype=CANTSEE_PE; rfalse; }
578 wn=verb_wordnum; if (vb~=0) wn++;
580 for (i=player+1:i<=top_object:i++)
581 if (i has is_spell && Refers(i,x)==1
582 && i has known_about) flag=1;
585 "You haven't got that chant prepared. [Type ~spells~ \
586 or ~chants~ to see what you do have prepared.]";
588 "Your training is such that you can only prepare such a chant \
589 with the aid of a prayer book containing it.";
591 "You have no text of that chant to copy.";
594 "You haven't prepared that chant, if indeed it is a chant.";
596 "You haven't access to that chant, if indeed it is a chant.";
601 ! Random attempt to code a ChooseObjects for the
602 ! coin choosing problem often seen in the Bank of Zork
603 [ ChooseObjects obj code;
604 if (code < 2) rfalse;
605 if ((action_to_be == ##Remove or ##Insert) &&
606 (obj has is_coin) && (obj in player)) return 9;
610 [ UnknownVerb word i;
611 objectloop (i in memory)
612 if (word==(i.&name)-->0) { the_spell_was = i; return 'c,cast'; }
617 if (v=='c,cast') { print "cast a chant at"; rtrue; }
621 ! ----------------------------------------------------------------------------
622 ! The player's spell book, and initial spells (to go with gnusto):
623 ! ----------------------------------------------------------------------------
625 Object prayer_book "prayer book"
626 class spell_book_class,
627 with name "prayer" "book" "my" "spellbook",
628 description "Mystical Chants^";
630 Object frotz_spell "cause an object to give off light"
634 [; if (second==0) "There is a brief, blinding flash of light.";
635 if (second has animate)
636 "The chant, not designed for living creatures, is denied.";
637 if (parent(second)==compass)
640 print "There is an almost blinding flash of light as "; DefArt(second);
641 print " begins to glow! It slowly fades to a less painful level, but ";
642 DefArt(second); " is now quite usable as a light source.";
646 ! ** Start of locations (and other objs) **
648 ! ***********************************************************************
650 ! ** LOCATIONS INSIDE MONESTARY (Mostly)
652 ! ***********************************************************************
654 Object MON_Chapel1 "Monastery Chapel"
655 with description "You are standing in a monastery chapel. \
656 All around you, fellow Brothers of the Order are standing, chanting. \
657 The eerie droning voices seem to reverberate into the air. At the \
658 front of the chapel, Brother Joseph stands in deep concentration, \
659 holding the Rod of the Ancients.",
663 MON_Chapel1.number = MON_Chapel1.number + 1;
664 Startup1(MON_Chapel1.number);
667 if (action==##Listen) "You hear heavy chanting";
668 if (action==##look) rfalse;
669 if (action==##Wait) rfalse;
670 "You are caught up in the collective chanting, and cannot break \
671 your concentration to do much of anything else.";
675 ! A fake obj to handle 'look at Joseph'
676 Object MON_FAKE "the Order" MON_Chapel1
677 with name "Joseph" "rod" "brothers",
678 description [; <<Look>>;],
681 ! A somewhat bulky routine to set our stage.
684 print "^Brother Joseph now speaks directly to the entire Order.^^\
685 ~Fellow Brothers, the year, as you know, is 976 GUE. \
686 A difficult time indeed. Ten years have passed since the Cataclysm \
687 brought forth by the Circle of Enchanters changed our world forever. \
688 The outside world as we know it is in turmoil. A period of great \
689 change is upon all of us.~^";
693 print "^Brother Joseph continues speaking.^^\
694 ~Our order has always maintained the strictest secrecy. Few \
695 outside of our order know of our existence. \
696 We are the keepers of the mystic balance \
697 that which embodies pure magic that can keep our world \
698 safe. It has always been thus -- we watch over all \
699 of Quendor, never interfering in the affairs of others, yet \
700 striving to maintain harmony.~^";
704 print "^Brother Joseph continues speaking.^^\
705 ~But we can no longer depend on enchantments to keep \
706 outsiders at bay. Magic as we know it is dying. The dreaded \
707 Age of Science is already upon us, and in short time, our \
708 order will be discovered, and the balance will be no more. Many of \
709 our order have gone out into the world in secret, in attempts \
710 to repair what has been broken, but alas, this appears to be \
715 print "^Brother Joseph continues.^^\
716 ~I have brought you all forth today to say that although we \
717 cannot protect the future of Quendor, we can protect ourselves!~ \
718 He holds the Rod of the Ancients high. ~This holy Rod, which \
719 the Ancient Ones used to defeat the demon Anabais, \
720 has the power to protect our order. I have discovered a lost mystic \
721 cube!~ He holds a white, featureless cube high in his other hand. \
722 ~This cube, when joined with the Rod of the Ancients, will \
723 preserve our order forever, sequestering all of us in another time, \
728 print "^There is a momentous pause. ^^\
729 Brother Joseph looks at the entire Order. \
730 ~May the Gods smile down upon us on this day! We go now, \
731 into the unknown!~ He triumphantly joins the white cube to \
732 the end of the Rod of the Ancients.^^\
733 There is a sudden, blinding white flash! The chanting is instantly \
734 broken by a tremendous thunderclap! Brother Joseph is suddenly \
735 thrown back by a great force, and to your horror, the Rod of the \
736 Ancients breaks apart! Four pieces now float serenely above the \
737 altar, above a strange black globe that seems to crackle with energy.^^\
739 The voice comes from nowhere and everywhere. The black sphere \
740 pulsates with lightning.^^\
741 ~ANABAIS IS FREE AGAIN!~ The voice pauses. \
742 ~I see you found my fake mystic cube \
743 Joseph. I knew that someday, someone would find it, and free \
744 me from my prison!~ The voice pauses again. ~To show my gratitude, I'm \
745 scattering this broken symbol to the corners of the world!~ \
746 The pieces of the rod suddenly disappear!^^\
747 ~Watch out!~ someone cries. \
748 The black sphere suddenly expands with alarming speed. \
749 Seconds later, a violent explosion seems to jar the very \
750 ground you stand on, and a black void covers all.^^\
751 You awaken in your room in a cold sweat. Was it all a terrible \
752 dream? The day beckons...^";
753 PlayerTo(MON_your_quarters);
754 ! remove MON_Chapel1; clean up memory (NOTE: This is futile)
760 Object MON_your_quarters "Your Quarters"
761 with name "furnishing" "furnishings",
762 description "You are in your room in the Monastery. It is \
763 sparsely furnished, but certainly feels like home. The exit \
768 Object note "note" MON_your_quarters
770 description "The note, in a hastily written scrawl, reads:^\
771 ~Please stop by the chapel as soon as you can.^\
777 !Object staff "staff" MON_your_quarters
778 ! with name "staff" "walking" "trusty" "stick",
779 ! initial "Your trusty walking staff is right where you left it.",
780 ! description "A stout piece of pine you found while on a nature \
781 ! walk, this staff has served you well on many journeys.",
786 Object sleeppallet "sleeping pallet" MON_your_quarters
787 with name "pallet" "sleeping" "roll",
788 description "This is your sleeping pallet, a short portable sleeping roll \
789 made of straw. It's softer than it looks.",
792 Go: if (player in self) "You'll have to get off the sleeping \
795 has supporter enterable;
797 Object MON_f1hall1 "Hallway (near your quarters)"
798 with description "You are in a hallway running west and east. The \
799 vaulted ceilings are a nice touch. Your \
800 quarters are to the south.",
801 name "vaulted" "ceiling",
802 s_to MON_your_quarters,
807 Object MON_f1hall3 "Hallway (near quarters of Palemon and TuffBerry)"
808 with description "You are in a hallway running west and east. \
809 Brother TuffBerry's quarters lie to the south. Brother Palemon's \
810 quarters are to the north.",
813 n_to MON_Palemon_quarters,
814 s_to MON_Tuffberry_quarters,
817 Object MON_f1hall4 "Hallway (east end)"
818 with description "You are at the east end of an east-west hallway. \
819 Brother Joseph's quarters lie to the north, and Brother Toolbox's \
820 quarters lie to the south.",
821 ! The acolyte chambers lie to the east.",
823 ! n_to MON_Joseph_quarters,
824 n_to "It doesn't look like Joseph is in. Perhaps you can find \
826 s_to MON_Toolbox_quarters,
827 ! e_to MON_acolyte_chambers,
830 ! Object MON_acolyte_chambers "Acolyte Chambers"
831 ! with description "You are in a long chamber that serves as the home \
832 ! for the many devoted acolytes of the Order. The room is currently \
837 Object MON_f1hall2 "Hallway (west end)"
838 with description "You are at the west end of an east-west hallway. \
839 There are stairs up and down here, and an exit to the west.",
847 Object MON_garden "Monastery Gardens"
848 with description "You are in the Monastery gardens, where various \
849 shrubs and conifers are covered in a light blanket of snow. \
850 An open cloister lies to the west, while \
851 a doorway heads east.",
852 name "cloister" "doorway" "shrubs" "conifers",
857 !Nearby shrubs "snow-covered shrubs"
858 ! with name "shrubs" "shrub" "snow-covered" "conifers" "conifer" "plants",
859 ! description "Good thing they're evergreen.",
862 Object sand "sand" MON_garden
864 initial "A small area in the snow has been cleared for late winter \
865 planting, and some sand has been sprinkled here and there.",
866 description "A handful of sand, nothing more, nothing less.",
872 Object MON_cloister "Cloister Walkway"
873 with description "You are in an open cloister, that runs along the \
874 Monastery gardens to the east. To the north is the main wing of the \
875 Monastery. To the south is the entrance hall.",
879 s_to MON_Entrance_hall,
882 Object MON_Entrance_hall "Entrance Hall"
883 with description "This is the large entrance hall to the Monastery. \
884 Many a devoted visitor has passed through this place. \
885 There is an exit to the outside world to the \
886 south, and the rest of the Monastery lies to the north.",
887 s_to Cliff_face, out_to Cliff_face,
891 if ((noun==s_obj) || (noun==out_obj))
892 print "You are surprised by a cold blast of wind as you leave the Monastery!^";
896 if ((noun==in_obj) || (noun==n_obj))
897 print "You are greeted by relatively warm and cozy air.^";
901 Object MON_Main_hall "Main Hall"
902 with description "This is the main hall of worship in the Monastery. \
903 A large domed ceiling hides some sort of lighting that create a warm yet \
904 serene atmosphere. A covered walk to the rest of the Monastery lies to \
905 the south. To the north is the Monastery chapel. A brazier sits in \
906 the center of the room.",
907 name "dome" "ceiling" "lighting" "atmosphere",
912 Nearby brazier "brazier"
914 description "This is a silver incense brazier, somewhat similar to \
915 an ornamental bowl on a tripod. Brother Palemon supposedly \
916 found it on one of his many journeys.",
919 "That's been in the Monastery for years. People would \
920 be upset if you took it.";
923 if (noun has is_sphere) {
924 print "As you place the sphere in the brazier, \
925 you feel a strange sensation. Suddenly, the brazier is filled \
927 if (noun == brown_sphere)
929 if (noun == green_sphere)
931 if (noun == red_sphere)
932 print "burning embers!";
933 if (noun == silver_sphere)
934 print "white vapors!";
935 " No, wait, it's empty again. You hastily \
936 withdraw the sphere, and try to clear your mind.";
938 else "That doesn't seem quite appropriate.";
941 has scenery container open;
943 Object MON_Chapel2 "Monastery Chapel"
944 with description "You are in the Monastery Chapel, the site of the \
945 recent appearance of the legendary Anabais. Signs of the \
946 recent visit include the slightly scorched walls, and the \
947 reek of brimstone. Wood pews are arranged in a circle \
948 around the central altar. The exit is south.",
949 name "pews" "scorched",
953 "You detect the faint odor of brimstone.";
955 ! if ((parent(Joseph)==MON_Chapel2) && (Joseph hasnt general))
956 ! "Shhh. You don't want to abruptly disturb Joseph like that.";
959 ! if ((parent(Joseph)==MON_Chapel2) && (Joseph has general) &&
960 ! (WeightOf(Joseph) > 140)) {
961 ! if (WeightOf(Joseph) == 149) {
962 ! Joseph.weight = 139;
963 ! print "^As you leave, Brother Joseph calls out \
964 ! ~Oh, and take something for that cold!~^";
967 ! if (WeightOf(Joseph) == 148) {
968 ! Joseph.weight = 139;
969 ! print "^As you leave, Brother Joseph calls out \
970 ! ~Oh, and remember -- reading the scriptures \
971 ! is one sure way of maintaining an active mind!~^";
974 ! if (WeightOf(Joseph) == 147) {
975 ! Joseph.weight = 139;
976 ! print "^As you leave, Brother Joseph calls out \
977 ! ~Oh, and remember -- mirth is wonderful for the soul, \
978 ! in moderation, of course.~^";
981 ! add in any others here...
985 ! if (Joseph hasnt general) {
986 ! give Joseph general;
987 ! Joseph.weight = 149;
988 ! JosephWakeAction();
992 ! if (Joseph hasnt general) {
993 ! give Joseph general;
994 ! Joseph.weight = 148;
995 ! JosephWakeAction();
999 ! if (Joseph hasnt general) {
1000 ! give Joseph general;
1001 ! Joseph.weight = 147;
1002 ! JosephWakeAction();
1006 ! if (Joseph hasnt general) {
1007 ! give Joseph general;
1008 ! Joseph.weight = 146;
1009 ! JosephWakeAction();
1010 ! move (inp1) to MON_Chapel2;
1016 ! And now, the incredible shrinking Brother Joseph...
1017 ! Modified 3/16 -- this puzzle seems to be unpopular...
1018 Object Joseph "Joseph" MON_Chapel2
1019 with name "Brother" "Joseph",
1020 description "Brother Joseph is a pale man, with gray eyes, a fine \
1021 beard, and a finer disposition.",
1023 number 0, ! used to hold count of (fake) rod pieces received
1025 ! if (self hasnt general)
1026 ! "Brother Joseph is kneeling in front of the remains of the altar, \
1027 ! his eyes closed, deep in meditation.";
1029 "Brother Joseph is here, standing by the altar.";
1032 ! if ((WeightOf(Joseph) == 150) && ((action ~= ##Attack) ||
1033 ! (action ~= ##WakeOther)))
1034 ! "Perhaps it's best not to bother him, he seems very \
1035 ! deep in meditation.";
1037 ! if (WeightOf(Joseph) == 150)
1038 ! "Joseph isn't asleep, just meditating. You may need to \
1039 !do something subtle to rouse him.";
1042 Player_Lives_Left = 0;
1043 "Your blow sends Brother Joseph staggering back.^^\
1044 Brother Joseph gets up and brushes himself off, and glares \
1045 at you. Ro-roo, I think you made him mad. \
1046 You remember, of course, that Brother Joseph is a renowned \
1047 full-contact martial artist?^^\
1048 ~Impudent wretch! I'll show you how we deal with non-believers here!~\
1049 ^^Suddenly, Brother Joseph produces a gigantic mallet from \
1050 beneath his robes and clobbers you into a pulp.";
1052 if (second=='amulet')
1053 "~Don't leave the Monastery without it!~";
1054 if (second=='joseph')
1055 "Joseph smiles. ~I believe we've been introduced.~";
1057 "~We must recover the Rod before it is too late!~";
1058 if (second=='anabais')
1059 "~Beware the demon! He is most cunning and dangerous!~";
1060 if (second=='scriptures')
1061 "~Study the holy scriptures, and you will be rewarded.~";
1062 if (second=='palemon' or 'tuffberry' or 'toolbox')
1063 "~I fear I know not where his feet now tread.~";
1064 "~I don't know anything about that. Perhaps you should \
1065 consult our library upstairs?~";
1071 if (noun has is_rod)
1072 "~Have you succeeded in retrieving the Rod? If so, \
1073 do what you feel is right.~";
1076 if (noun has is_rod) {
1077 if ((noun==black_rod_piece) || (noun==white_rod_piece) ||
1078 (noun==smoke_rod_piece) || (noun==gray_rod_piece)) {
1079 Joseph.number = Joseph.number + 1;
1081 print "Joseph takes the rod piece. ";
1082 if (Joseph.number==4) {
1083 ! trouble -- got the whole fake rod to Joseph...
1085 Player_Lives_Left = 0;
1087 remember your acts of bravery forever,~ Joseph says, as he brings out \
1088 all four rod pieces and tries to join them together. A sudden burst \
1089 of light blinds you!^^\
1090 When you can see again, a large black sphere of malevolent energy \
1091 floats nearby! Joseph, either dead or stunned, lies in one corner \
1092 of the room. The four rod pieces are floating above the sphere.^^\
1093 ~Foolish little priest,~ a evil voice says in you mind. ~You \
1094 have only brought upon yourself your own undoing. With my rod returned \
1095 by an innocent, the pact is complete. Come forth, my brothers, \
1096 for our time of power is at hand!~^^\
1097 The last thing you hear is mocking laughter, before the world \
1098 as you know it comes to a close.";
1101 "~Well done, brave Priest!~ he says.";
1104 "Joseph looks at the rod piece and seems puzzled. ~This isn't any part \
1105 of the Rod of the Ancients that I've ever seen. And yet, it seems similar.~ \
1106 He hands it back to you. ~In this, my teachings can help you no \
1109 else "Joseph waves off your offering. ~You may \
1110 need that in your quest.~";
1112 if (special_word=='hello' or 'hi')
1113 "Joseph smiles. ~Hello.~";
1115 "At the moment, Joseph seems to be \
1116 preoccupied with spiritual matters.";
1120 "Brother Joseph stops you in mid-chant. ~That won't be necessary~";
1123 if (self hasnt general) {
1125 move Amulet to player;
1126 "^Joseph smiles as you enter. \
1127 ~I'm glad you found me. As you know, thanks to the old \
1128 fool standing before you, the demon Anabais is loose upon \
1129 the world once more. He has broken the Rod of the Ancients \
1130 which was keeping our house and Order protected from outsiders. \
1131 It is a sorry day for us all.~ Joseph pauses for a moment. \
1132 ~You are our final hope in a time of chaos. Brothers \
1133 Palemon, TuffBerry and Toolbox have left the Order, and only \
1134 you remain. I must now ask you to serve the Order which you \
1135 have so faithfully served in the past. No short order this, for \
1136 our continued existence depends on it, but you must go out into \
1137 a world gone mad alone, and retrieve the four broken pieces of \
1138 the Rod of the Ancients, and return them here to me, so that we \
1139 can rid the world of the evil we have loosed!~^^Brother Joseph \
1140 pauses and searches his robes.^^~Here, you will need this,~ he \
1141 says, giving you a strange amulet. ~Without this amulet, the \
1142 Ancient Ones cannot give you the mystic aid that you will most \
1143 certainly need. But I waste much time. Go now, and may the \
1144 Gods smile upon us all.~";
1149 Object Amulet "holy amulet"
1150 with name "amulet" "holy",
1151 description "This small golden amulet and chain seem to \
1152 shimmer with a strange mystic saffron energy. The \
1153 pendant portion of the amulet is in the shape of a small \
1159 if (self hasnt worn) { give self worn;
1160 "As you place the amulet around your neck, \
1161 you feel a strange sense of mystic power.";
1163 else "You're already wearing that.";
1165 has clothing scored;
1167 ! [ JosephWakeAction;
1168 ! print "^You make a subtle noise^^\
1169 ! Brother Joseph opens his eyes, breathes deeply, and smiles.^^\
1170 ! ~I'm glad you found me. As you know, thanks to the old \
1171 ! fool standing before you, the demon Anabais is loose upon \
1172 ! the world once more. He has broken the Rod of the Ancients \
1173 ! which was keeping our house and Order protected from outsiders. \
1174 ! It is a sorry day for us all.~ Joseph pauses for a moment. \
1175 ! ~You are our final hope in a time of chaos. Brothers \
1176 ! Palemon, TuffBerry and Toolbox have left the Order, and only \
1177 ! you remain. I must now ask you to serve the Order which you \
1178 ! have so faithfully served in the past. No short order this, for \
1179 ! our continued existence depends on it, but you must go out into \
1180 ! a world gone mad alone, and retrieve the four broken pieces of \
1181 ! the Rod of the Ancients, and return them here to me, so that we \
1182 ! can rid the world of the evil we have loosed!~^^Brother Joseph \
1183 ! pauses and searches his robes.^^~Here, you will need this,~ he \
1184 ! says, giving you a strange amulet. ~Without this amulet, the \
1185 ! Ancient Ones cannot give you the mystic aid that you will most \
1186 ! certainly need. But I waste much time. Go now, and may the \
1187 ! Gods smile upon us all.~";
1188 ! move Amulet to player;
1192 Object altar "altar"
1193 with name "altar" "damaged" "cube",
1194 description "The altar is roughly the shape of a five foot \
1195 white cube. The top edges appear to be singed black and there \
1196 are cracks and chips all over.",
1197 found_in MON_Chapel1 MON_Chapel2,
1200 if (self hasnt general) {
1202 move holywater to player;
1203 "You uncover a vial of holy water.";
1206 has scenery supporter;
1208 Object holywater "vial of holy water"
1209 with name "holy" "water" "vial",
1210 description "A small glass vial of holy water.",
1212 Eat: "You might want to try drinking it instead.";
1214 Player_HP_CUR = Player_HP_MAX;
1215 "You quaff the holy water with a simple ceremony. \
1216 You feel physically and spiritually refreshed.";
1221 Object MON_Palemon_quarters "Brother Palemon's Quarters"
1223 print "You are in Brother Palemon's quarters, which \
1224 have been left unattended ever since Brother Palemon's \
1225 unexplained disappearance many years ago";
1226 if (self has general)
1227 print ". To the west, a small secret door in the wall leads \
1229 ". The exit is south.";
1233 if (self hasnt general)
1234 "You can't go that way.";
1235 else return MON_Hidden_sanctum;
1239 if (noun == w_obj) {
1240 if (self hasnt general) {
1242 "Pushing the west wall reveals a hidden secret door! \
1243 You've been in these quarters before, but certainly never noticed \
1244 anything like this!";
1246 else "Nothing happens.";
1249 if ((noun == w_obj) && (self hasnt general))
1250 "Oddly, a section of the west wall feels slightly thin.";
1254 Object journal "thin journal" MON_Palemon_quarters
1255 with name "journal" "thin",
1256 description "This journal is very strange indeed. Brother \
1257 Palemon seems to have been very preoccupied up to the point \
1258 of his disappearance with strange accursed places that he \
1259 claims are located all over Quendor. He also makes several \
1260 references to evil 'spirits' found in these places. You also \
1261 notice that several pages of parchment near the back of \
1262 the journal have been torn out.",
1267 Object MON_Hidden_sanctum "Hidden Sanctum"
1268 with description "You are standing in a small chamber that obviously hasn't \
1269 been used in quite some time -- the cobwebs and dust are several \
1270 layers thick. There is a short crawl east.",
1271 name "cobwebs" "dust",
1272 e_to MON_Palemon_quarters,
1276 Object dusty_scroll "dusty scroll" MON_Hidden_sanctum
1281 Object foblub_spell "deliver magnificent sermon (glue audience to seats)" dusty_scroll
1285 if (second hasnt animate)
1286 "Your sermon goes unheard.";
1287 if (second == player)
1288 "Well, I know you like listening to yourself, but \
1289 isn't this a bit much?";
1290 "You give a wonderful sermon about how one's future \
1291 affects one's past, but no one seems to be listening.";
1296 Object MON_TuffBerry_quarters "Brother TuffBerry's Quarters"
1297 with description "You are in Brother TuffBerry's quarters, vacant \
1298 since he undertook his quest for Joseph not long ago. The \
1303 Object page "torn page" MON_TuffBerry_quarters
1304 with name "torn" "page",
1307 description "This page was apparently \
1308 torn from a larger document of some sort. All that is left \
1310 ~...fear. Just today I heard again something below \
1311 me when I was meditating upstairs. \
1312 It sounded like a person, or something alive at least \
1313 was just below, trying to quietly move around unnoticed. \
1315 impossible, and yet I cannot doubt what I heard. \
1316 Palemon tells me I'm hearing spirits, but little does \
1317 he know that I once heard the same noises in his \
1318 very chambers! He was not around at the time, but \
1319 to the west, behind the wall, I...~",
1323 !Object MON_Joseph_quarters "Brother Joseph's Quarters"
1324 ! with description "You are in Brother Joseph's quarters. The hallway lies \
1329 Object MON_Toolbox_quarters "Brother Toolbox's Quarters"
1330 with description "You are in Brother Toolbox's quarters, vacant \
1331 ever since he left the order due to differences many years \
1332 ago. The exit is north.",
1336 Object tb_diary "diary" MON_Toolbox_quarters
1337 with name "diary" "toolbox",
1339 ~-- <944 GUE> Today Brother Joseph tried to explain the \
1340 essence of how we channel magic energy through our \
1341 amulets. To me, this seems to pale in comparison with \
1342 the seemingly innate abilities of those who call \
1343 themselves Enchanters. Joseph did show me a nice \
1344 trick, however. He brought the Rod of the Ancients near \
1345 my amulet, and the amulet gave off a sudden purple flash of light! \
1346 I'll have to try that one on the Acolytes tomorrow.~^^\
1347 (there isn't much else of interest until the \
1348 very last entry, which is not dated)^^\
1349 ~-- So long diary. I'm now off to seek greater spiritual \
1350 guidance in Thriff. I hear the summers there are very nice \
1356 Object folded_scroll "folded scroll" MON_Toolbox_quarters
1361 Object espnis_spell "deliver dull sermon (cause sleep)" folded_scroll
1365 if (second hasnt animate)
1366 "Your sermon goes unheard.";
1367 if (second == player)
1368 "A preacher boring himself to sleep with his \
1369 own sermon? This doesn't seem prudent.";
1371 " listens as you begin your sermon about the general \
1372 religious practices of the royal families of the past, but \
1373 only stifles a yawn when you finish.";
1378 Object MON_f2hall1 "Hallway (second floor, west)"
1379 with description "You are in a hallway on the second floor \
1380 of the Monastery. The hallway continues east, while \
1381 stairs lead downwards.",
1387 Object MON_f2hall2 "Hallway (second floor, east)"
1388 with description "You are in a hallway on the second floor \
1389 of the Monastery that runs east-to-west. To the \
1390 north is the private meditation room. To the east \
1391 is the Monastery library. To the northeast is an \
1392 entrance to the steeple room.",
1394 n_to MON_priv_med_room,
1396 ne_to MON_Steeple_room,
1399 Object MON_priv_med_room "Private Meditation Room"
1400 with description "You are in a small bare chamber that is \
1401 used for private meditation and worship. The only \
1402 exit lies to the south.",
1406 Object MON_Library "Monastery Library"
1407 with description "You are in the Monastery library, a cozy, \
1408 almost cramped room with shelves of various books. \
1409 The exit is to the west.",
1413 Object lib_shelves "shelves" MON_Library
1414 with name "shelves" "bookshelves",
1415 description "Just some bookshelves.",
1416 has scenery supporter;
1421 ! -- Of course, this is a ruse created from the deviations of
1422 ! Anabais. Grounded in some fact though. Each section has a
1423 ! lie, which may not initially be obvious. Truthful sections
1424 ! are scattered over Quendor.
1425 Object HolyScriptures1 "a copy of the Holy Scriptures" lib_shelves
1426 with name "holy" "scriptures" "copy",
1427 description "This sacred tome details the teachings and \
1428 beliefs of the Order, of which it's certainly always good \
1429 practice to re-familiarize yourself with. The scriptures are \
1430 divided into several sections. Sections that \
1431 can be consulted in greater detail include:^^\
1435 ~(Book of the) Mystical~^\
1436 ~(Book of the) Planes~^\
1437 ~(Book of the) Ancients~^\
1438 ~Legend of the Rod~",
1439 before [ w1; Consult:
1440 if (consult_words > 1)
1441 "You'll have to consult the sacred book by \
1442 individual section.";
1443 wn = consult_from; w1 = NextWord();
1445 'doctrines', 'doctrine', 'canon':
1446 "~THE SACRED DOCTRINES OF THE ORDER OF BALANCE:^^\
1447 Thou shalt strive to achieve balance in a world filled with unbalance.^\
1448 Thou shalt pray to the Deities in moments of inner reflection.^\
1449 Thou shalt not harm innocents nor aid them -- this is the way of balance.~";
1451 'demons', 'demon', 'anabais':
1452 "~Fear not, mortal men^\
1453 though your world be filled with demons^\
1455 Thou alone can prevail^\
1456 as The Ancient Ones^\
1457 against Anabais, the trickster^\
1459 ! LIE - The ancient ones lost to Anabais and the other demons
1460 'spirits', 'spirit':
1461 "~Before the dawn of time, know that our world was \
1462 filled with evil spirits of the elements, \
1463 until mankind came upon the land and vanquished them \
1465 ! LIE - spirits still exist.
1466 'mystic', 'mystical', 'magic', 'chant':
1467 "~If one is true of doubts, then a believer in the \
1468 great Harmony can draw upon the powers of the Ancients \
1469 and perform feats of mystic power anywhere. Remember that in \
1470 so doing, thou must act only as the channel of mystical \
1471 power for the Ancient Ones.~";
1472 ! LIE - powers don't work everywhere, and not always.
1473 'planes', 'plane', 'atrii', 'hades':
1474 "~Let not the ways of the mortal life \
1475 dissuade the knowledge of higher and lower planes \
1477 For, beyond mortal reach are places where those who \
1478 have truly served the Order and those who have truly \
1479 forsaken the Harmony of Balance will find themselves \
1480 in death. These are the Ethereal Plane of Atrii and \
1481 the plane of the damned -- Hades.~";
1482 ! LIE - don't have to die to reach Atrii.
1483 'ancients', 'ancient':
1484 "~Trust in The Ancient Ones, those Three who showed mankind the \
1485 way of Balance and Harmony.~";
1486 ! LIE - Four ancient ones existed.
1488 "~Anabais foresaw his own demise when he dared to \
1489 challenge the Ancient Ones. From powers of light and \
1490 darkness, the Ancient Ones constructed that holy Rod that \
1491 we know only as the Rod of the Ancients, and did smite \
1492 the demon Anabais so grievously, that they did imprison \
1493 him in that very Rod, where he could do no harm. This \
1494 very Rod was made of pieces of ancient elemental energy, \
1495 once separated. Only the powers of the Ancients could \
1496 bring them together.~";
1497 ! LIE - Anabais never imprisoned, etc.
1498 default: "There doesn't seem to be a section \
1502 if (the_spell_was == ledak_spell) {
1504 "The scriptures are surrounded by a \
1505 yellow glow. To your horror, the tome evaporates into nothing!";
1513 ! (Several scraps of
1514 ! Palemon's journal are scattered around Quendor,
1515 ! contradicting the ancient scriptures)
1517 ! (faded -- spirits exist)
1518 Object p2 "faded parchment" MON_Hidden_sanctum
1519 class parchment_class,
1521 description "~...are real! I have seen much evidence in the \
1522 jungles of Miznia, marshes of Fublio Valley, the ruins \
1523 of old Egreth and in Aragain itself! I believe that \
1524 they are associated with certain basic elements in the \
1525 surrounding area. But they dare not show themselves now, \
1526 not while magic is strong! Woe unto us, should the powers \
1527 of magic cease, as there would be nothing to stop their \
1531 Object MON_Steeple_room "Steeple Room"
1532 with description "You are in a round room with colored-glass \
1533 windows. Wood beams line the walls and rise to form \
1534 a short point in the peaked ceiling above. A small \
1535 walkway returns to the southwest. A long wood table \
1536 sits in the center of the room.",
1537 name "windows" "glass" "beams" "walkway" "handle" "latch",
1539 !out_to MON_Steeple_roof,
1540 out_to steeple_window,
1543 if ((noun == out_obj) && (steeple_window has open)) {
1544 if (random(10) < 3) {
1545 print "^You climb out the open window and somehow manage \
1550 print "^You climb out the open window, but slip on the icy sill";
1551 if (has_resist_gravity == 0) ", and plummet to the ground!";
1553 "! As you float slowly downwards, you can't help but notice the \
1554 hungry-looking winter dire wolf below, waiting for you to land...";
1560 Object MON_Steeple_roof "Steeple Roof"
1561 with description "You are on a very narrow ledge outside \
1562 the Monastery steeple. The snow and wind are doing \
1563 their best to send you to a ungracious death below. The \
1564 steeple roof is quite sharply slanted.",
1565 in_to steeple_window,
1566 name "roof" "ledge" "wind",
1567 cant_go "It's hard enough staying on the ledge.",
1571 if (has_resist_gravity==0)
1572 "Well, if you insist. The ground breaks most of the \
1573 bones in your body, including the important ones.";
1575 "You float downwards gracefully, into the waiting \
1576 jaws of a winter dire wolf."; ! <shrug>
1580 Object steeple_window "steeple window"
1581 with name "window" "rose" "steeple",
1582 found_in MON_Steeple_room MON_Steeple_roof,
1584 print "A large rose-colored glass window";
1585 if (location==MON_Steeple_room)
1586 ", with a handle and latch";
1590 if (location==MON_Steeple_room) {
1592 "Someone has left a rose-colored window open and some \
1594 "A large rose-colored window lets some light in.";
1596 if (location==MON_Steeple_roof) {
1598 "A window opens into the steeple proper.";
1599 "A large rose-colored window is partially covered with snow here.";
1603 if (location==MON_Steeple_room) return out_to;
1607 if (location==MON_Steeple_room) return MON_Steeple_roof;
1608 return MON_Steeple_room;
1612 if (location==MON_Steeple_room) <<Go out_obj>>;
1615 if ((self hasnt open) && (location==MON_Steeple_roof))
1616 "Unfortunately, the window opens inward, and the latch \
1617 and handle are on the inside.";
1618 if ((self hasnt open) && (location==MON_Steeple_room)) {
1620 "You turn and yank the window handle and pull. \
1621 A rush of wind and snow greets you as you open \
1625 if ((self has open) && (location==MON_Steeple_roof))
1626 "It doesn't seem to want to stay shut. You can't \
1627 quite reach the window latch from out here.";
1629 "The window glass remains unmarred. It's probably made of \
1630 that especially thick lead-glass that the Monastery got \
1631 because Brother Toolbox kept complaining about drafts.";
1633 if (self hasnt open)
1634 "It doesn't budge.";
1636 "The window looks out into a winter wonderland.";
1638 has static door openable;
1640 Object steeple_table "long table" MON_Steeple_room
1641 with name "table" "long" "steeple",
1642 description "This long wood table has been used for various \
1643 private meetings and impromptu get-togethers between \
1644 members of the Order in the past.",
1645 has scenery supporter;
1647 Object MON_f0hall1 "Hallway (basement)"
1648 with description "You are in a hallway in the Monastery basement. \
1649 The hallway continues to the east, and stairs lead upwards.",
1655 Object MON_Refectory "Refectory"
1656 with description "You are in the Refectory, the general dining \
1657 area for members of the Order. You grimace at the lingering scent of \
1658 Brother Pufpistery's favorite dish -- Borphbelly stew. \
1659 Several large oak tables and benches adorn this otherwise \
1660 bare room. An exit lies to the west, the kitchen is to \
1661 the north, and another exit lies to the east.",
1662 name "oak" "tables" "benches",
1667 Smell: "Even the faintest lingering scent of Borphbelly stew \
1668 is enough to make you feel like fasting.";
1672 Object MON_Kitchen "Monastery Kitchen"
1673 with description "You are in Brother Pufpistery's domain -- the \
1674 dreaded acolyte kitchen. A huge soup \
1675 cauldron sits unused nearby. The refectory is \
1679 Smell: "The lingering scent of Borphbelly stew \
1680 is stronger here, unfortunately.";
1684 Object cauldrons "cauldron" MON_Kitchen
1685 with name "cauldron" "vat",
1686 description "This large iron soup cauldron has the \
1687 unmistakable odor of Borphbelly stew. Ugg.",
1692 if (the_spell_was == bekdab_spell)
1693 "The soup cauldron rusts a bit.";
1695 has scenery container open;
1697 Object preparing_table "preparing table" MON_Kitchen
1698 with name "table" "preparing",
1699 description "A heavy wood table with a well-used look.",
1702 if (the_spell_was == egdelp_spell)
1703 "The table is now covered in a waxy film. \
1704 All things considered, it actually looks cleaner now.";
1706 has static supporter;
1708 Object recipe_paper "scrap of paper" preparing_table
1709 with name "scrap" "recipe" "paper",
1710 description "It's a recipe torn from an issue of \
1711 ~Better Homes and Caverns~:^^\
1712 GUILDMASTER SNEFFLE'S PRIZE WINNING BIRTHDAY CAKE \
1715 -- 1 small sack of flour^\
1716 -- 1 large sugar cube^\
1717 -- 1 packet of baking powder^\
1719 -- 1 large corbie egg^\
1720 -- Dornberries, to taste^^\
1721 Mix the ingredients together. Fold the resulting \
1722 mixture the correct number of times (a single gloth \
1723 spell should do the trick). Bake in a GUE \
1724 Automatic oven on the ~cake~ setting.^^\
1725 Guildmaster Sneffle claims that ~the dornberries are \
1726 the secret to making a cake even the King would be \
1727 impressed with.~ He also notes that ~improper folding \
1728 of the dough will produce very poor results.~",
1733 Object MON_Storeroom "Storeroom"
1734 with description "You are in a small cramped storeroom, stocked \
1735 with various crates and barrels of foodstuffs. \
1736 The refectory is west.",
1737 name "crate" "crates" "foodstuffs",
1739 d_to secret_trapdoor,
1741 if ((random(20) == 1) && (secret_trapdoor notin MON_Storeroom))
1742 print "^A tiny mouse scurries into view, then disappears \
1748 if (secret_trapdoor hasnt general)
1749 "You can't go that way.";
1753 Object crate1 "large barrel" MON_Storeroom
1755 description "A large wooden barrel labeled ~DRIED PRUNES~.",
1758 if (the_spell_was==egdelp_spell)
1759 "The barrel is covered with a light \
1762 "The barrel is far too bulky to take.";
1764 "You'd probably need a hacksaw to do that. Besides, \
1765 look what it says it contains.";
1767 if (secret_trapdoor hasnt general) {
1768 give secret_trapdoor general;
1769 move secret_trapdoor to MON_Storeroom;
1770 "Well whaddya know, a trapdoor...";
1775 Object flour "sack of flour" crate1
1776 with name "flour" "sack",
1777 short_name "sack of flour",
1778 description "A small sack of flour, all-purpose.",
1783 Object MON_Caverns "Caverns"
1784 with description "You are in an low underground cavern, made of roughly \
1785 worked stone. An even lower tunnel travels east.",
1786 name "stone" "worked" "tunnel",
1787 u_to secret_trapdoor2,
1788 e_to cave_intersection,
1791 ! A two-way initially hidden trapdoor, which affects rooms.
1792 ! To my great chagrin, I couldn't code this in one obj (sigh).
1793 ! I admit it, this is my first Inform project.
1794 Object secret_trapdoor "trapdoor"
1795 with name "trapdoor" "trap" "door",
1796 description "A wooden trapdoor in the floor.",
1797 door_to MON_Caverns,
1801 "A trapdoor opens into darkness below.";
1802 "There is a closed trapdoor in the floor here.";
1805 Enter: <<Go d_obj>>;
1807 give MON_Caverns light;
1808 give secret_trapdoor2 open;
1811 give MON_Caverns ~light;
1812 give secret_trapdoor2 ~open;
1815 has static door openable;
1817 Object secret_trapdoor2 "trapdoor" MON_Caverns
1818 with name "trapdoor" "trap" "door",
1819 description "A wooden trapdoor in the ceiling.",
1820 door_to MON_Storeroom,
1824 "Light gleams in from an open trapdoor above.";
1825 "You notice a closed trapdoor in the ceiling.";
1828 Enter: <<Go u_obj>>;
1830 give MON_Caverns light;
1831 give secret_trapdoor open;
1834 give MON_Caverns ~light;
1835 give secret_trapdoor ~open;
1838 has static door openable;
1840 Object cave_intersection "Cave Intersection"
1842 print "You are in a large open cavern. The rough \
1843 limestone here was probably eroded by underground springs \
1844 to form the somewhat circular chamber you now stand in. \
1845 Oddly, there seems to have been a recent cave-in, as \
1846 piles of rubble line the walls. A tunnel \
1847 snakes off to the west";
1848 if (self has general)
1849 ". To the southeast, there is a wide square hole!";
1852 name "limestone" "rubble" "tunnel",
1853 ! cant_go "There's too much rubble",
1856 if (self hasnt general) rfalse;
1857 if (self has general) return Mystical_Cave;
1861 if ((noun == se_obj) && (self has general)) {
1862 if ((white_rod_piece in player) &&
1863 (black_rod_piece in player) &&
1864 (gray_rod_piece in player) &&
1865 (smoke_rod_piece in player)) {
1866 remove white_rod_piece;
1867 remove black_rod_piece;
1868 remove gray_rod_piece;
1869 remove smoke_rod_piece;
1870 Player_Lives_Left = 0; ! hope you saved...
1871 spell_block = 1; ! going into the endgame...
1872 print "^As you enter the tunnel, a strange \
1873 light surrounds you! The four rod pieces you were \
1874 carrying crumble into dust!^";
1877 "Well, the hole to the southeast seems obvious \
1878 enough. But, some mysterious force blocks the way! \
1879 Try as you might, you can't seem to enter it!";
1884 Object steel_wall "steel wall" cave_intersection
1885 with name "steel" "wall",
1886 description "A ten-by-ten slab of solid steel, this wall \
1887 must be at least a foot thick, and is accented by \
1888 large steel rivets that bolt it to the surrounding \
1890 initial "To the southeast, a huge steel wall demonstrates \
1891 a marked contrast to the otherwise drab surroundings.",
1893 Open: "I presume you have a blow-torch handy?";
1894 Push, Pull, Turn: "Not surprisingly, it doesn't move an inch.";
1895 LookUnder: "It's flush with the rock floor.";
1896 Cast: "The wall seems to absorb and nullify all magic!";
1901 ! ***********************************************************************
1903 ! ** GRAY MOUNTAINS AREA NEARBY MONESTARY
1905 ! ***********************************************************************
1907 Object Cliff_face "Cliff Face"
1908 with description "You are standing near the top of a snowy mountain peak. \
1909 The wind is quite cold and is making your teeth chatter. \
1910 The general vicinity is mostly snow and rock; however, the \
1911 entrance into the Monastery is to the north, all but hidden from view \
1912 by the enormous slabs of snow-covered rock that make up the \
1913 cliff face. There is a rough but obvious trail leading down \
1914 the mountain to the south. There is also another trail that \
1915 winds even further up the mountain peak almost hidden in the \
1917 name "peak" "wind" "rock" "structure" "slabs" "trail",
1918 n_to MON_Entrance_hall, in_to MON_Entrance_hall,
1919 s_to rocky_trail, d_to rocky_trail,
1920 e_to Covered_trail, u_to Covered_trail,
1923 Object Covered_trail "Covered Trail"
1924 with description "You are climbing up a small trail that gets periodically \
1925 lost in great bluffs of snow. The swirling snow makes seeing \
1926 an unusual effort. The trail leads downwards to a cliff face \
1927 to the west, and rises towards the mountain top to the north.",
1928 name "bluffs" "trail",
1929 w_to Cliff_face, d_to Cliff_face,
1930 n_to Mountain_peak, u_to Mountain_peak,
1933 Object Mountain_peak "Mountain Peak"
1935 print "You are standing on the top of a peak of the Gray \
1936 Mountains. A cold wind blows snow everywhere, obscuring what \
1937 would otherwise surely be a wonderful view of the surrounding \
1938 countryside. You can just make out some buildings to the far \
1939 south in Frostham. A snowy bluff marks the way back down";
1940 if (self hasnt general)
1941 ", or to the west, there appears to be a snowy outcropping. It seems to \
1942 hang precariously over the edge of the mountain, however.";
1945 name "wind" "peak" "mountains" "countryside" "buildings" "bluff",
1948 if (self has general)
1949 "Looks like the outcropping completely collapsed!";
1950 return Snowy_outcropping;
1954 if ((noun==w_obj) && (self hasnt general) && (player notin sleeppallet)) {
1955 ! if (WeightOf(player) > 25) {
1956 if (children(player) > 0) {
1957 print "As you start to tread out to the outcropping, you feel \
1958 the snow beneath your feet shifting under your sudden \
1960 if (random(10) > 6) {
1962 "start to turn back, but the entire \
1963 outcropping suddenly tilts under your weight, sending \
1964 you hurtling off the edge into oblivion!";
1967 "beat a hasty retreat back to the peak.";
1970 print "You carefully make your way onto the outcropping.^";
1973 "Not advisable, it's probably a long way down...";
1977 Object Snowy_outcropping "Snowy Outcropping"
1979 "You are standing on a snow-covered outcropping. \
1980 You are almost waist-deep in snow, and the blisteringly cold \
1981 winds aren't helping. The outcropping juts out alarmingly \
1982 over the western edge of the mountain. In fact, you can see the \
1983 Monastery steeple below this ledge. \
1984 The main portion of the mountain peak lies to the east.",
1985 name "winds" "steeple" "peak",
1989 "^There is an ominous creaking noise somewhere underfoot.";
1990 "^Some snow falls off the outermost edge of the outcropping.";
1995 print "You cautiously make your way back to the mountain top^";
1997 "That's not a very sound idea.";
1999 "Let's not be suicidal.";
2001 Outcrop_break(1); rtrue;
2003 Outcrop_break(2); rtrue;
2006 "You must have disturbed something! The entire outcropping \
2007 breaks away in an avalanche, and you plummet to your death!";
2008 Take, Touch, Push, Pull:
2009 if (noun==dirty_scroll) {
2010 if (random(10) > 5) {
2012 give Mountain_peak general;
2013 remove Snowy_Outcropping;
2014 move dirty_scroll to MON_Steeple_roof; ! it's still obtainable...
2015 "As you reach for the scroll, the entire outcropping lurches \
2016 alarmingly! Without warning, it \
2017 breaks away in an avalanche, and you plummet to your death!";
2019 "As you reach for the scroll, you hear a disturbing rumbling \
2020 from somewhere underfoot, and you step back hastily.";
2024 Outcrop_break(1); rtrue;
2026 "To who/whom, exactly?";
2030 [ Outcrop_break type;
2032 print "You give the best bellow you can muster, given the current \
2033 weather conditions.";
2035 print "Understandable, given the weather conditions.";
2036 print " Unfortunately, you seem to have disturbed \
2037 something, as the entire outcropping gives way in a brief but \
2038 powerful avalanche! You tumble through the air, followed by \
2039 a large quantity of snow! But suddenly, you see the \
2040 Monastery steeple rushing up to meet you!^^THUMP!^^\
2041 You lie dazed for a moment. Miraculously, the dirty scroll \
2042 lands next to you!^";
2043 give Mountain_peak general;
2044 move dirty_scroll to MON_Steeple_roof;
2045 remove Snowy_Outcropping;
2046 PlayerTo(MON_Steeple_roof);
2050 Object dirty_scroll "dirty scroll" Snowy_outcropping
2054 if (location==Snowy_outcropping)
2055 "There is a dirty scroll here, practically buried in the snow!";
2056 "There is a dirty scroll here.";
2060 Object swanko_spell "banish spirit" dirty_scroll
2066 "The chant, looking for a locus of spiritual energy, fails.";
2067 "The general vicinity seems pretty free of spirits now.";
2071 Object rocky_trail "Rocky Mountain Trail"
2072 with description "You are on a rocky mountain trail \
2073 that winds up and down a mountain. Patches of \
2074 snow can be found here and there. The trail \
2075 continues down the mountain to the south, or \
2078 d_to snowy_intersection,
2079 s_to snowy_intersection,
2084 Object snowy_intersection "Snowy Intersection"
2085 with description "You are at a snow-filled crossroads \
2086 in a mountain trail. Paths lead north towards \
2087 the top of the mountain, east, west, and south \
2088 towards the base of the mountain.",
2089 name "trail" "mountain",
2091 s_to North_of_river,
2092 e_to "The path east is blocked after a short distance by a huge snow drift.",
2096 Object stone_marker "stone marker"
2097 with initial "There is a large stone marker here, in \
2098 the center of the intersection.",
2099 name "stone" "marker" "obelisk",
2101 print "This odd stone structure, partially \
2102 covered in snow, looks quite old and mysterious. \
2103 It's about seven feet tall, and is shaped like \
2105 if (self hasnt general)
2106 ", with the top partially broken off.";
2109 found_in snowy_intersection snowy_intersection2,
2112 ! (second snowy intersection -- in the "past")
2113 Object snowy_intersection2 "Snowy Intersection"
2114 with description "You are at a snow-filled crossroads \
2115 in a mountain trail. Paths lead north towards \
2116 the top of the mountain, east, west, and south \
2117 towards the base of the mountain.^^Something \
2118 seems familiar, yet different, about this place.",
2119 name "trail" "mountain",
2120 n_to "The path north ends after a short distance.",
2121 s_to "The path north ends after a short distance.",
2122 w_to "The path north ends after a short distance.",
2123 e_to "The path east is blocked after a short distance by a huge snow drift.",
2127 Object stone_marker_top "broken stone top"
2128 with name "top" "stone" "pinnacle" "broken",
2131 description "The top pinnacle from the stone marker. \
2132 You notice that it's partially hollow inside.",
2135 if ((noun==silver_rod_piece) &&
2136 (snowy_intersection has general)) {
2137 move silver_rod_piece to self;
2138 give snowy_intersection ~general;
2141 print "As you place the rod piece in the \
2142 broken stone piece, you sense a force from above pull you \
2143 skywards! In moments, you are high above the snow covered \
2144 mountains, nearing the sky, which you notice is strangely \
2146 PlayerTo(Mystical_Cave);
2148 Mystical_Cave.number = Mystical_Cave.number + 1;
2152 has container static open;
2154 Object Top_of_drop "Top of Snowy Slope"
2155 with description "You're at the top of a short downwards slope into \
2156 a snowy area below. A path leads east. You could also \
2157 slide down the slope. A lone tree stands here, overlooking \
2160 e_to snowy_intersection,
2161 d_to Bottom_of_drop,
2162 w_to Bottom_of_drop,
2164 if (tree1 has general) <<Climb tree1>>;
2168 Object tree1 "tree" Top_of_drop
2170 description "A leafless, bare tree, with what might be a bird's \
2174 if (self hasnt general) give self general;
2175 print "You clamber up the tree.^";
2176 PlayerTo(Top_of_tree); rtrue;
2180 Object nest1 "nest" Top_of_drop
2182 description "Even from down here, it's a pretty big nest. \
2183 Thankfully, no big birds seem to be present.",
2185 Search: "You can't see into it from down here.";
2187 move noun to Top_of_drop;
2188 "You take aim, but miss.";
2189 Receive, LetGo, Rub, Turn, Take, Push, Pull, Touch, Attack, Shake: "You can't reach it.";
2190 Search, LookUnder: "From down here, it's hard to see anything \
2191 but the bottom of the nest.";
2195 Object Bottom_of_drop "Bottom of Snowy Slope"
2196 with description "You've made your way down to a small snow-covered \
2197 clearing, ringed by pine trees. The only exit is back up the \
2199 name "clearing" "pine" "trees" "slope",
2204 Object boulder "large boulder" Bottom_of_drop
2205 with name "boulder" "rock",
2206 initial "There's a large boulder here, sitting squat in the \
2207 middle of the clearing.",
2208 description "A big, snow-covered rock.",
2210 Push, Pull, Turn: "It must weight a ton.";
2212 if (noun==sleeppallet) {
2213 move sleeppallet to boulder;
2214 "You drape the pallet over the boulder.";
2217 has static supporter;
2219 Object egg_shards "egg shards"
2221 initial "There's some broken eggshell shards here, scattered all \
2222 over. Some gooey egg stuff too.",
2223 description "Some large pieces of shell is all.",
2228 Object Top_of_tree "Top of tree"
2229 with description "You're on top of the tree, on some lower branches \
2230 that seem pretty stable.",
2234 Object tree2 "tree" Top_of_tree
2236 description "Overall, there's nothing terribly special about this tree.",
2239 Object nest2 "nest" Top_of_tree
2242 print "There's a large bird's nest a bit farther out on a \
2244 if (corbie_egg in self)
2245 print ". There appears to be an egg in it";
2248 description "Given the size and Brother Joseph's lessons \
2249 in ornithology, you'd guess that it's a corbie's nest. \
2250 It looks abandoned.",
2253 move noun to Top_of_drop;
2254 print "Your throw goes a little wide, and ";
2255 DefArt(noun); print " lands ";
2256 ! if (WeightOf(noun) > 10)
2257 ! "with a thump below.";
2260 Take: "It's way out on a thinner branch that probably \
2261 won't support your weight.";
2262 Receive: "You can't quite reach it to put anything in it.";
2263 Push, Pull, Rub, Touch, Attack, Shake: "You can't reach it.";
2264 LookUnder: "It seems to be sitting on some branches.";
2267 has static container open transparent;
2269 Object corbie_egg "corbie egg" nest2
2271 short_name "corbie egg",
2272 description "A large speckled corbie egg.",
2276 Take, Rub, Push, Pull, Touch, Squeeze, Turn, Shake:
2277 if (parent(self) == nest2)
2278 "You can't reach it.";
2280 if (parent(self) == nest2)
2281 "It seems to be in a nest.";
2283 if (parent(self) == nest2) {
2284 move egg_shards to Top_of_drop;
2285 move noun to Top_of_drop;
2287 "Good toss! A bit too strong though. With a dull \
2288 crack, your throw breaks the egg, and pieces of \
2289 shell and egg goop fall to the ground below.";
2292 move egg_shards to parent(player);
2294 "The egg breaks easily, covering you with egg goop. \
2299 Object branch "branch" Top_of_tree
2300 with name "branch" "branches",
2301 description "Some leafless thin tree branches.",
2303 Push, Pull, Turn, Shake:
2304 if (corbie_egg in nest2) {
2305 print "You give the branches a good shake. The egg pops \
2306 free and tumbles to the ground below! You see the egg \
2307 land in a soft patch of snow, and roll down the slope! \
2308 Moments later, you hear a dull ";
2309 if (sleeppallet in boulder) {
2310 move corbie_egg to Bottom_of_drop;
2311 "thump from below.";
2315 move egg_shards to Bottom_of_drop;
2316 "crack from below.";
2319 "You give the branches a good yank. A bit of snow falls.";
2324 ! Some scenery 'fluff'
2327 description "Cold, white and not in short supply.",
2328 found_in Mountain_peak Covered_trail Cliff_face Snowy_outcropping MON_garden
2329 snowy_intersection rocky_trail Top_of_drop Bottom_of_drop,
2331 Take: "It melts into nothing soon after.";
2332 Touch: "It's crisply cold.";
2334 if ((self has general) && (location == snowy_intersection)) {
2337 move stone_marker_top to snowy_intersection;
2338 "Remembering where the stone marker top fell, you brush \
2339 aside some snow. Sure enough, there it is!";
2346 Object North_of_river "North of Frozen River"
2347 with description "You are standing just north of a frozen river \
2348 (probably a tributary of Lake Dinge). You can just see \
2349 the south bank from here, where the trail seems to \
2350 continue. There doesn't seem to be a bridge, however. \
2351 A trail also continues north.",
2352 name "river" "lake" "bank" "trail",
2354 n_to snowy_intersection,
2358 Object Frozen_river "On Frozen River"
2359 with description "You are standing on a wide smooth river of ice. \
2360 The river 'runs' east to west, and there are banks to the \
2362 name "bank" "banks",
2363 n_to North_of_river,
2364 s_to South_of_river,
2365 e_to "You slide eastwards, and lose your footing, going nowhere.",
2366 w_to "You slide westwards, and slip, going nowhere.",
2370 move sand to Frozen_river;
2372 "You scatter the sand onto the ice.";
2376 if (player notin sleeppallet) {
2377 if (sand notin Frozen_river)
2378 "You slide and flounder helplessly on the ice!";
2380 print "You tread lightly on the sand covered portion of \
2381 the ice, and scramble to the south bank.^";
2386 "You bravely jump, but without warning, the ice cracks in many \
2387 places, and you fall into the freezing river, becoming a human \
2388 popsicle in a short amount of time.";
2392 ! (special -- accessible only from Atrii -- put useful item here)
2393 Object Frozen_river2 "On Frozen River"
2394 with description "You are standing on a wide smooth river of ice. \
2395 The river 'runs' east to west. To the north and south \
2396 are huge snow bluffs that obscure most of the surrounding \
2398 e_to "You step eastwards but lose your footing, going nowhere.",
2403 print "^As you step west, a slight downwards slope \
2404 in the ice sends you sliding uncontrollably.^";
2407 "You bravely jump, but without warning, the ice cracks in many \
2408 places, and you fall into the freezing river, becoming a human \
2409 popsicle in a short amount of time.";
2413 ! (scrawled -- clue to using spheres)
2414 Object p7 "scrawled parchment" Frozen_river2
2415 class parchment_class,
2416 with name "scrawled",
2417 description "~Red beats smoke,^\
2418 Silver bests clouds,^\
2419 Green defeats depths,^\
2420 Brown stops earth.~";
2422 Object river_ice "river ice"
2423 with name "ice" "river",
2424 description "The ice is thick and quite smooth.",
2425 found_in Frozen_river Frozen_river2,
2427 ! just trap all receives as drops
2431 has scenery supporter;
2433 Object South_of_river "South of Frozen River"
2434 with description "You are standing just south of a frozen river. \
2435 You can just see the north bank from here, where the trail seems to \
2436 continue. The only way to get there is across the river. \
2437 A trail heads south into a valley.",
2438 name "river" "bank" "trail",
2443 Object Valley_trail "Valley Trail"
2444 with description "You are walking along a valley trail, just \
2445 below a portion of the Gray Mountain ranges. You can \
2446 see the beginnings of a city to the south, while the \
2447 trail winds further into the mountain ranges to the \
2449 name "trail" "ranges" "mountain" "city",
2450 n_to South_of_river,
2451 s_to FROSTHAM_Outskirts,
2454 ! (An interesting object, with possible uses...)
2455 !Object bathroom_scale "bathroom scale"
2456 ! with name "scale" "bathroom",
2458 ! if (player in bathroom_scale)
2459 ! "This is an odd small flat white device, with a tiny \
2460 ! glass window at one end that you can see a numbered dial \
2461 ! through. The dial currently reads -- wait, that \
2462 ! can't be right. The thing must be broken.";
2463 ! print "This is an odd small flat white device, with a tiny \
2464 ! glass window at one end that you can see a numbered dial \
2465 ! through. The dial currently reads: <",
2466 ! (WeightOf(self) - 10), " Ughs>.^"; rtrue;
2469 ! has supporter enterable;
2472 ! ***********************************************************************
2473 ! ** (at this point, for clarity and my sanity, I'm going to build
2474 ! ** the remaining locations & objects in separate files, included
2475 ! ** here. Hopefully, the files will be somewhat organized based on
2476 ! ** general location/town/situation, etc.
2477 ! ***********************************************************************
2479 Include "frostham.inf";
2480 Include "aragain.inf";
2481 Include "anthar.inf";
2482 Include "fublio.inf";
2483 Include "borphee.inf";
2484 Include "miznia.inf";
2485 Include "gurth.inf";
2486 Include "subway.inf";
2487 Include "special.inf";
2489 ! ***********************************************************************
2491 ! ** HADES, in a newer format
2493 ! ***********************************************************************
2495 Class Hades_Room_Class
2496 with description "You are floating in an empty space. Surrounding you \
2497 on all sides is a great wall of flame. It would almost seem \
2498 like you are trapped inside a ball of fire.",
2499 name "fire" "ball" "space" "flame",
2501 if ((action~=##Go) && (action~=##Look) && (action~=##Wait))
2502 "You currently lack the means to do that."; ! can't do much in Hades...
2504 give self ~visited; ! cheat, easier than routines for each dir...
2505 print "^You find yourself floating through the flaming wall! \
2506 As you pass through you feel a gut-wrenching sensation. \
2507 Well, perhaps you would if you currently had a gut, or \
2508 sensations for that matter. Let's just say you feel \
2509 something akin to a gut-wrenching sensation, and leave \
2514 Object Hades_1 "Hades"
2515 class Hades_Room_Class
2529 if (random(10) == 1)
2530 "^A wisp of smoke appears to the northeast, then fades.";
2534 Object Hades_2 "Hades"
2535 class Hades_Room_Class
2549 if (random(10) == 1)
2550 "^A wisp of smoke appears to the south, then fades.";
2554 Object Hades_3 "Hades"
2555 class Hades_Room_Class
2569 if (random(10) == 1)
2570 "^A wisp of smoke appears above, then fades.";
2574 Object Hades_4 "Hades"
2575 class Hades_Room_Class
2589 if (random(10) == 1)
2590 "^A wisp of smoke appears to the north, then fades.";
2594 Object Hades_5 "Hades"
2595 with description "You are floating in an empty space. Surrounding you \
2596 on all sides is a great wall of flame. It would almost seem \
2597 like you are trapped inside a ball of fire.",
2598 name "fire" "space",
2612 if ((action~=##Go) && (action~=##Look) &&
2613 (action~=##Wait) && (action~=##Enter) &&
2614 (action~=##Take) && (action~=##Examine))
2615 "You currently lack the means to do that.";
2622 print "^You find yourself floating through the flaming wall! \
2623 As you pass through you feel a gut-wrenching sensation. \
2624 Well, perhaps you would if you currently had a gut, or \
2625 sensations for that matter. Let's just say you feel \
2626 something akin to a gut-wrenching sensation, and leave \
2631 Object Hades_flameball "Ball of flame" Hades_5
2632 with name "ball" "sphere" "flame",
2634 print "In the center of the room is a ";
2635 if (Player_Lives_Left >= 3)
2636 "large flaming sphere.";
2637 if (Player_Lives_Left == 2)
2638 "medium-sized flaming sphere.";
2639 "small flaming sphere.";
2641 description "It's rather hypnotic -- a perfect sphere made entirely of orange-red fire.",
2647 has enterable static open;
2650 print "You find yourself drawn into flaming sphere. The \
2651 ball of flame engulfs you completely, and you feel \
2652 nothing as inky blackness surrounds you.^^\
2653 ~You have revived him!~ you hear a voice say.^^\
2654 You open your eyes. You are lying on a long wooden \
2655 table in the Monastery Steeple room. Several members \
2656 of the Order are gathered around you, and Brother \
2657 Joseph helps you to your feet.^^\
2658 ~We were able to bring you back to the world of the \
2659 living,~ Joseph says, ~but I fear our powers are waning, \
2660 and we may not succeed if we try again. Your quest \
2662 The group files out, leaving you alone in the room.^";
2664 Player_Lives_Left--;
2665 Player_HP_CUR = Player_HP_MAX; ! Healed up
2666 give steeple_window ~open; ! one of the acolytes was too cold...
2667 PlayerTo(MON_Steeple_room);
2671 ! ***********************************************************************
2673 ! ** INITIALIZE AND OTHER STARTUP, place player, place objs, etc
2675 ! ***********************************************************************
2679 thedark.description =
2680 "It is pitch black. You are likely to be eaten by a grue.";
2682 prayer_book.magic = all_my_spells;
2683 <Learn prayer_book gnusto_spell>;
2684 <Learn prayer_book frotz_spell>;
2685 move prayer_book to player;
2686 location=MON_Chapel1;
2688 ! (FOR TESTING ONLY)
2689 !move amulet to player;
2690 !<Learn prayer_book huncho_spell>;
2691 !<Learn prayer_book feeyuk_spell>;
2692 !<Learn prayer_book ledak_spell>;
2693 !<Learn prayer_book egdelp_spell>;
2694 !<Learn prayer_book tossio_spell>;
2695 !move TEMPLE_Artifact to player;
2696 !move umbrella to player;
2697 !move sack to player;
2699 !move magic_door to player;
2700 !location = ANTHAR_GUSStation;
2701 !location=Skyscraper;
2703 !<Learn prayer_book bekdab_spell>;
2704 !<Learn prayer_book egdelp_spell>;
2705 !<Learn prayer_book tossio_spell>;
2706 !move decaf_coffee_can to player;
2711 ! ***********************************************************************
2713 ! ** Some special routines, which should be after Initialise
2715 ! ***********************************************************************
2717 ! The Afterlife -- or, a fine time in Hades
2719 if (Player_Lives_Left <= 0) {
2720 print "^^A blackness surrounds you, replaced by more blackness...^^";
2724 deadflag = 0; ! not dead yet
2725 ! move inventory to place of death
2727 while (child(player)~=0) {
2728 give child(player) ~worn;
2729 move child(player) to i;
2734 print "^^A blackness surrounds you, only to be replaced by...^^";
2736 if (i==2) { PlayerTo(Hades_2); rtrue; }
2737 if (i==3) { PlayerTo(Hades_3); rtrue; }
2738 else { PlayerTo(Hades_1); rtrue; }
2746 print "^Hmm, perhaps the Grues really are migrating with the \
2752 "^Well, don't say I didn't warn you. Something horrible \
2753 with slavering fangs lurks up and devours you!";
2759 ! [ WeightOf obj t i;
2761 ! objectloop (i in obj) t=t+WeightOf(i);
2764 ! Now, rules for capacity still hold (slightly unrealistic), but we
2765 ! can now check WeightOf(player) in those situations that need it.
2768 print ", earning you the rank of ";
2769 if (score < 0) "Wanna-be Altar-boy";
2770 ! if (score >= 500) "Truly Enlightened One";
2771 ! if (score >= 495) "Benevolent One";
2772 ! if (score >= 490) "Faithful One";
2773 ! if (score >= 395) "Simple Man";
2775 if (score >= 250) "Enlightened One";
2776 if (score >= 225) "Patriarch";
2777 if (score >= 200) "Cardinal";
2778 if (score >= 150) "Lama";
2779 if (score >= 125) "Cleric";
2780 if (score >= 100) "High Priest";
2781 if (score >= 90) "Priest";
2782 if (score >= 75) "Monk";
2783 if (score >= 50) "Brother";
2784 if (score >= 30) "Acolyte";
2785 if (score >= 20) "Aspirant";
2786 if (score >= 10) "Devoted";
2787 if (score >= 5) "Believer";
2791 [ PrintTaskName ach;
2793 0: "using sand to get across the river";
2794 1: "triplicating the cereal box";
2795 2: "setting the alarm clock";
2796 3: "getting the waxy scroll from the skier";
2797 4: "giving the palace guard a good cake";
2798 5: "solving Barsap's Gambit";
2799 6: "fixing the sailboat";
2800 7: "finding the rod in the shipwreck";
2801 8: "triplicating the ale";
2802 9: "finding the rod under the statue";
2803 10: "pruning the Christmas Tree Monster";
2804 11: "getting past the burly sports fan";
2805 12: "winning the three Golem bouts";
2806 13: "ending the kobold war";
2807 14: "unlocking Duncanthrax's Trophy chamber";
2808 15: "unlocking the Lab door";
2809 16: "finding the rod in the top of the marker";
2810 17: "finding the rod in the house foundation";
2811 18: "removing the impenetrable steel wall";
2812 19: "joining the True Rod";
2813 20: "getting past the broken subway gate";
2814 21: "finding the hidden path to the temple";
2815 22: "getting the rod through the temple";
2816 ! 23: "finding the scroll in Frobar's painting";
2817 23: "getting the scroll from the boutique";
2818 24: "getting the scroll from Frobar";
2819 25: "getting into the subway tunnel";
2820 26: "banishing the four evil elementals";
2825 ! *** NEW ACTION ROUTINES
2828 if ((in_hades == 1) || (in_atrii == 1) || (spell_block==1))
2829 "You make a prayer and feel no spiritual response! \
2830 Have the Deities forsaken you? Or have you found a \
2831 place where even the Gods cannot provide guidance?";
2834 if (Player_HP_MAX ~= (20 + score))
2835 Player_HP_MAX = (20 + score);
2836 ! consider increasing memory/spell capacity here
2838 Player_HP_CUR = Player_HP_MAX; ! Healed
2839 "You make a quick but respectful prayer to the \
2840 Deities above, asking for Divine Guidance in your \
2841 quest. A saffron glow surrounds you and you feel \
2842 spiritually and physically renewed!";
2844 "You make a quick but respectful prayer to the \
2845 Deities above, asking for Divine Guidance in your \
2846 quest. You finish and feel spiritually renewed.";
2851 if (Player_HP_CUR > Player_HP_MAX) ! (This should never happen)
2852 "You feel superhuman!";
2853 if (Player_HP_CUR == Player_HP_MAX)
2854 "You are in good health.";
2855 if (Player_HP_CUR == 1)
2856 "You are near death's door.";
2857 if (Player_HP_CUR < 5)
2858 "You feel extremely weak.";
2859 if (Player_HP_CUR < 10)
2861 i = (Player_HP_MAX / Player_HP_CUR);
2863 "You feel slightly weak";
2865 "You've been better, but you'll be okay.";
2873 "Such language from a priest such as yourself! \
2874 The ground rumbles, and a bolt of blue wrath from the \
2875 Deities strikes you dead!";
2877 "Such language from a priest such as yourself! \
2878 The ground rumbles suddenly!";
2882 ! if (noun has static)
2883 ! "That's fixed in place.";
2884 ! if (noun has scenery)
2885 ! "You're unable to.";
2886 ! if (noun has animate)
2887 ! "That would be less than courteous.";
2888 ! print "You lift "; DefArt(noun); " and put it back in \
2889 ! it's original position. Nothing obvious happens.";
2893 if (noun has animate)
2894 "Get a hold of yourself. No need to go around shaking living \
2899 ! (new insert routine, which is the same as old, except that
2900 ! we also check relative sizes of objects)
2902 receive_action = ##Insert;
2903 if (second==d_obj ) <<Drop noun>>;
2904 if (parent(noun)~=player) return L__M(##Insert,1);
2908 if (RunRoutines(second,before)~=0) { action=##Insert; rtrue; }
2911 if (second hasnt container) return L__M(##Insert,2);
2912 if (second hasnt open) return L__M(##Insert,3);
2913 if (IndirectlyContains(noun,second)==1) return L__M(##Insert,5);
2916 <Disrobe noun>; if (noun has worn) rtrue;
2919 if (children(second)>=ValueOrRun(second,capacity))
2920 return L__M(##Insert,7,second);
2922 if (noun.size > second.size) {
2923 CDefArt(noun); print " appears to be too large to put in ";
2924 DefArt(second); ".";
2926 move noun to second;
2928 if (AfterRoutines()==1) rtrue;
2932 if (RunRoutines(second,after)~=0) { action=##Insert; rtrue; }
2935 if (keep_silent==1) rtrue;
2936 if (multiflag==1) return L__M(##Insert,8);
2937 L__M(##Insert,9,noun);
2941 "I fail to see what you're trying to accomplish by doing this.";
2945 "I fail to see what you're trying to accomplish by doing this.";
2949 ! if (noun hasnt numberdial)
2950 ! "You can't seem to do that.";
2951 ! if ((second > 9) || (second < 0))
2952 ! print "It appears that the valid range for ",noun; " is 0 to 9";
2953 ! noun.number = second;
2954 ! if (noun.number > 9) noun.number = 0;
2955 ! a special restriction in this case
2956 ! print "You set ",noun," to ",second; ".";
2960 "This doesn't seem terribly productive.";
2964 "You close your eyes and focus your mind inwards. \
2965 Mere moments of time seem to pass like eons. You \
2973 "You make a rather sickly noise.";
2976 if (Frobar in location)
2977 "~Stop that!~ Frobar says, ~It's contagious.~";
2981 "A hollow voice says, ~Cool!~";
2984 "Please, no begging.";
2987 "Was it that funny?";
2992 SPIRITWRAK, An Interactive Fantasy Adventure^\
2993 If you're new to interactive fiction games, I lack the \
2994 space here to give an adequate description, but in short, \
2995 you're a character in a story, able to interact with \
2996 objects, places and other things (using regular english \
2997 sentences) in order to reach your goal, which is to \
2998 figure out how to ~solve~ the story. For a real \
2999 description, you might want to check out documents \
3000 located at ftp.gmd.de.^^\
3001 For those more experienced players, if you're looking \
3002 for on-line clues, etc., sadly, you won't find them \
3003 (the Z5 code is getting rather obscenely large as I \
3004 write this). A short verb list is contained in the \
3005 README file that you should have received with this \
3006 game (or should be able to find at the same place you \
3007 found this game). Beyond that, if you're truly \
3008 desperate, you can post a note on the rec.arts.int-fiction \
3009 usenet newsgroup, or send me email.^^\
3010 Thanks for playing! ^^\
3011 -- D. S. Yu [dsyu@@64holonet.net]";
3014 Include "grammar"; ! (Include grammar _after_ action defs, if we replace any)
3017 !Extend "turn" first
3018 ! * noun "to" number -> SpecialDial;
3019 Extend "examine" first
3020 * scope=ReadableSpell -> Examine;
3026 Verb "diagnose" "health" "status"
3029 Verb "spells" "memory" "chants"
3031 Verb "learn" "memorise" "memorize" "prepare"
3032 * scope=ReadableSpell -> Learn;
3038 * is_spell "at" noun -> Cast
3039 * is_spell "on" noun -> Cast;
3040 Verb "yell" "scream" "bellow"
3042 Verb "sneeze" "cough"
3046 Verb "laugh" "chuckle"
3052 ! Verb "lift" "raise"
3060 Verb "join" "connect"
3061 * noun "to" noun -> Join
3062 * noun "with" noun -> Join;
3063 Verb meta "help" "hint"
3066 ! ** (nonsense verbs below, can be removed without affecting game)
3067 Verb "xyzzy" "plugh" "treasure" "plover" "yoho"