--- /dev/null
+! *****************************************************************
+! SPIRITWRAK -- An exercise in copyright infringement :)
+!
+! Release 1, 12/95 -- 3/96
+! Release 2, 3/96 --
+! Release 3, 4/96 --
+! Copyright (C) 1996, D. S. Yu
+!
+! This program is free software; you can redistribute it and/or modify
+! it under the terms of the GNU General Public License as published by
+! the Free Software Foundation; either version 3 of the License, or
+! (at your option) any later version.
+!
+! This program is distributed in the hope that it will be useful,
+! but WITHOUT ANY WARRANTY; without even the implied warranty of
+! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+! GNU General Public License for more details.
+!
+! You should have received a copy of the GNU General Public License
+! along with this program; if not, write to the Free Software
+! Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+!
+! To contact the author (Dan Yu), send email to dsyu@holonet.net.
+!
+! *****************************************************************
+
+! SPECIAL THANKS:
+! Mr. Blank, Lebling, Meretzky, Moriarty for the Zork universe.
+! Graham Nelson for Inform, and for various code I've shamelessly cribbed.
+
+! NUTRITION NOTE: No Microsoft(tm) products were used in the
+! construction of this game
+
+! ** inform compile switches here **
+Switches exv5b;
+
+! ** abbreviations
+Include "spirita.inf";
+
+! ** Story Constants **
+Constant Story "SPIRITWRAK";
+Constant Headline "^An Interactive Fantasy Adventure^\
+ Copyright (C) 1996, by D.S. Yu.^\
+Portions copyright Graham Nelson.^^\
+'SPIRITWRAK' comes with ABSOLUTELY NO WARRANTY ^\
+This is free software, and you are welcome to redistribute it \
+under conditions as described in the GNU General Public License as published by \
+the Free Software Foundation; either version 3 of the License, or \
+(at your option) any later version.^^";
+
+Release 3;
+
+! ** Scoring System
+Constant MAX_SCORE 250;
+Constant NUMBER_TASKS 27;
+Constant TASKS_PROVIDED;
+Constant OBJECT_SCORE 2;
+! Constant ROOM_SCORE 1;
+! Global task_scores initial t1 t2 t3.....
+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;
+
+! ** Player inventory and weight system
+Constant MAX_CARRIED 15; ! Max of 15 items carried at start
+ ! This can be changed on the fly by adjusting player.capacity
+Property weight;
+! Entire weight system removed 3/16/96, however certain puzzles
+! inadvertently depend on this, so...
+Property size;
+
+global Player_HP_MAX = 20; ! number of hp MAX (should be 20 + score)
+global Player_HP_CUR = 20; ! number of hp left (< MAX)
+global Player_Lives_Left = 3; ! number of resurrects left
+global in_hades = 0; ! Is the player in Hades? (we certainly hope not)
+global in_atrii = 0; ! Is the player in Atrii?
+! global all_my_spells data 32; array for spells in spell book
+Array all_my_spells -> 64; ! array for spells in spell book
+global has_resist_gravity = 0; ! is player resisting gravity?(see feeyuk spell)
+global spell_block = 0; ! block spell-related stuff (end-game)
+
+! Any actions that are replaced get mentioned here
+Replace PraySub;
+Replace StrongSub;
+Replace InsertSub; ! for relative sizes
+
+! *** Include Parser and VerbLib
+Include "Parser";
+Include "VerbLib";
+
+! -- two global location ptrs for Barsap's Gambit
+global WN_TO;
+global ES_TO;
+
+! ******************* CLASS DEFS *****************
+
+! ** rod (part) class and attribute
+Attribute is_rod;
+
+Class rod_class
+ with name "rod",
+ description "A thin rod made from some undeterminable material.",
+ !weight 10,
+ size 10,
+ before [;
+ Cast:
+ "You complete the chant, but the rod lies unaffected! \
+ Perhaps it is protected from magic somehow?";
+ Join:
+ if (second has is_rod)
+ "You try to bring the rods together, but a \
+sudden blast of energy prevents you, and stings your hands!";
+! (note that true rod pieces have their own Join befores, which
+! should, in theory, get called instead of this one).
+ ],
+ has is_rod scored;
+
+Class parchment_class
+ with name "parchment",
+ description "A piece of blank parchment.",
+ !weight 10,
+ size 15,
+;
+
+Attribute is_sphere;
+
+Class sphere_class
+ with name "sphere",
+ description "A small hard sphere made from some undeterminable material.",
+ !weight 5,
+ size 3,
+ before [;
+ Cast:
+ "You complete the chant, but the sphere lies unaffected! \
+ Perhaps it is protected from magic somehow?";
+ ],
+ has is_sphere scored;
+
+Attribute is_flag;
+
+Class flag_class
+ with name "flag" "cloth",
+ plural "flags",
+ description "A short square piece of colored cloth.",
+ !weight 10,
+ size 15,
+ has is_flag;
+
+Class trophy_dep_class
+ with name "depression" "niche" "hole" "keyhole",
+ initial [;
+print "There is a circular depression in the center of the floor";
+if (trophy in self)
+ ". Sitting in the depression is a trophy.";
+else ".";
+ ],
+ description [;
+print "A small circular depression in the center \
+ of the stone floor";
+if (trophy in self)
+ ". At the moment, the depression holds a trophy.";
+else ". There seem to be three small concave \
+ marks in the otherwise flat stone of the depression.";
+ ],
+ size 8,
+ capacity 1,
+has static container open;
+
+Attribute is_niche;
+Property counter_niche;
+Property niche_dir; ! assoc with the dir a niche is facing.
+
+Class niche_class
+ with name "niche",
+ capacity 1,
+ niche_dir 1, ! default north
+ description "It looks like a chiseled-out niche in the floor.",
+ initial [;
+ switch (self.niche_dir) {
+ 1: print "There's a square niche in the northern edge of the floor here";
+ 2: print "There's a square niche in the western edge of the floor here";
+ 3: print "There's a square niche in the southern edge of the floor here";
+ 4: print "There's a square niche in the eastern edge of the floor here";
+ }
+ if (children(self) ~= 0) {
+ print ". Resting in the niche is ";
+ InDefArt(child(self));
+ print " that extends into the darkness";
+! weird -- There is no "CInDefArt(), equiv to (A) obj, which
+! is probably pretty simple...
+ }
+ ".";
+ ],
+ before
+ [ j ;
+ Receive:
+ if (noun hasnt is_wood_beam)
+ "That's not going to stay in the niche.";
+ else {
+ ! (odd capacity check, seems like I'm stepping in front...)
+ if (children(self) ~= 0)
+ "The niche space is currently full.";
+ ! place both pieces in niches
+ j = child(noun); ! child piece (whichever)
+ move j to self.counter_niche;
+ move noun to self;
+ "You carefully place one end of the beam in the niche and \
+ extend the other end into the darkness. You feel something \
+ solid support the far end!";
+ }
+ LetGo:
+ ! (reconstruct wood beam) Assumption is that noun must have
+ ! wood_beam attrib.
+ move child(self.counter_niche) to child(self);
+ move child(self) to player;
+ "Taken.";
+ ],
+ has static container open is_niche;
+
+! ** multiple coins, cribbed from "Balances"
+Attribute is_coin;
+
+Class coin_class
+ with name "coin",
+ description "A round metal disc, with ~1zm~ stamped on both sides.",
+ !weight 1,
+ size 1,
+ parse_name
+ [ i j w;
+ if (parser_action==##TheSame)
+ { if ((parser_one.&name)-->0 == (parser_two.&name)-->0) return -1;
+ return -2;
+ }
+ w=(self.&name)-->0;
+ for (::i++)
+ { j=NextWord();
+ if (j=='coins') parser_action=##PluralFound;
+ else if (j~='coin' or w) return i;
+ }
+ ],
+ plural "coins",
+ has is_coin;
+
+! ** Spell-casting system, again cribbed from Graham's "Balances",
+! except stuffy priests call them 'chants'...
+! ----------------------------------------------------------------------------
+! Now the whole spell-casting system
+! ----------------------------------------------------------------------------
+
+Attribute is_spell;
+Attribute known_about;
+Attribute is_scroll;
+Attribute is_spell_book;
+Property magic;
+Fake_Action SayName;
+
+[ SpellName obj; print (address) (obj.&name)-->0; ];
+
+Class spell_class
+ with name "spell" "spells" "chant" "chants", article "the", number 0,
+ short_name
+ [; SpellName(self); print " chant"; give self known_about; rtrue;
+ ],
+ before
+ [;
+ ! SayName: SpellName(self); print " chant: ", object self;
+ SayName: SpellName(self); print " chant: ", self;
+ give self known_about; rtrue;
+ Examine: <SayName self>; ".";
+ ],
+ size 0,
+ has is_spell;
+
+Object memory "memory"
+ with capacity 5, ! will change periodically, given God-granted powers...
+ number 1,
+ size 0,
+ before
+ [ i j k;
+ Examine:
+ if (spell_block == 1)
+ "Currently, your mystic powers don't seem to be working.";
+ objectloop (i in self) if (i.number==100) j++;
+ if (j>0)
+ { print "The ";
+ objectloop (i in self)
+ if (i.number==100)
+ { k++; SpellName(i);
+ if (k==j-1) print " and ";
+ if (k<j-1) print ", ";
+ }
+ if (j==1) print " chant is"; else print " chants are";
+ print " yours forever. Other than that, y";
+ }
+ else print "Y";
+ print "ou have ";
+ j=0; k=0;
+ objectloop (i in self) if (i.number<100) j++;
+ if (j>0)
+ { print "the ";
+ objectloop (i in self)
+ if (i.number<100)
+ { k++;
+ PrintShortName(i);
+ if (i.number==2) print " (twice)";
+ if (i.number==3) print " (thrice)";
+ if (i.number==4) print " (four times)";
+ if (i.number>=5) print " (many times)";
+ if (k==j-1) print " and ";
+ if (k<j-1) print ", ";
+ }
+ }
+ else print "no chants";
+ " prepared.";
+ Insert:
+ if (spell_block==1)
+ "Currently, your mystic powers don't seem to be working.";
+ if (second.number==100) "You always know that chant.";
+ self.number=self.number+1;
+ print "Making a quick prayer to the Gods, you prepare the ";
+ SpellName(second);
+ print " chant";
+ if (second notin self) second.number=0;
+ move second to self;
+ second.number=second.number+1;
+ if (second.number==1) print ".";
+ if (second.number==2) print " once again.";
+ if (second.number==3) print " a third time.";
+ if (second.number>3) print " yet another time.";
+ if (self.number <= self.capacity) { new_line; rtrue; }
+ i=youngest(self); <Remove self i>;
+ "^A voice booms out ~Do not try to exceed your powers, mortal!~";
+ Remove:
+ if (second notin self || second.number==100) rtrue;
+ if (self.number>0) self.number=self.number-1;
+ second.number=second.number-1;
+ if (second.number==0) remove second;
+ rtrue;
+ ];
+
+Object gnusto_spell "copy a chant into your prayer book" memory
+ class spell_class
+ with name "gnusto",
+ number 100,
+ magic
+ [ i a_book;
+ if (spell_block==1)
+ "Currently, your mystic powers don't seem to be working.";
+ if (amulet hasnt worn)
+ "You speak the chant, and absolutely nothing happens!";
+ if (second has is_spell_book)
+ "Unlike scrolls, prayer books are magically guarded against \
+ the 'theft' of their lore.";
+ if (second==0 || second hasnt is_scroll)
+ "Your chant goes unanswered.";
+ if (second notin player)
+ "A gnusto chant would require close scrutiny of the scroll \
+ it is to copy, which you do not seem to be holding.";
+ objectloop (i in player)
+ if (i has is_spell_book) a_book=i;
+ if (a_book==0)
+ "Your chant fails, as you have no prayer book.";
+ i=child(second);
+ if (i==0 || i hasnt is_spell)
+ { print "Your chant fails, as "; DefArt(second);
+ " is illegible.";
+ }
+ <Learn a_book i>; remove second;
+ print "Your prayer book begins to shake! Slowly, ornately, \
+ the words of "; DefArt(i); " are inscribed, \
+ into the book with a violet glow. \
+ The book's brightness fades, but the chant remains! \
+ However, the scroll on which it was written vanishes as \
+ the last word is copied.";
+ ];
+
+Class spell_book_class
+ with magic 0,
+ capacity 20,
+ size 15,
+ before
+ [ p i; Open, Close:
+ CDefArt(self); " will always open to the desired page thanks \
+ to the powers of the Gods, may they never forget us.";
+ Attack:
+ print "When you are done, "; DefArt(self); " remains unmarred.";
+ Learn:
+ if (self.magic==0) "(This prayer book has no pages.)";
+ p = self.magic;
+ for (i=0:i<self.capacity && (p-->i)~=0:i++) ;
+ if (i==self.capacity) rtrue;
+ p-->i = second;
+ rtrue;
+ ],
+ after
+ [ p i j; Examine:
+ if (self.magic==0) "(This prayer book has no pages.)";
+ p = self.magic;
+ for (i=0:i<self.capacity && (p-->i)~=0:i++)
+ { j=p-->i; <Examine j>;
+ }
+ rtrue;
+ ],
+ has is_spell_book;
+
+Class scroll_class
+ with parse_name
+ [ i j k; j=-1;
+ if (self has general)
+ { if (child(self)~=0 && child(self) has is_spell)
+ j=(child(self).&name)-->0; else j='illegible';
+ }
+ for (::) {
+ k = NextWord();
+ if (k=='scrolls') parser_action = ##PluralFound;
+ if ((k=='scrolls' or 'scroll' or j) || (k==(self.&name)-->0))
+ i++;
+ else return i;
+ }
+ ! while (NextWord()==j or 'scroll' or (self.&name)-->0) i++;
+ ! return i;
+ ],
+ before
+ [ i; Examine:
+ i=child(self);
+ give self general;
+ if (i==0 || i hasnt is_spell)
+ "The scroll has faded, and you cannot read it.";
+ print "The scroll reads ~"; <SayName i>; "~.";
+ ],
+ invent
+ [; if (inventory_stage==2 && self has general)
+ { if (child(self)==0 || child(self) hasnt is_spell)
+ print " (which is illegible)";
+ else
+ { print " (of "; DefArt(child(self)); print ")"; }
+ }
+ ],
+ size 10,
+ has scored is_scroll;
+
+! NOTE: This routine has a slight bug (as cribbed from GN's
+! Balances, rel2) in that Examine, if the routine reaches
+! scope_stage 3, prints a rather confusing msg. However,
+! the appropriate msg is printed for, say, Learn, if the
+! spell is unknown/out-of-scope. Oddly, action can't
+! be checked at stage 3, so I copied a second version of
+! the routine for Examine only. -DY
+! 3/19 update: Checking Graham's release 3 of Balances,
+! I stumble across the "action_to_be" var. Most useful.
+[ ReadableSpell i j k;
+ if (scope_stage==1) return 1;
+ if (scope_stage==2)
+ { objectloop (i in player)
+ if (i has is_spell_book)
+ { for (k=0:k<i.capacity && (i.magic)-->k~=0:k++)
+ { j=(i.magic)-->k; PlaceInScope(j);
+ }
+ }
+ rtrue;
+ }
+ if (action_to_be == ##Examine)
+ "You can't see any such thing.";
+ !"You have never seen or heard of such a chant.";
+ "You can't see such a chant, if that is indeed a chant.";
+];
+
+[ SpellsSub; <Examine memory>; ]; ! for our case, 'chants' will work also
+
+[ LearnSub; if (location==thedark)
+ print "(The magic purple glow of the chants casts enough light \
+ that you can read them.)^";
+ <Insert memory noun>;
+];
+
+global the_spell_was = gnusto_spell;
+
+[ CastOneSub; <Cast the_spell_was noun>; ];
+
+! Property long unmagic;
+
+
+! (wood beams and niches -- for Barsap's Gambit)
+! (put after 'the_spell_was' global defined)
+
+Attribute is_wood_beam;
+
+Class wood_beam_class
+ with name "wood" "beam",
+ plural "beams",
+ description "A long thin wooden beam.",
+ !weight 10,
+ size 50,
+ number 0, ! number is the 'strength left' qualifier
+ before [;
+ Cast:
+ if (the_spell_was == egdelp_spell)
+ "The wood beam is covered in a waxy film! Thinking \
+better of this, you hastily wipe off the offending build-up.";
+ if ((the_spell_was == luncho_spell or huncho_spell) &&
+ (parent(self) has is_niche)) {
+ ! reconstruct beam before teleporting
+ ! due to problem below, I'm denying this...
+"Your chant goes unanswered.";
+ ! move child(parent(self).counter_niche) to self;
+ ! <<Cast the_spell_was self>>;
+ ! NOTE NOTE This may recursively explode...
+ }
+ ],
+ has is_wood_beam;
+
+Class balsa_beam_class
+ class wood_beam_class,
+ with name "balsa",
+ plural "balsa wood beams",
+ description "A long thin balsa wood beam.",
+ number 0; ! always breaks
+
+Class pine_beam_class
+ class wood_beam_class,
+ with name "pine",
+ plural "pine wood beams",
+ description "A long thin pine wood beam.",
+ number 1;
+
+Class ebony_beam_class
+ class wood_beam_class,
+ with name "ebony",
+ article "an",
+ plural "ebony wood beams",
+ description "A long thin ebony wood beam.",
+ number 2;
+
+[ CastSub k;
+ the_spell_was = noun; <Remove memory noun>;
+
+! if (noun has general)
+! { give noun ~general;
+! if (RunRoutines(noun,unmagic)~=0) rfalse;
+! "Nothing happens.";
+! }
+
+ if (amulet hasnt worn)
+ "You speak the chant, and absolutely nothing happens!";
+ if (spell_block==1)
+ "Currently, your mystic powers don't seem to be working.";
+ if (in_hades == 1)
+ "Your Gods can't save you now...";
+ if (second~=0)
+ { ResetVagueWords(second); ! Set "it", "him", "her"
+ if (RunRoutines(second,before)~=0) rfalse; ! Run before routine(s)
+ }
+ k = random(10);
+ if (k<=3) {
+ if (k==1)
+ "You speak the chant, but the Gods are not kind this time, as nothing happens!";
+ if (k==2 or 3)
+ "You speak the chant, but something sounds wrong. Nothing happens \
+this time.";
+ }
+ if (RunRoutines(noun,magic)~=0) rfalse;
+ "Nothing happens.";
+];
+
+[ InScope i;
+ if (verb_word=='c,cast' or 'cast')
+ objectloop (i in memory) PlaceInScope(i);
+ rfalse;
+];
+
+[ ParserError x i flag vb;
+ if (etype==VERB_PE or ASKSCOPE_PE)
+ { if (etype==ASKSCOPE_PE)
+ { if (verb_word=='cast') vb=1;
+ if (verb_word=='learn' or 'memorise' or 'memorize') vb=2;
+ if (verb_word=='copy') vb=3;
+ if (vb==0) { etype=CANTSEE_PE; rfalse; }
+ }
+ wn=verb_wordnum; if (vb~=0) wn++;
+ x=NextWordStopped();
+ for (i=player+1:i<=top_object:i++)
+ if (i has is_spell && Refers(i,x)==1
+ && i has known_about) flag=1;
+ if (flag==1)
+ { if (vb==0 or 1)
+ "You haven't got that chant prepared. [Type ~spells~ \
+ or ~chants~ to see what you do have prepared.]";
+ if (vb==2)
+ "Your training is such that you can only prepare such a chant \
+ with the aid of a prayer book containing it.";
+ if (vb==3)
+ "You have no text of that chant to copy.";
+ }
+ if (vb==1)
+ "You haven't prepared that chant, if indeed it is a chant.";
+ if (vb==2 or 3)
+ "You haven't access to that chant, if indeed it is a chant.";
+ }
+ rfalse;
+];
+
+! Random attempt to code a ChooseObjects for the
+! coin choosing problem often seen in the Bank of Zork
+[ ChooseObjects obj code;
+ if (code < 2) rfalse;
+ if ((action_to_be == ##Remove or ##Insert) &&
+ (obj has is_coin) && (obj in player)) return 9;
+ return 0;
+];
+
+[ UnknownVerb word i;
+ objectloop (i in memory)
+ if (word==(i.&name)-->0) { the_spell_was = i; return 'c,cast'; }
+ rfalse;
+];
+
+[ PrintVerb v;
+ if (v=='c,cast') { print "cast a chant at"; rtrue; }
+ rfalse;
+];
+
+! ----------------------------------------------------------------------------
+! The player's spell book, and initial spells (to go with gnusto):
+! ----------------------------------------------------------------------------
+
+Object prayer_book "prayer book"
+ class spell_book_class,
+ with name "prayer" "book" "my" "spellbook",
+ description "Mystical Chants^";
+
+Object frotz_spell "cause an object to give off light"
+ class spell_class,
+ with name "frotz",
+ magic
+ [; if (second==0) "There is a brief, blinding flash of light.";
+ if (second has animate)
+ "The chant, not designed for living creatures, is denied.";
+ if (parent(second)==compass)
+ "The chant fails.";
+ give second light;
+ print "There is an almost blinding flash of light as "; DefArt(second);
+ print " begins to glow! It slowly fades to a less painful level, but ";
+ DefArt(second); " is now quite usable as a light source.";
+ ],
+;
+
+! ** Start of locations (and other objs) **
+
+! ***********************************************************************
+! **
+! ** LOCATIONS INSIDE MONESTARY (Mostly)
+! **
+! ***********************************************************************
+
+Object MON_Chapel1 "Monastery Chapel"
+ with description "You are standing in a monastery chapel. \
+All around you, fellow Brothers of the Order are standing, chanting. \
+The eerie droning voices seem to reverberate into the air. At the \
+front of the chapel, Brother Joseph stands in deep concentration, \
+holding the Rod of the Ancients.",
+ name "brothers",
+ number 0,
+ each_turn [ ;
+ MON_Chapel1.number = MON_Chapel1.number + 1;
+ Startup1(MON_Chapel1.number);
+ ],
+ before [ ;
+ if (action==##Listen) "You hear heavy chanting";
+ if (action==##look) rfalse;
+ if (action==##Wait) rfalse;
+ "You are caught up in the collective chanting, and cannot break \
+ your concentration to do much of anything else.";
+ ],
+ has light;
+
+! A fake obj to handle 'look at Joseph'
+Object MON_FAKE "the Order" MON_Chapel1
+ with name "Joseph" "rod" "brothers",
+ description [; <<Look>>;],
+has scenery;
+
+! A somewhat bulky routine to set our stage.
+[ Startup1 currturn;
+ if (currturn <= 1) {
+ print "^Brother Joseph now speaks directly to the entire Order.^^\
+ ~Fellow Brothers, the year, as you know, is 976 GUE. \
+ A difficult time indeed. Ten years have passed since the Cataclysm \
+ brought forth by the Circle of Enchanters changed our world forever. \
+ The outside world as we know it is in turmoil. A period of great \
+ change is upon all of us.~^";
+ rtrue;
+ }
+ if (currturn == 2) {
+ print "^Brother Joseph continues speaking.^^\
+ ~Our order has always maintained the strictest secrecy. Few \
+ outside of our order know of our existence. \
+ We are the keepers of the mystic balance \
+ that which embodies pure magic that can keep our world \
+ safe. It has always been thus -- we watch over all \
+ of Quendor, never interfering in the affairs of others, yet \
+ striving to maintain harmony.~^";
+ rtrue;
+ }
+ if (currturn == 3) {
+ print "^Brother Joseph continues speaking.^^\
+ ~But we can no longer depend on enchantments to keep \
+ outsiders at bay. Magic as we know it is dying. The dreaded \
+ Age of Science is already upon us, and in short time, our \
+ order will be discovered, and the balance will be no more. Many of \
+ our order have gone out into the world in secret, in attempts \
+ to repair what has been broken, but alas, this appears to be \
+ impossible.~^";
+ rtrue;
+ }
+ if (currturn == 4) {
+ print "^Brother Joseph continues.^^\
+ ~I have brought you all forth today to say that although we \
+ cannot protect the future of Quendor, we can protect ourselves!~ \
+ He holds the Rod of the Ancients high. ~This holy Rod, which \
+ the Ancient Ones used to defeat the demon Anabais, \
+ has the power to protect our order. I have discovered a lost mystic \
+ cube!~ He holds a white, featureless cube high in his other hand. \
+ ~This cube, when joined with the Rod of the Ancients, will \
+ preserve our order forever, sequestering all of us in another time, \
+ another place!~^";
+ rtrue;
+ }
+ if (currturn >= 5) {
+ print "^There is a momentous pause. ^^\
+ Brother Joseph looks at the entire Order. \
+ ~May the Gods smile down upon us on this day! We go now, \
+ into the unknown!~ He triumphantly joins the white cube to \
+ the end of the Rod of the Ancients.^^\
+ There is a sudden, blinding white flash! The chanting is instantly \
+ broken by a tremendous thunderclap! Brother Joseph is suddenly \
+ thrown back by a great force, and to your horror, the Rod of the \
+ Ancients breaks apart! Four pieces now float serenely above the \
+ altar, above a strange black globe that seems to crackle with energy.^^\
+ ~AT LAST!~^^\
+ The voice comes from nowhere and everywhere. The black sphere \
+ pulsates with lightning.^^\
+ ~ANABAIS IS FREE AGAIN!~ The voice pauses. \
+ ~I see you found my fake mystic cube \
+ Joseph. I knew that someday, someone would find it, and free \
+ me from my prison!~ The voice pauses again. ~To show my gratitude, I'm \
+ scattering this broken symbol to the corners of the world!~ \
+ The pieces of the rod suddenly disappear!^^\
+ ~Watch out!~ someone cries. \
+ The black sphere suddenly expands with alarming speed. \
+ Seconds later, a violent explosion seems to jar the very \
+ ground you stand on, and a black void covers all.^^\
+ You awaken in your room in a cold sweat. Was it all a terrible \
+ dream? The day beckons...^";
+ PlayerTo(MON_your_quarters);
+ ! remove MON_Chapel1; clean up memory (NOTE: This is futile)
+ rfalse;
+ }
+];
+
+
+Object MON_your_quarters "Your Quarters"
+ with name "furnishing" "furnishings",
+ description "You are in your room in the Monastery. It is \
+sparsely furnished, but certainly feels like home. The exit \
+is north.",
+ n_to MON_f1hall1,
+ has light;
+
+Object note "note" MON_your_quarters
+with name "note",
+ description "The note, in a hastily written scrawl, reads:^\
+ ~Please stop by the chapel as soon as you can.^\
+ -- Joseph~",
+ !weight 1,
+ size 5,
+;
+
+!Object staff "staff" MON_your_quarters
+! with name "staff" "walking" "trusty" "stick",
+! initial "Your trusty walking staff is right where you left it.",
+! description "A stout piece of pine you found while on a nature \
+! walk, this staff has served you well on many journeys.",
+ !weight 20,
+! size 20,
+!;
+
+Object sleeppallet "sleeping pallet" MON_your_quarters
+ with name "pallet" "sleeping" "roll",
+ description "This is your sleeping pallet, a short portable sleeping roll \
+ made of straw. It's softer than it looks.",
+ size 25,
+ react_before [;
+ Go: if (player in self) "You'll have to get off the sleeping \
+pallet first.";
+ ],
+ has supporter enterable;
+
+Object MON_f1hall1 "Hallway (near your quarters)"
+ with description "You are in a hallway running west and east. The \
+vaulted ceilings are a nice touch. Your \
+quarters are to the south.",
+ name "vaulted" "ceiling",
+ s_to MON_your_quarters,
+ w_to MON_f1hall2,
+ e_to MON_f1hall3,
+ has light;
+
+Object MON_f1hall3 "Hallway (near quarters of Palemon and TuffBerry)"
+ with description "You are in a hallway running west and east. \
+Brother TuffBerry's quarters lie to the south. Brother Palemon's \
+quarters are to the north.",
+ w_to MON_f1hall1,
+ e_to MON_f1hall4,
+ n_to MON_Palemon_quarters,
+ s_to MON_Tuffberry_quarters,
+ has light;
+
+Object MON_f1hall4 "Hallway (east end)"
+ with description "You are at the east end of an east-west hallway. \
+Brother Joseph's quarters lie to the north, and Brother Toolbox's \
+quarters lie to the south.",
+! The acolyte chambers lie to the east.",
+ w_to MON_f1hall3,
+ ! n_to MON_Joseph_quarters,
+ n_to "It doesn't look like Joseph is in. Perhaps you can find \
+him elsewhere.",
+ s_to MON_Toolbox_quarters,
+! e_to MON_acolyte_chambers,
+ has light;
+
+! Object MON_acolyte_chambers "Acolyte Chambers"
+! with description "You are in a long chamber that serves as the home \
+! for the many devoted acolytes of the Order. The room is currently \
+! empty.",
+! w_to MON_f1hall4,
+! has light;
+
+Object MON_f1hall2 "Hallway (west end)"
+ with description "You are at the west end of an east-west hallway. \
+There are stairs up and down here, and an exit to the west.",
+ name "stairs",
+ e_to MON_f1hall1,
+ u_to MON_f2hall1,
+ d_to MON_f0hall1,
+ w_to MON_garden,
+ has light;
+
+Object MON_garden "Monastery Gardens"
+ with description "You are in the Monastery gardens, where various \
+shrubs and conifers are covered in a light blanket of snow. \
+An open cloister lies to the west, while \
+a doorway heads east.",
+ name "cloister" "doorway" "shrubs" "conifers",
+ w_to MON_cloister,
+ e_to MON_f1hall2,
+ has light;
+
+!Nearby shrubs "snow-covered shrubs"
+! with name "shrubs" "shrub" "snow-covered" "conifers" "conifer" "plants",
+! description "Good thing they're evergreen.",
+! has scenery;
+
+Object sand "sand" MON_garden
+ with name "sand",
+ initial "A small area in the snow has been cleared for late winter \
+planting, and some sand has been sprinkled here and there.",
+ description "A handful of sand, nothing more, nothing less.",
+ !weight 5,
+ size 5,
+ article "some",
+;
+
+Object MON_cloister "Cloister Walkway"
+ with description "You are in an open cloister, that runs along the \
+Monastery gardens to the east. To the north is the main wing of the \
+Monastery. To the south is the entrance hall.",
+ name "cloister",
+ e_to MON_garden,
+ n_to MON_Main_hall,
+ s_to MON_Entrance_hall,
+ has light;
+
+Object MON_Entrance_hall "Entrance Hall"
+ with description "This is the large entrance hall to the Monastery. \
+Many a devoted visitor has passed through this place. \
+There is an exit to the outside world to the \
+south, and the rest of the Monastery lies to the north.",
+ s_to Cliff_face, out_to Cliff_face,
+ n_to MON_cloister,
+ before [;
+ Go:
+ if ((noun==s_obj) || (noun==out_obj))
+ print "You are surprised by a cold blast of wind as you leave the Monastery!^";
+ ],
+ after [;
+ Go:
+ if ((noun==in_obj) || (noun==n_obj))
+ print "You are greeted by relatively warm and cozy air.^";
+ ],
+ has light;
+
+Object MON_Main_hall "Main Hall"
+ with description "This is the main hall of worship in the Monastery. \
+A large domed ceiling hides some sort of lighting that create a warm yet \
+serene atmosphere. A covered walk to the rest of the Monastery lies to \
+the south. To the north is the Monastery chapel. A brazier sits in \
+the center of the room.",
+ name "dome" "ceiling" "lighting" "atmosphere",
+ s_to MON_cloister,
+ n_to MON_Chapel2,
+ has light;
+
+Nearby brazier "brazier"
+ with name "brazier",
+ description "This is a silver incense brazier, somewhat similar to \
+an ornamental bowl on a tripod. Brother Palemon supposedly \
+found it on one of his many journeys.",
+ before [;
+ Take:
+ "That's been in the Monastery for years. People would \
+ be upset if you took it.";
+ Receive:
+ ! if (noun~=incense)
+ if (noun has is_sphere) {
+ print "As you place the sphere in the brazier, \
+you feel a strange sensation. Suddenly, the brazier is filled \
+with ";
+ if (noun == brown_sphere)
+ print "earthworms!";
+ if (noun == green_sphere)
+ print "seawater!";
+ if (noun == red_sphere)
+ print "burning embers!";
+ if (noun == silver_sphere)
+ print "white vapors!";
+ " No, wait, it's empty again. You hastily \
+withdraw the sphere, and try to clear your mind.";
+ }
+ else "That doesn't seem quite appropriate.";
+ ],
+ size 9,
+ has scenery container open;
+
+Object MON_Chapel2 "Monastery Chapel"
+ with description "You are in the Monastery Chapel, the site of the \
+recent appearance of the legendary Anabais. Signs of the \
+recent visit include the slightly scorched walls, and the \
+reek of brimstone. Wood pews are arranged in a circle \
+around the central altar. The exit is south.",
+ name "pews" "scorched",
+ s_to MON_Main_hall,
+ before [;
+ Smell:
+ "You detect the faint odor of brimstone.";
+! Yell:
+! if ((parent(Joseph)==MON_Chapel2) && (Joseph hasnt general))
+! "Shhh. You don't want to abruptly disturb Joseph like that.";
+! Go:
+! if (noun==s_obj) {
+! if ((parent(Joseph)==MON_Chapel2) && (Joseph has general) &&
+! (WeightOf(Joseph) > 140)) {
+! if (WeightOf(Joseph) == 149) {
+! Joseph.weight = 139;
+! print "^As you leave, Brother Joseph calls out \
+! ~Oh, and take something for that cold!~^";
+! rfalse;
+! }
+! if (WeightOf(Joseph) == 148) {
+! Joseph.weight = 139;
+! print "^As you leave, Brother Joseph calls out \
+! ~Oh, and remember -- reading the scriptures \
+! is one sure way of maintaining an active mind!~^";
+! rfalse;
+! }
+! if (WeightOf(Joseph) == 147) {
+! Joseph.weight = 139;
+! print "^As you leave, Brother Joseph calls out \
+! ~Oh, and remember -- mirth is wonderful for the soul, \
+! in moderation, of course.~^";
+! rfalse;
+! }
+ ! add in any others here...
+! }
+! }
+! Sneeze:
+! if (Joseph hasnt general) {
+! give Joseph general;
+! Joseph.weight = 149;
+! JosephWakeAction();
+! rtrue;
+! }
+! Yawn:
+! if (Joseph hasnt general) {
+! give Joseph general;
+! Joseph.weight = 148;
+! JosephWakeAction();
+! rtrue;
+! }
+! Laugh:
+! if (Joseph hasnt general) {
+! give Joseph general;
+! Joseph.weight = 147;
+! JosephWakeAction();
+! rtrue;
+! }
+! Drop:
+! if (Joseph hasnt general) {
+! give Joseph general;
+! Joseph.weight = 146;
+! JosephWakeAction();
+! move (inp1) to MON_Chapel2;
+! rtrue;
+! }
+ ],
+ has light;
+
+! And now, the incredible shrinking Brother Joseph...
+! Modified 3/16 -- this puzzle seems to be unpopular...
+Object Joseph "Joseph" MON_Chapel2
+ with name "Brother" "Joseph",
+ description "Brother Joseph is a pale man, with gray eyes, a fine \
+ beard, and a finer disposition.",
+! weight 150,
+ number 0, ! used to hold count of (fake) rod pieces received
+ describe [;
+! if (self hasnt general)
+! "Brother Joseph is kneeling in front of the remains of the altar, \
+! his eyes closed, deep in meditation.";
+! else
+ "Brother Joseph is here, standing by the altar.";
+ ],
+ life [;
+! if ((WeightOf(Joseph) == 150) && ((action ~= ##Attack) ||
+! (action ~= ##WakeOther)))
+! "Perhaps it's best not to bother him, he seems very \
+! deep in meditation.";
+! WakeOther:
+! if (WeightOf(Joseph) == 150)
+! "Joseph isn't asleep, just meditating. You may need to \
+!do something subtle to rouse him.";
+ Attack, ThrowAt:
+ deadflag = 1;
+ Player_Lives_Left = 0;
+"Your blow sends Brother Joseph staggering back.^^\
+Brother Joseph gets up and brushes himself off, and glares \
+at you. Ro-roo, I think you made him mad. \
+You remember, of course, that Brother Joseph is a renowned \
+full-contact martial artist?^^\
+~Impudent wretch! I'll show you how we deal with non-believers here!~\
+^^Suddenly, Brother Joseph produces a gigantic mallet from \
+beneath his robes and clobbers you into a pulp.";
+ Ask:
+ if (second=='amulet')
+ "~Don't leave the Monastery without it!~";
+ if (second=='joseph')
+ "Joseph smiles. ~I believe we've been introduced.~";
+ if (second=='rod')
+ "~We must recover the Rod before it is too late!~";
+ if (second=='anabais')
+ "~Beware the demon! He is most cunning and dangerous!~";
+ if (second=='scriptures')
+ "~Study the holy scriptures, and you will be rewarded.~";
+ if (second=='palemon' or 'tuffberry' or 'toolbox')
+ "~I fear I know not where his feet now tread.~";
+ "~I don't know anything about that. Perhaps you should \
+ consult our library upstairs?~";
+
+ Tell:
+ "~Do tell.~";
+
+ Show:
+ if (noun has is_rod)
+ "~Have you succeeded in retrieving the Rod? If so, \
+do what you feel is right.~";
+
+ Give:
+ if (noun has is_rod) {
+ if ((noun==black_rod_piece) || (noun==white_rod_piece) ||
+ (noun==smoke_rod_piece) || (noun==gray_rod_piece)) {
+ Joseph.number = Joseph.number + 1;
+ remove noun;
+ print "Joseph takes the rod piece. ";
+ if (Joseph.number==4) {
+ ! trouble -- got the whole fake rod to Joseph...
+ deadflag = 1;
+ Player_Lives_Left = 0;
+ "~The Order will \
+remember your acts of bravery forever,~ Joseph says, as he brings out \
+all four rod pieces and tries to join them together. A sudden burst \
+of light blinds you!^^\
+When you can see again, a large black sphere of malevolent energy \
+floats nearby! Joseph, either dead or stunned, lies in one corner \
+of the room. The four rod pieces are floating above the sphere.^^\
+~Foolish little priest,~ a evil voice says in you mind. ~You \
+have only brought upon yourself your own undoing. With my rod returned \
+by an innocent, the pact is complete. Come forth, my brothers, \
+for our time of power is at hand!~^^\
+The last thing you hear is mocking laughter, before the world \
+as you know it comes to a close.";
+ }
+ else
+ "~Well done, brave Priest!~ he says.";
+ }
+ else
+"Joseph looks at the rod piece and seems puzzled. ~This isn't any part \
+of the Rod of the Ancients that I've ever seen. And yet, it seems similar.~ \
+He hands it back to you. ~In this, my teachings can help you no \
+further.~";
+ }
+ else "Joseph waves off your offering. ~You may \
+need that in your quest.~";
+ Answer, Order:
+ if (special_word=='hello' or 'hi')
+ "Joseph smiles. ~Hello.~";
+ default:
+ "At the moment, Joseph seems to be \
+preoccupied with spiritual matters.";
+ ],
+ before [;
+ Cast:
+ "Brother Joseph stops you in mid-chant. ~That won't be necessary~";
+ ],
+ each_turn [;
+ if (self hasnt general) {
+ give self general;
+ move Amulet to player;
+ "^Joseph smiles as you enter. \
+~I'm glad you found me. As you know, thanks to the old \
+fool standing before you, the demon Anabais is loose upon \
+the world once more. He has broken the Rod of the Ancients \
+which was keeping our house and Order protected from outsiders. \
+It is a sorry day for us all.~ Joseph pauses for a moment. \
+~You are our final hope in a time of chaos. Brothers \
+Palemon, TuffBerry and Toolbox have left the Order, and only \
+you remain. I must now ask you to serve the Order which you \
+have so faithfully served in the past. No short order this, for \
+our continued existence depends on it, but you must go out into \
+a world gone mad alone, and retrieve the four broken pieces of \
+the Rod of the Ancients, and return them here to me, so that we \
+can rid the world of the evil we have loosed!~^^Brother Joseph \
+pauses and searches his robes.^^~Here, you will need this,~ he \
+says, giving you a strange amulet. ~Without this amulet, the \
+Ancient Ones cannot give you the mystic aid that you will most \
+certainly need. But I waste much time. Go now, and may the \
+Gods smile upon us all.~";
+ }
+ ],
+ has animate proper;
+
+Object Amulet "holy amulet"
+ with name "amulet" "holy",
+ description "This small golden amulet and chain seem to \
+shimmer with a strange mystic saffron energy. The \
+pendant portion of the amulet is in the shape of a small \
+golden cube.",
+ ! weight 10,
+ size 7,
+ before [;
+ Wear:
+ if (self hasnt worn) { give self worn;
+ "As you place the amulet around your neck, \
+ you feel a strange sense of mystic power.";
+ }
+ else "You're already wearing that.";
+ ],
+ has clothing scored;
+
+! [ JosephWakeAction;
+! print "^You make a subtle noise^^\
+! Brother Joseph opens his eyes, breathes deeply, and smiles.^^\
+! ~I'm glad you found me. As you know, thanks to the old \
+! fool standing before you, the demon Anabais is loose upon \
+! the world once more. He has broken the Rod of the Ancients \
+! which was keeping our house and Order protected from outsiders. \
+! It is a sorry day for us all.~ Joseph pauses for a moment. \
+! ~You are our final hope in a time of chaos. Brothers \
+! Palemon, TuffBerry and Toolbox have left the Order, and only \
+! you remain. I must now ask you to serve the Order which you \
+! have so faithfully served in the past. No short order this, for \
+! our continued existence depends on it, but you must go out into \
+! a world gone mad alone, and retrieve the four broken pieces of \
+! the Rod of the Ancients, and return them here to me, so that we \
+! can rid the world of the evil we have loosed!~^^Brother Joseph \
+! pauses and searches his robes.^^~Here, you will need this,~ he \
+! says, giving you a strange amulet. ~Without this amulet, the \
+! Ancient Ones cannot give you the mystic aid that you will most \
+! certainly need. But I waste much time. Go now, and may the \
+! Gods smile upon us all.~";
+! move Amulet to player;
+! rtrue;
+!];
+
+Object altar "altar"
+ with name "altar" "damaged" "cube",
+ description "The altar is roughly the shape of a five foot \
+ white cube. The top edges appear to be singed black and there \
+ are cracks and chips all over.",
+ found_in MON_Chapel1 MON_Chapel2,
+ before [;
+ Search:
+ if (self hasnt general) {
+ give self general;
+ move holywater to player;
+ "You uncover a vial of holy water.";
+ }
+ ],
+ has scenery supporter;
+
+Object holywater "vial of holy water"
+ with name "holy" "water" "vial",
+ description "A small glass vial of holy water.",
+ before [;
+ Eat: "You might want to try drinking it instead.";
+ Drink: remove self;
+ Player_HP_CUR = Player_HP_MAX;
+ "You quaff the holy water with a simple ceremony. \
+You feel physically and spiritually refreshed.";
+ ],
+ size 5,
+;
+
+Object MON_Palemon_quarters "Brother Palemon's Quarters"
+ with description [;
+ print "You are in Brother Palemon's quarters, which \
+ have been left unattended ever since Brother Palemon's \
+ unexplained disappearance many years ago";
+ if (self has general)
+ print ". To the west, a small secret door in the wall leads \
+ into darkness";
+ ". The exit is south.";
+ ],
+ s_to MON_f1hall3,
+ w_to [;
+ if (self hasnt general)
+ "You can't go that way.";
+ else return MON_Hidden_sanctum;
+ ],
+ before [;
+ Push:
+ if (noun == w_obj) {
+ if (self hasnt general) {
+ give self general;
+ "Pushing the west wall reveals a hidden secret door! \
+You've been in these quarters before, but certainly never noticed \
+anything like this!";
+ }
+ else "Nothing happens.";
+ }
+ Touch, Rub:
+ if ((noun == w_obj) && (self hasnt general))
+ "Oddly, a section of the west wall feels slightly thin.";
+ ],
+ has light;
+
+Object journal "thin journal" MON_Palemon_quarters
+ with name "journal" "thin",
+ description "This journal is very strange indeed. Brother \
+ Palemon seems to have been very preoccupied up to the point \
+ of his disappearance with strange accursed places that he \
+ claims are located all over Quendor. He also makes several \
+ references to evil 'spirits' found in these places. You also \
+ notice that several pages of parchment near the back of \
+ the journal have been torn out.",
+ !weight 20,
+ size 15,
+;
+
+Object MON_Hidden_sanctum "Hidden Sanctum"
+ with description "You are standing in a small chamber that obviously hasn't \
+been used in quite some time -- the cobwebs and dust are several \
+layers thick. There is a short crawl east.",
+ name "cobwebs" "dust",
+ e_to MON_Palemon_quarters,
+;
+
+
+Object dusty_scroll "dusty scroll" MON_Hidden_sanctum
+ class scroll_class,
+ with name "dusty",
+;
+
+Object foblub_spell "deliver magnificent sermon (glue audience to seats)" dusty_scroll
+ class spell_class,
+ with name "foblub",
+ magic [;
+ if (second hasnt animate)
+ "Your sermon goes unheard.";
+ if (second == player)
+ "Well, I know you like listening to yourself, but \
+isn't this a bit much?";
+ "You give a wonderful sermon about how one's future \
+ affects one's past, but no one seems to be listening.";
+ ],
+;
+
+
+Object MON_TuffBerry_quarters "Brother TuffBerry's Quarters"
+ with description "You are in Brother TuffBerry's quarters, vacant \
+since he undertook his quest for Joseph not long ago. The \
+exit is north.",
+ n_to MON_f1hall3,
+ has light;
+
+Object page "torn page" MON_TuffBerry_quarters
+ with name "torn" "page",
+ !weight 5,
+ size 5,
+ description "This page was apparently \
+torn from a larger document of some sort. All that is left \
+now reads:^^\
+ ~...fear. Just today I heard again something below \
+ me when I was meditating upstairs. \
+ It sounded like a person, or something alive at least \
+ was just below, trying to quietly move around unnoticed. \
+ Clearly this is \
+ impossible, and yet I cannot doubt what I heard. \
+ Palemon tells me I'm hearing spirits, but little does \
+ he know that I once heard the same noises in his \
+ very chambers! He was not around at the time, but \
+ to the west, behind the wall, I...~",
+;
+
+
+!Object MON_Joseph_quarters "Brother Joseph's Quarters"
+! with description "You are in Brother Joseph's quarters. The hallway lies \
+! to the south.",
+! s_to MON_f1hall4,
+! has light;
+
+Object MON_Toolbox_quarters "Brother Toolbox's Quarters"
+ with description "You are in Brother Toolbox's quarters, vacant \
+ever since he left the order due to differences many years \
+ago. The exit is north.",
+ n_to MON_f1hall4,
+ has light;
+
+Object tb_diary "diary" MON_Toolbox_quarters
+ with name "diary" "toolbox",
+ description "\
+ ~-- <944 GUE> Today Brother Joseph tried to explain the \
+ essence of how we channel magic energy through our \
+ amulets. To me, this seems to pale in comparison with \
+ the seemingly innate abilities of those who call \
+ themselves Enchanters. Joseph did show me a nice \
+ trick, however. He brought the Rod of the Ancients near \
+ my amulet, and the amulet gave off a sudden purple flash of light! \
+ I'll have to try that one on the Acolytes tomorrow.~^^\
+ (there isn't much else of interest until the \
+ very last entry, which is not dated)^^\
+ ~-- So long diary. I'm now off to seek greater spiritual \
+ guidance in Thriff. I hear the summers there are very nice \
+ too.~",
+ !weight 12,
+ size 12,
+;
+
+Object folded_scroll "folded scroll" MON_Toolbox_quarters
+ class scroll_class,
+ with name "folded",
+;
+
+Object espnis_spell "deliver dull sermon (cause sleep)" folded_scroll
+ class spell_class,
+ with name "espnis",
+ magic [;
+ if (second hasnt animate)
+ "Your sermon goes unheard.";
+ if (second == player)
+ "A preacher boring himself to sleep with his \
+own sermon? This doesn't seem prudent.";
+ CDefArt(second);
+ " listens as you begin your sermon about the general \
+ religious practices of the royal families of the past, but \
+ only stifles a yawn when you finish.";
+ ],
+;
+
+
+Object MON_f2hall1 "Hallway (second floor, west)"
+ with description "You are in a hallway on the second floor \
+ of the Monastery. The hallway continues east, while \
+ stairs lead downwards.",
+ name "stairs",
+ d_to MON_f1hall2,
+ e_to MON_f2hall2,
+ has light;
+
+Object MON_f2hall2 "Hallway (second floor, east)"
+ with description "You are in a hallway on the second floor \
+ of the Monastery that runs east-to-west. To the \
+ north is the private meditation room. To the east \
+ is the Monastery library. To the northeast is an \
+ entrance to the steeple room.",
+ w_to MON_f2hall1,
+ n_to MON_priv_med_room,
+ e_to MON_Library,
+ ne_to MON_Steeple_room,
+ has light;
+
+Object MON_priv_med_room "Private Meditation Room"
+ with description "You are in a small bare chamber that is \
+ used for private meditation and worship. The only \
+ exit lies to the south.",
+ s_to MON_f2hall2,
+ has light;
+
+Object MON_Library "Monastery Library"
+ with description "You are in the Monastery library, a cozy, \
+ almost cramped room with shelves of various books. \
+ The exit is to the west.",
+ w_to MON_f2hall2,
+ has light;
+
+Object lib_shelves "shelves" MON_Library
+ with name "shelves" "bookshelves",
+ description "Just some bookshelves.",
+ has scenery supporter;
+
+! *** LIBRARY BOOKS
+
+! Scriptures:
+! -- Of course, this is a ruse created from the deviations of
+! Anabais. Grounded in some fact though. Each section has a
+! lie, which may not initially be obvious. Truthful sections
+! are scattered over Quendor.
+Object HolyScriptures1 "a copy of the Holy Scriptures" lib_shelves
+ with name "holy" "scriptures" "copy",
+ description "This sacred tome details the teachings and \
+beliefs of the Order, of which it's certainly always good \
+practice to re-familiarize yourself with. The scriptures are \
+divided into several sections. Sections that \
+can be consulted in greater detail include:^^\
+~Doctrines~^\
+~Demons~^\
+~Spirits~^\
+~(Book of the) Mystical~^\
+~(Book of the) Planes~^\
+~(Book of the) Ancients~^\
+~Legend of the Rod~",
+ before [ w1; Consult:
+ if (consult_words > 1)
+ "You'll have to consult the sacred book by \
+individual section.";
+ wn = consult_from; w1 = NextWord();
+ switch (w1) {
+ 'doctrines', 'doctrine', 'canon':
+"~THE SACRED DOCTRINES OF THE ORDER OF BALANCE:^^\
+Thou shalt strive to achieve balance in a world filled with unbalance.^\
+Thou shalt pray to the Deities in moments of inner reflection.^\
+Thou shalt not harm innocents nor aid them -- this is the way of balance.~";
+! TODO add add
+ 'demons', 'demon', 'anabais':
+"~Fear not, mortal men^\
+though your world be filled with demons^\
+and the wicked.^^\
+Thou alone can prevail^\
+as The Ancient Ones^\
+against Anabais, the trickster^\
+were victorious.~";
+! LIE - The ancient ones lost to Anabais and the other demons
+ 'spirits', 'spirit':
+"~Before the dawn of time, know that our world was \
+filled with evil spirits of the elements, \
+until mankind came upon the land and vanquished them \
+forever.~";
+! LIE - spirits still exist.
+ 'mystic', 'mystical', 'magic', 'chant':
+"~If one is true of doubts, then a believer in the \
+great Harmony can draw upon the powers of the Ancients \
+and perform feats of mystic power anywhere. Remember that in \
+so doing, thou must act only as the channel of mystical \
+power for the Ancient Ones.~";
+! LIE - powers don't work everywhere, and not always.
+ 'planes', 'plane', 'atrii', 'hades':
+"~Let not the ways of the mortal life \
+dissuade the knowledge of higher and lower planes \
+of existence.^^\
+For, beyond mortal reach are places where those who \
+have truly served the Order and those who have truly \
+forsaken the Harmony of Balance will find themselves \
+in death. These are the Ethereal Plane of Atrii and \
+the plane of the damned -- Hades.~";
+! LIE - don't have to die to reach Atrii.
+ 'ancients', 'ancient':
+"~Trust in The Ancient Ones, those Three who showed mankind the \
+way of Balance and Harmony.~";
+! LIE - Four ancient ones existed.
+ 'rod', 'legend':
+"~Anabais foresaw his own demise when he dared to \
+challenge the Ancient Ones. From powers of light and \
+darkness, the Ancient Ones constructed that holy Rod that \
+we know only as the Rod of the Ancients, and did smite \
+the demon Anabais so grievously, that they did imprison \
+him in that very Rod, where he could do no harm. This \
+very Rod was made of pieces of ancient elemental energy, \
+once separated. Only the powers of the Ancients could \
+bring them together.~";
+! LIE - Anabais never imprisoned, etc.
+ default: "There doesn't seem to be a section \
+about that.";
+ }
+ Cast:
+ if (the_spell_was == ledak_spell) {
+ remove self;
+ "The scriptures are surrounded by a \
+yellow glow. To your horror, the tome evaporates into nothing!";
+ }
+ ],
+ !weight 20,
+ size 15,
+has proper;
+
+! *** parchments
+! (Several scraps of
+! Palemon's journal are scattered around Quendor,
+! contradicting the ancient scriptures)
+
+! (faded -- spirits exist)
+Object p2 "faded parchment" MON_Hidden_sanctum
+ class parchment_class,
+ with name "faded",
+description "~...are real! I have seen much evidence in the \
+jungles of Miznia, marshes of Fublio Valley, the ruins \
+of old Egreth and in Aragain itself! I believe that \
+they are associated with certain basic elements in the \
+surrounding area. But they dare not show themselves now, \
+not while magic is strong! Woe unto us, should the powers \
+of magic cease, as there would be nothing to stop their \
+terror...~",
+;
+
+Object MON_Steeple_room "Steeple Room"
+ with description "You are in a round room with colored-glass \
+ windows. Wood beams line the walls and rise to form \
+ a short point in the peaked ceiling above. A small \
+ walkway returns to the southwest. A long wood table \
+ sits in the center of the room.",
+ name "windows" "glass" "beams" "walkway" "handle" "latch",
+ sw_to MON_f2hall2,
+ !out_to MON_Steeple_roof,
+ out_to steeple_window,
+ before [;
+ Go:
+ if ((noun == out_obj) && (steeple_window has open)) {
+ if (random(10) < 3) {
+ print "^You climb out the open window and somehow manage \
+ not to fall.^";
+ }
+ else {
+ deadflag = 1;
+print "^You climb out the open window, but slip on the icy sill";
+if (has_resist_gravity == 0) ", and plummet to the ground!";
+else
+"! As you float slowly downwards, you can't help but notice the \
+hungry-looking winter dire wolf below, waiting for you to land...";
+ }
+ }
+ ],
+ has light;
+
+Object MON_Steeple_roof "Steeple Roof"
+ with description "You are on a very narrow ledge outside \
+ the Monastery steeple. The snow and wind are doing \
+ their best to send you to a ungracious death below. The \
+ steeple roof is quite sharply slanted.",
+ in_to steeple_window,
+ name "roof" "ledge" "wind",
+ cant_go "It's hard enough staying on the ledge.",
+ before [;
+ Jump:
+ deadflag = 1;
+ if (has_resist_gravity==0)
+ "Well, if you insist. The ground breaks most of the \
+ bones in your body, including the important ones.";
+ else
+ "You float downwards gracefully, into the waiting \
+jaws of a winter dire wolf."; ! <shrug>
+ ],
+ has light;
+
+Object steeple_window "steeple window"
+ with name "window" "rose" "steeple",
+ found_in MON_Steeple_room MON_Steeple_roof,
+ description [;
+ print "A large rose-colored glass window";
+ if (location==MON_Steeple_room)
+ ", with a handle and latch";
+ ".";
+ ],
+ describe [;
+ if (location==MON_Steeple_room) {
+ if (self has open)
+ "Someone has left a rose-colored window open and some \
+snow drifts in.";
+ "A large rose-colored window lets some light in.";
+ }
+ if (location==MON_Steeple_roof) {
+ if (self has open)
+ "A window opens into the steeple proper.";
+ "A large rose-colored window is partially covered with snow here.";
+ }
+ ],
+ door_dir [;
+ if (location==MON_Steeple_room) return out_to;
+ return in_to;
+ ],
+ door_to [;
+ if (location==MON_Steeple_room) return MON_Steeple_roof;
+ return MON_Steeple_room;
+ ],
+ before [;
+ Enter:
+ if (location==MON_Steeple_room) <<Go out_obj>>;
+ else <<Go in_obj>>;
+ Open:
+ if ((self hasnt open) && (location==MON_Steeple_roof))
+ "Unfortunately, the window opens inward, and the latch \
+ and handle are on the inside.";
+ if ((self hasnt open) && (location==MON_Steeple_room)) {
+ give self open;
+ "You turn and yank the window handle and pull. \
+ A rush of wind and snow greets you as you open \
+ the window.";
+ }
+ Close:
+ if ((self has open) && (location==MON_Steeple_roof))
+ "It doesn't seem to want to stay shut. You can't \
+quite reach the window latch from out here.";
+ Attack:
+ "The window glass remains unmarred. It's probably made of \
+ that especially thick lead-glass that the Monastery got \
+ because Brother Toolbox kept complaining about drafts.";
+ Push:
+ if (self hasnt open)
+ "It doesn't budge.";
+ Search:
+ "The window looks out into a winter wonderland.";
+ ],
+ has static door openable;
+
+Object steeple_table "long table" MON_Steeple_room
+ with name "table" "long" "steeple",
+ description "This long wood table has been used for various \
+ private meetings and impromptu get-togethers between \
+ members of the Order in the past.",
+ has scenery supporter;
+
+Object MON_f0hall1 "Hallway (basement)"
+ with description "You are in a hallway in the Monastery basement. \
+ The hallway continues to the east, and stairs lead upwards.",
+ name "stairs",
+ u_to MON_f1hall2,
+ e_to MON_Refectory,
+ has light;
+
+Object MON_Refectory "Refectory"
+ with description "You are in the Refectory, the general dining \
+area for members of the Order. You grimace at the lingering scent of \
+Brother Pufpistery's favorite dish -- Borphbelly stew. \
+Several large oak tables and benches adorn this otherwise \
+bare room. An exit lies to the west, the kitchen is to \
+the north, and another exit lies to the east.",
+ name "oak" "tables" "benches",
+ w_to MON_f0hall1,
+ n_to MON_Kitchen,
+ e_to MON_Storeroom,
+ before [;
+ Smell: "Even the faintest lingering scent of Borphbelly stew \
+is enough to make you feel like fasting.";
+ ],
+ has light;
+
+Object MON_Kitchen "Monastery Kitchen"
+ with description "You are in Brother Pufpistery's domain -- the \
+dreaded acolyte kitchen. A huge soup \
+cauldron sits unused nearby. The refectory is \
+south.",
+ s_to MON_Refectory,
+ before [;
+ Smell: "The lingering scent of Borphbelly stew \
+is stronger here, unfortunately.";
+ ],
+ has light;
+
+Object cauldrons "cauldron" MON_Kitchen
+ with name "cauldron" "vat",
+ description "This large iron soup cauldron has the \
+ unmistakable odor of Borphbelly stew. Ugg.",
+ size 25,
+ capacity 10,
+ before [;
+ Cast:
+ if (the_spell_was == bekdab_spell)
+ "The soup cauldron rusts a bit.";
+ ],
+ has scenery container open;
+
+Object preparing_table "preparing table" MON_Kitchen
+ with name "table" "preparing",
+ description "A heavy wood table with a well-used look.",
+ before [;
+ Cast:
+ if (the_spell_was == egdelp_spell)
+ "The table is now covered in a waxy film. \
+All things considered, it actually looks cleaner now.";
+ ],
+ has static supporter;
+
+Object recipe_paper "scrap of paper" preparing_table
+ with name "scrap" "recipe" "paper",
+ description "It's a recipe torn from an issue of \
+ ~Better Homes and Caverns~:^^\
+ GUILDMASTER SNEFFLE'S PRIZE WINNING BIRTHDAY CAKE \
+ ^^\
+ Ingredients:^^\
+ -- 1 small sack of flour^\
+ -- 1 large sugar cube^\
+ -- 1 packet of baking powder^\
+ -- 1 stick butter^\
+ -- 1 large corbie egg^\
+ -- Dornberries, to taste^^\
+ Mix the ingredients together. Fold the resulting \
+ mixture the correct number of times (a single gloth \
+ spell should do the trick). Bake in a GUE \
+ Automatic oven on the ~cake~ setting.^^\
+ Guildmaster Sneffle claims that ~the dornberries are \
+ the secret to making a cake even the King would be \
+ impressed with.~ He also notes that ~improper folding \
+ of the dough will produce very poor results.~",
+ !weight 1,
+ size 5,
+;
+
+Object MON_Storeroom "Storeroom"
+ with description "You are in a small cramped storeroom, stocked \
+with various crates and barrels of foodstuffs. \
+The refectory is west.",
+ name "crate" "crates" "foodstuffs",
+ w_to MON_Refectory,
+ d_to secret_trapdoor,
+ each_turn [;
+ if ((random(20) == 1) && (secret_trapdoor notin MON_Storeroom))
+ print "^A tiny mouse scurries into view, then disappears \
+ under a barrel.^";
+ ],
+ before [;
+ Go:
+ if (noun==d_obj)
+ if (secret_trapdoor hasnt general)
+ "You can't go that way.";
+ ],
+ has light;
+
+Object crate1 "large barrel" MON_Storeroom
+ with name "barrel",
+ description "A large wooden barrel labeled ~DRIED PRUNES~.",
+ before [;
+ Cast:
+ if (the_spell_was==egdelp_spell)
+ "The barrel is covered with a light \
+waxy film.";
+ Take, Remove:
+ "The barrel is far too bulky to take.";
+ Open:
+ "You'd probably need a hacksaw to do that. Besides, \
+ look what it says it contains.";
+ Push, Pull:
+ if (secret_trapdoor hasnt general) {
+ give secret_trapdoor general;
+ move secret_trapdoor to MON_Storeroom;
+ "Well whaddya know, a trapdoor...";
+ }
+ ],
+ has supporter;
+
+Object flour "sack of flour" crate1
+ with name "flour" "sack",
+ short_name "sack of flour",
+ description "A small sack of flour, all-purpose.",
+ !weight 15,
+ size 14,
+ has edible;
+
+Object MON_Caverns "Caverns"
+ with description "You are in an low underground cavern, made of roughly \
+worked stone. An even lower tunnel travels east.",
+ name "stone" "worked" "tunnel",
+ u_to secret_trapdoor2,
+ e_to cave_intersection,
+;
+
+! A two-way initially hidden trapdoor, which affects rooms.
+! To my great chagrin, I couldn't code this in one obj (sigh).
+! I admit it, this is my first Inform project.
+Object secret_trapdoor "trapdoor"
+ with name "trapdoor" "trap" "door",
+ description "A wooden trapdoor in the floor.",
+ door_to MON_Caverns,
+ door_dir d_to,
+ describe [;
+ if (self has open)
+ "A trapdoor opens into darkness below.";
+ "There is a closed trapdoor in the floor here.";
+ ],
+ before [;
+ Enter: <<Go d_obj>>;
+ Open:
+ give MON_Caverns light;
+ give secret_trapdoor2 open;
+ rfalse;
+ Close:
+ give MON_Caverns ~light;
+ give secret_trapdoor2 ~open;
+ rfalse;
+ ],
+ has static door openable;
+
+Object secret_trapdoor2 "trapdoor" MON_Caverns
+ with name "trapdoor" "trap" "door",
+ description "A wooden trapdoor in the ceiling.",
+ door_to MON_Storeroom,
+ door_dir u_to,
+ describe [;
+ if (self has open)
+ "Light gleams in from an open trapdoor above.";
+ "You notice a closed trapdoor in the ceiling.";
+ ],
+ before [;
+ Enter: <<Go u_obj>>;
+ Open:
+ give MON_Caverns light;
+ give secret_trapdoor open;
+ rfalse;
+ Close:
+ give MON_Caverns ~light;
+ give secret_trapdoor ~open;
+ rfalse;
+ ],
+ has static door openable;
+
+Object cave_intersection "Cave Intersection"
+ with description [;
+ print "You are in a large open cavern. The rough \
+ limestone here was probably eroded by underground springs \
+ to form the somewhat circular chamber you now stand in. \
+ Oddly, there seems to have been a recent cave-in, as \
+ piles of rubble line the walls. A tunnel \
+ snakes off to the west";
+ if (self has general)
+ ". To the southeast, there is a wide square hole!";
+ else ".";
+ ],
+ name "limestone" "rubble" "tunnel",
+ ! cant_go "There's too much rubble",
+ w_to MON_Caverns,
+ se_to [;
+ if (self hasnt general) rfalse;
+ if (self has general) return Mystical_Cave;
+ ],
+ before [;
+ Go:
+ if ((noun == se_obj) && (self has general)) {
+ if ((white_rod_piece in player) &&
+ (black_rod_piece in player) &&
+ (gray_rod_piece in player) &&
+ (smoke_rod_piece in player)) {
+ remove white_rod_piece;
+ remove black_rod_piece;
+ remove gray_rod_piece;
+ remove smoke_rod_piece;
+ Player_Lives_Left = 0; ! hope you saved...
+ spell_block = 1; ! going into the endgame...
+ print "^As you enter the tunnel, a strange \
+light surrounds you! The four rod pieces you were \
+carrying crumble into dust!^";
+ }
+ else
+ "Well, the hole to the southeast seems obvious \
+enough. But, some mysterious force blocks the way! \
+Try as you might, you can't seem to enter it!";
+ }
+ ],
+;
+
+Object steel_wall "steel wall" cave_intersection
+ with name "steel" "wall",
+ description "A ten-by-ten slab of solid steel, this wall \
+ must be at least a foot thick, and is accented by \
+ large steel rivets that bolt it to the surrounding \
+ rock.",
+ initial "To the southeast, a huge steel wall demonstrates \
+ a marked contrast to the otherwise drab surroundings.",
+ before [;
+ Open: "I presume you have a blow-torch handy?";
+ Push, Pull, Turn: "Not surprisingly, it doesn't move an inch.";
+ LookUnder: "It's flush with the rock floor.";
+ Cast: "The wall seems to absorb and nullify all magic!";
+ ],
+ has static;
+
+
+! ***********************************************************************
+! **
+! ** GRAY MOUNTAINS AREA NEARBY MONESTARY
+! **
+! ***********************************************************************
+
+Object Cliff_face "Cliff Face"
+ with description "You are standing near the top of a snowy mountain peak. \
+The wind is quite cold and is making your teeth chatter. \
+The general vicinity is mostly snow and rock; however, the \
+entrance into the Monastery is to the north, all but hidden from view \
+by the enormous slabs of snow-covered rock that make up the \
+cliff face. There is a rough but obvious trail leading down \
+the mountain to the south. There is also another trail that \
+winds even further up the mountain peak almost hidden in the \
+snow to the east.",
+ name "peak" "wind" "rock" "structure" "slabs" "trail",
+ n_to MON_Entrance_hall, in_to MON_Entrance_hall,
+ s_to rocky_trail, d_to rocky_trail,
+ e_to Covered_trail, u_to Covered_trail,
+ has light;
+
+Object Covered_trail "Covered Trail"
+ with description "You are climbing up a small trail that gets periodically \
+lost in great bluffs of snow. The swirling snow makes seeing \
+an unusual effort. The trail leads downwards to a cliff face \
+to the west, and rises towards the mountain top to the north.",
+ name "bluffs" "trail",
+ w_to Cliff_face, d_to Cliff_face,
+ n_to Mountain_peak, u_to Mountain_peak,
+ has light;
+
+Object Mountain_peak "Mountain Peak"
+ with description [;
+ print "You are standing on the top of a peak of the Gray \
+Mountains. A cold wind blows snow everywhere, obscuring what \
+would otherwise surely be a wonderful view of the surrounding \
+countryside. You can just make out some buildings to the far \
+south in Frostham. A snowy bluff marks the way back down";
+ if (self hasnt general)
+", or to the west, there appears to be a snowy outcropping. It seems to \
+hang precariously over the edge of the mountain, however.";
+ else ".";
+ ],
+ name "wind" "peak" "mountains" "countryside" "buildings" "bluff",
+ d_to Covered_trail,
+ w_to [;
+ if (self has general)
+ "Looks like the outcropping completely collapsed!";
+ return Snowy_outcropping;
+ ],
+ before [;
+ Go:
+ if ((noun==w_obj) && (self hasnt general) && (player notin sleeppallet)) {
+! if (WeightOf(player) > 25) {
+ if (children(player) > 0) {
+ print "As you start to tread out to the outcropping, you feel \
+ the snow beneath your feet shifting under your sudden \
+ weight! You ";
+ if (random(10) > 6) {
+ deadflag = 1;
+ "start to turn back, but the entire \
+ outcropping suddenly tilts under your weight, sending \
+ you hurtling off the edge into oblivion!";
+ }
+ else {
+ "beat a hasty retreat back to the peak.";
+ }
+ }
+ print "You carefully make your way onto the outcropping.^";
+ }
+ Jump:
+ "Not advisable, it's probably a long way down...";
+ ],
+ has light;
+
+Object Snowy_outcropping "Snowy Outcropping"
+ with description
+ "You are standing on a snow-covered outcropping. \
+ You are almost waist-deep in snow, and the blisteringly cold \
+ winds aren't helping. The outcropping juts out alarmingly \
+ over the western edge of the mountain. In fact, you can see the \
+ Monastery steeple below this ledge. \
+ The main portion of the mountain peak lies to the east.",
+ name "winds" "steeple" "peak",
+ e_to Mountain_peak,
+ each_turn [;
+ if (random(5)<=3)
+ "^There is an ominous creaking noise somewhere underfoot.";
+ "^Some snow falls off the outermost edge of the outcropping.";
+ ],
+ before [;
+ Go:
+ if (noun==e_obj)
+ print "You cautiously make your way back to the mountain top^";
+ if (noun==d_obj)
+ "That's not a very sound idea.";
+ Jump:
+ "Let's not be suicidal.";
+ Yell:
+ Outcrop_break(1); rtrue;
+ Sneeze:
+ Outcrop_break(2); rtrue;
+ Drop:
+ deadflag = 1;
+ "You must have disturbed something! The entire outcropping \
+ breaks away in an avalanche, and you plummet to your death!";
+ Take, Touch, Push, Pull:
+ if (noun==dirty_scroll) {
+ if (random(10) > 5) {
+ deadflag = 1;
+ give Mountain_peak general;
+ remove Snowy_Outcropping;
+ move dirty_scroll to MON_Steeple_roof; ! it's still obtainable...
+ "As you reach for the scroll, the entire outcropping lurches \
+ alarmingly! Without warning, it \
+ breaks away in an avalanche, and you plummet to your death!";
+ }
+ "As you reach for the scroll, you hear a disturbing rumbling \
+ from somewhere underfoot, and you step back hastily.";
+ }
+ Answer:
+ if (inp2==player) {
+ Outcrop_break(1); rtrue;
+ }
+ "To who/whom, exactly?";
+ ],
+ has light;
+
+[ Outcrop_break type;
+ if (type == 1)
+ print "You give the best bellow you can muster, given the current \
+ weather conditions.";
+ if (type == 2)
+ print "Understandable, given the weather conditions.";
+ print " Unfortunately, you seem to have disturbed \
+ something, as the entire outcropping gives way in a brief but \
+ powerful avalanche! You tumble through the air, followed by \
+ a large quantity of snow! But suddenly, you see the \
+ Monastery steeple rushing up to meet you!^^THUMP!^^\
+ You lie dazed for a moment. Miraculously, the dirty scroll \
+ lands next to you!^";
+ give Mountain_peak general;
+ move dirty_scroll to MON_Steeple_roof;
+ remove Snowy_Outcropping;
+ PlayerTo(MON_Steeple_roof);
+ rfalse;
+];
+
+Object dirty_scroll "dirty scroll" Snowy_outcropping
+ class scroll_class,
+ with name "dirty",
+ initial [;
+ if (location==Snowy_outcropping)
+ "There is a dirty scroll here, practically buried in the snow!";
+ "There is a dirty scroll here.";
+ ],
+;
+
+Object swanko_spell "banish spirit" dirty_scroll
+ class spell_class,
+ with name "swanko",
+ magic
+ [;
+ if (second==0)
+"The chant, looking for a locus of spiritual energy, fails.";
+ "The general vicinity seems pretty free of spirits now.";
+ ],
+;
+
+Object rocky_trail "Rocky Mountain Trail"
+ with description "You are on a rocky mountain trail \
+ that winds up and down a mountain. Patches of \
+ snow can be found here and there. The trail \
+ continues down the mountain to the south, or \
+ up to the north.",
+ name "trail",
+ d_to snowy_intersection,
+ s_to snowy_intersection,
+ u_to cliff_face,
+ n_to cliff_face,
+ has light;
+
+Object snowy_intersection "Snowy Intersection"
+ with description "You are at a snow-filled crossroads \
+ in a mountain trail. Paths lead north towards \
+ the top of the mountain, east, west, and south \
+ towards the base of the mountain.",
+ name "trail" "mountain",
+ n_to rocky_trail,
+ s_to North_of_river,
+ e_to "The path east is blocked after a short distance by a huge snow drift.",
+ w_to Top_of_drop,
+ has light;
+
+Object stone_marker "stone marker"
+ with initial "There is a large stone marker here, in \
+ the center of the intersection.",
+ name "stone" "marker" "obelisk",
+ description [;
+ print "This odd stone structure, partially \
+ covered in snow, looks quite old and mysterious. \
+ It's about seven feet tall, and is shaped like \
+ an obelisk";
+ if (self hasnt general)
+ ", with the top partially broken off.";
+ else ".";
+ ],
+ found_in snowy_intersection snowy_intersection2,
+ has static;
+
+! (second snowy intersection -- in the "past")
+Object snowy_intersection2 "Snowy Intersection"
+ with description "You are at a snow-filled crossroads \
+ in a mountain trail. Paths lead north towards \
+ the top of the mountain, east, west, and south \
+ towards the base of the mountain.^^Something \
+ seems familiar, yet different, about this place.",
+ name "trail" "mountain",
+n_to "The path north ends after a short distance.",
+s_to "The path north ends after a short distance.",
+w_to "The path north ends after a short distance.",
+e_to "The path east is blocked after a short distance by a huge snow drift.",
+ has light;
+
+
+Object stone_marker_top "broken stone top"
+ with name "top" "stone" "pinnacle" "broken",
+ capacity 1,
+ size 10,
+ description "The top pinnacle from the stone marker. \
+You notice that it's partially hollow inside.",
+ before [;
+ Receive:
+ if ((noun==silver_rod_piece) &&
+ (snowy_intersection has general)) {
+ move silver_rod_piece to self;
+ give snowy_intersection ~general;
+ remove self;
+ give snow general;
+ print "As you place the rod piece in the \
+broken stone piece, you sense a force from above pull you \
+skywards! In moments, you are high above the snow covered \
+mountains, nearing the sky, which you notice is strangely \
+purple!^";
+ PlayerTo(Mystical_Cave);
+ ! spell_block = 0;
+ Mystical_Cave.number = Mystical_Cave.number + 1;
+ rtrue;
+ }
+ ],
+ has container static open;
+
+Object Top_of_drop "Top of Snowy Slope"
+ with description "You're at the top of a short downwards slope into \
+ a snowy area below. A path leads east. You could also \
+ slide down the slope. A lone tree stands here, overlooking \
+ the slope.",
+ name "slope",
+ e_to snowy_intersection,
+ d_to Bottom_of_drop,
+ w_to Bottom_of_drop,
+ u_to [;
+ if (tree1 has general) <<Climb tree1>>;
+ ],
+ has light;
+
+Object tree1 "tree" Top_of_drop
+ with name "tree",
+ description "A leafless, bare tree, with what might be a bird's \
+nest in it.",
+ before [;
+ Climb:
+ if (self hasnt general) give self general;
+ print "You clamber up the tree.^";
+ PlayerTo(Top_of_tree); rtrue;
+ ],
+ has scenery;
+
+Object nest1 "nest" Top_of_drop
+ with name "nest",
+ description "Even from down here, it's a pretty big nest. \
+ Thankfully, no big birds seem to be present.",
+ before [;
+ Search: "You can't see into it from down here.";
+ ThrownAt:
+ move noun to Top_of_drop;
+ "You take aim, but miss.";
+ Receive, LetGo, Rub, Turn, Take, Push, Pull, Touch, Attack, Shake: "You can't reach it.";
+ Search, LookUnder: "From down here, it's hard to see anything \
+but the bottom of the nest.";
+ ],
+ has scenery;
+
+Object Bottom_of_drop "Bottom of Snowy Slope"
+ with description "You've made your way down to a small snow-covered \
+ clearing, ringed by pine trees. The only exit is back up the \
+ slope.",
+ name "clearing" "pine" "trees" "slope",
+ u_to Top_of_drop,
+ e_to Top_of_drop,
+ has light;
+
+Object boulder "large boulder" Bottom_of_drop
+ with name "boulder" "rock",
+ initial "There's a large boulder here, sitting squat in the \
+ middle of the clearing.",
+ description "A big, snow-covered rock.",
+ before [;
+ Push, Pull, Turn: "It must weight a ton.";
+ Receive:
+ if (noun==sleeppallet) {
+ move sleeppallet to boulder;
+ "You drape the pallet over the boulder.";
+ }
+ ],
+ has static supporter;
+
+Object egg_shards "egg shards"
+ with name "shards",
+ initial "There's some broken eggshell shards here, scattered all \
+ over. Some gooey egg stuff too.",
+ description "Some large pieces of shell is all.",
+ !weight 5,
+ size 5,
+;
+
+Object Top_of_tree "Top of tree"
+ with description "You're on top of the tree, on some lower branches \
+ that seem pretty stable.",
+ d_to Top_of_drop,
+ has light;
+
+Object tree2 "tree" Top_of_tree
+ with name "tree",
+ description "Overall, there's nothing terribly special about this tree.",
+ has scenery;
+
+Object nest2 "nest" Top_of_tree
+ with name "nest",
+ initial [;
+ print "There's a large bird's nest a bit farther out on a \
+ nearby branch";
+ if (corbie_egg in self)
+ print ". There appears to be an egg in it";
+ ".";
+ ],
+ description "Given the size and Brother Joseph's lessons \
+ in ornithology, you'd guess that it's a corbie's nest. \
+ It looks abandoned.",
+ before [;
+ ThrownAt:
+ move noun to Top_of_drop;
+ print "Your throw goes a little wide, and ";
+ DefArt(noun); print " lands ";
+ ! if (WeightOf(noun) > 10)
+ ! "with a thump below.";
+ ! else "below.";
+ "below.";
+ Take: "It's way out on a thinner branch that probably \
+ won't support your weight.";
+ Receive: "You can't quite reach it to put anything in it.";
+ Push, Pull, Rub, Touch, Attack, Shake: "You can't reach it.";
+ LookUnder: "It seems to be sitting on some branches.";
+ ],
+ size 10,
+ has static container open transparent;
+
+Object corbie_egg "corbie egg" nest2
+ with name "egg",
+ short_name "corbie egg",
+ description "A large speckled corbie egg.",
+ !weight 8,
+ size 5,
+ before [;
+ Take, Rub, Push, Pull, Touch, Squeeze, Turn, Shake:
+ if (parent(self) == nest2)
+ "You can't reach it.";
+ LookUnder:
+ if (parent(self) == nest2)
+ "It seems to be in a nest.";
+ ThrownAt:
+ if (parent(self) == nest2) {
+ move egg_shards to Top_of_drop;
+ move noun to Top_of_drop;
+ remove self;
+ "Good toss! A bit too strong though. With a dull \
+ crack, your throw breaks the egg, and pieces of \
+ shell and egg goop fall to the ground below.";
+ }
+ Attack:
+ move egg_shards to parent(player);
+ remove self;
+ "The egg breaks easily, covering you with egg goop. \
+What a mess.";
+ ],
+has edible scored;
+
+Object branch "branch" Top_of_tree
+ with name "branch" "branches",
+ description "Some leafless thin tree branches.",
+ before [;
+ Push, Pull, Turn, Shake:
+ if (corbie_egg in nest2) {
+ print "You give the branches a good shake. The egg pops \
+ free and tumbles to the ground below! You see the egg \
+ land in a soft patch of snow, and roll down the slope! \
+ Moments later, you hear a dull ";
+ if (sleeppallet in boulder) {
+ move corbie_egg to Bottom_of_drop;
+ "thump from below.";
+ }
+ else {
+ remove corbie_egg;
+ move egg_shards to Bottom_of_drop;
+ "crack from below.";
+ }
+ }
+ "You give the branches a good yank. A bit of snow falls.";
+ ],
+ has scenery;
+
+
+! Some scenery 'fluff'
+Object snow "snow"
+ with name "snow",
+ description "Cold, white and not in short supply.",
+ found_in Mountain_peak Covered_trail Cliff_face Snowy_outcropping MON_garden
+ snowy_intersection rocky_trail Top_of_drop Bottom_of_drop,
+ before [;
+ Take: "It melts into nothing soon after.";
+ Touch: "It's crisply cold.";
+ Search:
+ if ((self has general) && (location == snowy_intersection)) {
+ give self ~general;
+ Achieved(16);
+ move stone_marker_top to snowy_intersection;
+ "Remembering where the stone marker top fell, you brush \
+aside some snow. Sure enough, there it is!";
+ }
+ ],
+ has scenery;
+
+
+
+Object North_of_river "North of Frozen River"
+ with description "You are standing just north of a frozen river \
+(probably a tributary of Lake Dinge). You can just see \
+the south bank from here, where the trail seems to \
+continue. There doesn't seem to be a bridge, however. \
+A trail also continues north.",
+ name "river" "lake" "bank" "trail",
+ s_to Frozen_river,
+ n_to snowy_intersection,
+ has light;
+
+
+Object Frozen_river "On Frozen River"
+ with description "You are standing on a wide smooth river of ice. \
+The river 'runs' east to west, and there are banks to the \
+north and south.",
+ name "bank" "banks",
+ n_to North_of_river,
+ s_to South_of_river,
+ e_to "You slide eastwards, and lose your footing, going nowhere.",
+ w_to "You slide westwards, and slip, going nowhere.",
+ before [;
+ Drop:
+ if (noun==sand) {
+ move sand to Frozen_river;
+ Achieved(0);
+ "You scatter the sand onto the ice.";
+ }
+ Go:
+ if (noun==s_obj) {
+ if (player notin sleeppallet) {
+ if (sand notin Frozen_river)
+ "You slide and flounder helplessly on the ice!";
+ else
+ print "You tread lightly on the sand covered portion of \
+ the ice, and scramble to the south bank.^";
+ }
+ }
+ Jump:
+ deadflag = 1;
+ "You bravely jump, but without warning, the ice cracks in many \
+ places, and you fall into the freezing river, becoming a human \
+ popsicle in a short amount of time.";
+ ],
+ has light;
+
+! (special -- accessible only from Atrii -- put useful item here)
+Object Frozen_river2 "On Frozen River"
+ with description "You are standing on a wide smooth river of ice. \
+The river 'runs' east to west. To the north and south \
+are huge snow bluffs that obscure most of the surrounding \
+countryside.",
+ e_to "You step eastwards but lose your footing, going nowhere.",
+ w_to Frozen_river,
+ before [;
+ Go:
+ if (noun==w_obj)
+ print "^As you step west, a slight downwards slope \
+in the ice sends you sliding uncontrollably.^";
+ Jump:
+ deadflag = 1;
+ "You bravely jump, but without warning, the ice cracks in many \
+ places, and you fall into the freezing river, becoming a human \
+ popsicle in a short amount of time.";
+ ],
+ has light;
+
+! (scrawled -- clue to using spheres)
+Object p7 "scrawled parchment" Frozen_river2
+ class parchment_class,
+ with name "scrawled",
+description "~Red beats smoke,^\
+Silver bests clouds,^\
+Green defeats depths,^\
+Brown stops earth.~";
+
+Object river_ice "river ice"
+ with name "ice" "river",
+ description "The ice is thick and quite smooth.",
+ found_in Frozen_river Frozen_river2,
+ before [;
+! just trap all receives as drops
+ Receive:
+ <<Drop noun>>;
+ ],
+ has scenery supporter;
+
+Object South_of_river "South of Frozen River"
+ with description "You are standing just south of a frozen river. \
+You can just see the north bank from here, where the trail seems to \
+continue. The only way to get there is across the river. \
+A trail heads south into a valley.",
+ name "river" "bank" "trail",
+ n_to Frozen_river,
+ s_to Valley_trail,
+ has light;
+
+Object Valley_trail "Valley Trail"
+ with description "You are walking along a valley trail, just \
+ below a portion of the Gray Mountain ranges. You can \
+ see the beginnings of a city to the south, while the \
+ trail winds further into the mountain ranges to the \
+ north.",
+ name "trail" "ranges" "mountain" "city",
+ n_to South_of_river,
+ s_to FROSTHAM_Outskirts,
+ has light;
+
+! (An interesting object, with possible uses...)
+!Object bathroom_scale "bathroom scale"
+! with name "scale" "bathroom",
+! description [;
+! if (player in bathroom_scale)
+! "This is an odd small flat white device, with a tiny \
+! glass window at one end that you can see a numbered dial \
+! through. The dial currently reads -- wait, that \
+! can't be right. The thing must be broken.";
+! print "This is an odd small flat white device, with a tiny \
+! glass window at one end that you can see a numbered dial \
+! through. The dial currently reads: <",
+! (WeightOf(self) - 10), " Ughs>.^"; rtrue;
+! ],
+! weight 10,
+! has supporter enterable;
+
+
+! ***********************************************************************
+! ** (at this point, for clarity and my sanity, I'm going to build
+! ** the remaining locations & objects in separate files, included
+! ** here. Hopefully, the files will be somewhat organized based on
+! ** general location/town/situation, etc.
+! ***********************************************************************
+
+Include "frostham.inf";
+Include "aragain.inf";
+Include "anthar.inf";
+Include "fublio.inf";
+Include "borphee.inf";
+Include "miznia.inf";
+Include "gurth.inf";
+Include "subway.inf";
+Include "special.inf";
+
+! ***********************************************************************
+! **
+! ** HADES, in a newer format
+! **
+! ***********************************************************************
+
+Class Hades_Room_Class
+ with description "You are floating in an empty space. Surrounding you \
+ on all sides is a great wall of flame. It would almost seem \
+ like you are trapped inside a ball of fire.",
+ name "fire" "ball" "space" "flame",
+ before [;
+ if ((action~=##Go) && (action~=##Look) && (action~=##Wait))
+ "You currently lack the means to do that."; ! can't do much in Hades...
+ Go:
+ give self ~visited; ! cheat, easier than routines for each dir...
+ print "^You find yourself floating through the flaming wall! \
+ As you pass through you feel a gut-wrenching sensation. \
+ Well, perhaps you would if you currently had a gut, or \
+ sensations for that matter. Let's just say you feel \
+ something akin to a gut-wrenching sensation, and leave \
+ it at that.^";
+ ],
+ has light;
+
+Object Hades_1 "Hades"
+ class Hades_Room_Class
+ with u_to Hades_1,
+ d_to Hades_1,
+ n_to Hades_1,
+ s_to Hades_1,
+ e_to Hades_1,
+ w_to Hades_1,
+ in_to Hades_1,
+ out_to Hades_1,
+ ne_to Hades_2,
+ nw_to Hades_1,
+ se_to Hades_1,
+ sw_to Hades_1,
+ each_turn [;
+ if (random(10) == 1)
+ "^A wisp of smoke appears to the northeast, then fades.";
+ ],
+;
+
+Object Hades_2 "Hades"
+ class Hades_Room_Class
+ with u_to Hades_1,
+ d_to Hades_1,
+ n_to Hades_2,
+ s_to Hades_3,
+ e_to Hades_1,
+ w_to Hades_2,
+ in_to Hades_1,
+ out_to Hades_1,
+ ne_to Hades_2,
+ nw_to Hades_1,
+ se_to Hades_2,
+ sw_to Hades_2,
+ each_turn [;
+ if (random(10) == 1)
+ "^A wisp of smoke appears to the south, then fades.";
+ ],
+;
+
+Object Hades_3 "Hades"
+ class Hades_Room_Class
+ with u_to Hades_4,
+ d_to Hades_3,
+ n_to Hades_2,
+ s_to Hades_1,
+ e_to Hades_1,
+ w_to Hades_2,
+ in_to Hades_3,
+ out_to Hades_1,
+ ne_to Hades_2,
+ nw_to Hades_1,
+ se_to Hades_3,
+ sw_to Hades_3,
+ each_turn [;
+ if (random(10) == 1)
+ "^A wisp of smoke appears above, then fades.";
+ ],
+;
+
+Object Hades_4 "Hades"
+ class Hades_Room_Class
+ with u_to Hades_3,
+ d_to Hades_3,
+ n_to Hades_5,
+ s_to Hades_2,
+ e_to Hades_1,
+ w_to Hades_4,
+ in_to Hades_4,
+ out_to Hades_1,
+ ne_to Hades_1,
+ nw_to Hades_3,
+ se_to Hades_3,
+ sw_to Hades_1,
+ each_turn [;
+ if (random(10) == 1)
+ "^A wisp of smoke appears to the north, then fades.";
+ ],
+;
+
+Object Hades_5 "Hades"
+ with description "You are floating in an empty space. Surrounding you \
+ on all sides is a great wall of flame. It would almost seem \
+ like you are trapped inside a ball of fire.",
+ name "fire" "space",
+ u_to Hades_1,
+ d_to Hades_3,
+ n_to Hades_2,
+ s_to Hades_4,
+ e_to Hades_4,
+ w_to Hades_5,
+! in_to Hades_1,
+ out_to Hades_1,
+ ne_to Hades_1,
+ nw_to Hades_3,
+ se_to Hades_3,
+ sw_to Hades_2,
+ before [;
+ if ((action~=##Go) && (action~=##Look) &&
+ (action~=##Wait) && (action~=##Enter) &&
+ (action~=##Take) && (action~=##Examine))
+ "You currently lack the means to do that.";
+ Go:
+ if (noun==in_obj) {
+ Revive_Player1();
+ rtrue;
+ }
+ give self ~visited;
+ print "^You find yourself floating through the flaming wall! \
+ As you pass through you feel a gut-wrenching sensation. \
+ Well, perhaps you would if you currently had a gut, or \
+ sensations for that matter. Let's just say you feel \
+ something akin to a gut-wrenching sensation, and leave \
+ it at that.^";
+ ],
+ has light;
+
+Object Hades_flameball "Ball of flame" Hades_5
+ with name "ball" "sphere" "flame",
+ initial [;
+ print "In the center of the room is a ";
+ if (Player_Lives_Left >= 3)
+ "large flaming sphere.";
+ if (Player_Lives_Left == 2)
+ "medium-sized flaming sphere.";
+ "small flaming sphere.";
+ ],
+ description "It's rather hypnotic -- a perfect sphere made entirely of orange-red fire.",
+ before [;
+ Enter:
+ Revive_Player1();
+ rtrue;
+ ],
+ has enterable static open;
+
+[ Revive_Player1 ;
+ print "You find yourself drawn into flaming sphere. The \
+ ball of flame engulfs you completely, and you feel \
+ nothing as inky blackness surrounds you.^^\
+ ~You have revived him!~ you hear a voice say.^^\
+ You open your eyes. You are lying on a long wooden \
+ table in the Monastery Steeple room. Several members \
+ of the Order are gathered around you, and Brother \
+ Joseph helps you to your feet.^^\
+ ~We were able to bring you back to the world of the \
+ living,~ Joseph says, ~but I fear our powers are waning, \
+ and we may not succeed if we try again. Your quest \
+ continues!~^^\
+ The group files out, leaving you alone in the room.^";
+ in_hades = 0;
+ Player_Lives_Left--;
+ Player_HP_CUR = Player_HP_MAX; ! Healed up
+ give steeple_window ~open; ! one of the acolytes was too cold...
+ PlayerTo(MON_Steeple_room);
+];
+
+
+! ***********************************************************************
+! **
+! ** INITIALIZE AND OTHER STARTUP, place player, place objs, etc
+! **
+! ***********************************************************************
+
+[ Initialise;
+
+ thedark.description =
+ "It is pitch black. You are likely to be eaten by a grue.";
+
+ prayer_book.magic = all_my_spells;
+ <Learn prayer_book gnusto_spell>;
+ <Learn prayer_book frotz_spell>;
+ move prayer_book to player;
+ location=MON_Chapel1;
+
+! (FOR TESTING ONLY)
+!move amulet to player;
+!<Learn prayer_book huncho_spell>;
+!<Learn prayer_book feeyuk_spell>;
+!<Learn prayer_book ledak_spell>;
+!<Learn prayer_book egdelp_spell>;
+!<Learn prayer_book tossio_spell>;
+!move TEMPLE_Artifact to player;
+!move umbrella to player;
+!move sack to player;
+!move c1 to player;
+!move magic_door to player;
+!location = ANTHAR_GUSStation;
+!location=Skyscraper;
+!spell_block = 1;
+!<Learn prayer_book bekdab_spell>;
+!<Learn prayer_book egdelp_spell>;
+!<Learn prayer_book tossio_spell>;
+!move decaf_coffee_can to player;
+!location=ATRII_1;
+];
+
+
+! ***********************************************************************
+! **
+! ** Some special routines, which should be after Initialise
+! **
+! ***********************************************************************
+
+! The Afterlife -- or, a fine time in Hades
+[ AfterLife i;
+ if (Player_Lives_Left <= 0) {
+ print "^^A blackness surrounds you, replaced by more blackness...^^";
+ rfalse;
+ }
+ else {
+ deadflag = 0; ! not dead yet
+ ! move inventory to place of death
+ i=parent(player);
+ while (child(player)~=0) {
+ give child(player) ~worn;
+ move child(player) to i;
+ }
+ spell_block = 0;
+ in_atrii = 0;
+ in_hades = 1;
+ print "^^A blackness surrounds you, only to be replaced by...^^";
+ i = random(4);
+ if (i==2) { PlayerTo(Hades_2); rtrue; }
+ if (i==3) { PlayerTo(Hades_3); rtrue; }
+ else { PlayerTo(Hades_1); rtrue; }
+ }
+];
+
+
+[ DarkToDark i;
+ i = random(10);
+ if (i < 4) {
+ print "^Hmm, perhaps the Grues really are migrating with the \
+ Great Change.^";
+ rtrue;
+ }
+ if (i >= 4) {
+ deadflag = 1;
+ "^Well, don't say I didn't warn you. Something horrible \
+with slavering fangs lurks up and devours you!";
+ rtrue;
+ }
+];
+
+
+! [ WeightOf obj t i;
+! t = obj.weight;
+! objectloop (i in obj) t=t+WeightOf(i);
+! return t;
+! ];
+! Now, rules for capacity still hold (slightly unrealistic), but we
+! can now check WeightOf(player) in those situations that need it.
+
+[ PrintRank;
+ print ", earning you the rank of ";
+ if (score < 0) "Wanna-be Altar-boy";
+! if (score >= 500) "Truly Enlightened One";
+! if (score >= 495) "Benevolent One";
+! if (score >= 490) "Faithful One";
+! if (score >= 395) "Simple Man";
+! fill fill
+ if (score >= 250) "Enlightened One";
+ if (score >= 225) "Patriarch";
+ if (score >= 200) "Cardinal";
+ if (score >= 150) "Lama";
+ if (score >= 125) "Cleric";
+ if (score >= 100) "High Priest";
+ if (score >= 90) "Priest";
+ if (score >= 75) "Monk";
+ if (score >= 50) "Brother";
+ if (score >= 30) "Acolyte";
+ if (score >= 20) "Aspirant";
+ if (score >= 10) "Devoted";
+ if (score >= 5) "Believer";
+ "Non-believer";
+];
+
+[ PrintTaskName ach;
+ switch (ach) {
+ 0: "using sand to get across the river";
+ 1: "triplicating the cereal box";
+ 2: "setting the alarm clock";
+ 3: "getting the waxy scroll from the skier";
+ 4: "giving the palace guard a good cake";
+ 5: "solving Barsap's Gambit";
+ 6: "fixing the sailboat";
+ 7: "finding the rod in the shipwreck";
+ 8: "triplicating the ale";
+ 9: "finding the rod under the statue";
+ 10: "pruning the Christmas Tree Monster";
+ 11: "getting past the burly sports fan";
+ 12: "winning the three Golem bouts";
+ 13: "ending the kobold war";
+ 14: "unlocking Duncanthrax's Trophy chamber";
+ 15: "unlocking the Lab door";
+ 16: "finding the rod in the top of the marker";
+ 17: "finding the rod in the house foundation";
+ 18: "removing the impenetrable steel wall";
+ 19: "joining the True Rod";
+ 20: "getting past the broken subway gate";
+ 21: "finding the hidden path to the temple";
+ 22: "getting the rod through the temple";
+! 23: "finding the scroll in Frobar's painting";
+ 23: "getting the scroll from the boutique";
+ 24: "getting the scroll from Frobar";
+ 25: "getting into the subway tunnel";
+ 26: "banishing the four evil elementals";
+! add, if desired
+ }
+];
+
+! *** NEW ACTION ROUTINES
+
+[ PraySub i;
+ if ((in_hades == 1) || (in_atrii == 1) || (spell_block==1))
+ "You make a prayer and feel no spiritual response! \
+ Have the Deities forsaken you? Or have you found a \
+ place where even the Gods cannot provide guidance?";
+ else {
+ i = random(100);
+ if (Player_HP_MAX ~= (20 + score))
+ Player_HP_MAX = (20 + score);
+ ! consider increasing memory/spell capacity here
+ if (i==97) {
+ Player_HP_CUR = Player_HP_MAX; ! Healed
+ "You make a quick but respectful prayer to the \
+ Deities above, asking for Divine Guidance in your \
+ quest. A saffron glow surrounds you and you feel \
+ spiritually and physically renewed!";
+ }
+ "You make a quick but respectful prayer to the \
+ Deities above, asking for Divine Guidance in your \
+ quest. You finish and feel spiritually renewed.";
+ }
+];
+
+[ DiagnoseSub i;
+ if (Player_HP_CUR > Player_HP_MAX) ! (This should never happen)
+ "You feel superhuman!";
+ if (Player_HP_CUR == Player_HP_MAX)
+ "You are in good health.";
+ if (Player_HP_CUR == 1)
+ "You are near death's door.";
+ if (Player_HP_CUR < 5)
+ "You feel extremely weak.";
+ if (Player_HP_CUR < 10)
+ "You feel weak.";
+ i = (Player_HP_MAX / Player_HP_CUR);
+ if (i >= 4)
+ "You feel slightly weak";
+ if (i >= 2)
+ "You've been better, but you'll be okay.";
+ "You feel okay.";
+];
+
+[ StrongSub i;
+ i = random(20);
+ if (i > 15) {
+ deadflag = 1;
+ "Such language from a priest such as yourself! \
+ The ground rumbles, and a bolt of blue wrath from the \
+ Deities strikes you dead!";
+ }
+ "Such language from a priest such as yourself! \
+ The ground rumbles suddenly!";
+];
+
+! [ LiftSub ;
+! if (noun has static)
+! "That's fixed in place.";
+! if (noun has scenery)
+! "You're unable to.";
+! if (noun has animate)
+! "That would be less than courteous.";
+! print "You lift "; DefArt(noun); " and put it back in \
+! it's original position. Nothing obvious happens.";
+! ];
+
+[ ShakeSub ;
+ if (noun has animate)
+ "Get a hold of yourself. No need to go around shaking living \
+things like that.";
+ "Nothing happens.";
+];
+
+! (new insert routine, which is the same as old, except that
+! we also check relative sizes of objects)
+[ InsertSub;
+ receive_action = ##Insert;
+ if (second==d_obj ) <<Drop noun>>;
+ if (parent(noun)~=player) return L__M(##Insert,1);
+
+ if (second>1)
+ { action=##Receive;
+ if (RunRoutines(second,before)~=0) { action=##Insert; rtrue; }
+ action=##Insert;
+ }
+ if (second hasnt container) return L__M(##Insert,2);
+ if (second hasnt open) return L__M(##Insert,3);
+ if (IndirectlyContains(noun,second)==1) return L__M(##Insert,5);
+ if (noun has worn)
+ { L__M(##Insert,6);
+ <Disrobe noun>; if (noun has worn) rtrue;
+ }
+
+ if (children(second)>=ValueOrRun(second,capacity))
+ return L__M(##Insert,7,second);
+
+ if (noun.size > second.size) {
+ CDefArt(noun); print " appears to be too large to put in ";
+ DefArt(second); ".";
+ }
+ move noun to second;
+
+ if (AfterRoutines()==1) rtrue;
+
+ if (second>1)
+ { action=##Receive;
+ if (RunRoutines(second,after)~=0) { action=##Insert; rtrue; }
+ action=##Insert;
+ }
+ if (keep_silent==1) rtrue;
+ if (multiflag==1) return L__M(##Insert,8);
+ L__M(##Insert,9,noun);
+];
+
+[ FoldSub ;
+ "I fail to see what you're trying to accomplish by doing this.";
+];
+
+[ MixSub;
+ "I fail to see what you're trying to accomplish by doing this.";
+];
+
+![ SpecialDialSub;
+! if (noun hasnt numberdial)
+! "You can't seem to do that.";
+! if ((second > 9) || (second < 0))
+! print "It appears that the valid range for ",noun; " is 0 to 9";
+! noun.number = second;
+! if (noun.number > 9) noun.number = 0;
+! a special restriction in this case
+! print "You set ",noun," to ",second; ".";
+!];
+
+[ JoinSub;
+ "This doesn't seem terribly productive.";
+];
+
+[ MeditateSub;
+ "You close your eyes and focus your mind inwards. \
+Mere moments of time seem to pass like eons. You \
+open your eyes.";
+];
+
+[ YellSub;
+ "ARRGH!";
+];
+[ SneezeSub;
+ "You make a rather sickly noise.";
+];
+[ YawnSub;
+ if (Frobar in location)
+ "~Stop that!~ Frobar says, ~It's contagious.~";
+ else "Tired?";
+];
+[ XyzzySub;
+ "A hollow voice says, ~Cool!~";
+];
+[ BegSub;
+ "Please, no begging.";
+];
+[ LaughSub;
+ "Was it that funny?";
+];
+
+[ HelpSub;
+ "Hello Player!^^\
+SPIRITWRAK, An Interactive Fantasy Adventure^\
+If you're new to interactive fiction games, I lack the \
+space here to give an adequate description, but in short, \
+you're a character in a story, able to interact with \
+objects, places and other things (using regular english \
+sentences) in order to reach your goal, which is to \
+figure out how to ~solve~ the story. For a real \
+description, you might want to check out documents \
+located at ftp.gmd.de.^^\
+For those more experienced players, if you're looking \
+for on-line clues, etc., sadly, you won't find them \
+(the Z5 code is getting rather obscenely large as I \
+write this). A short verb list is contained in the \
+README file that you should have received with this \
+game (or should be able to find at the same place you \
+found this game). Beyond that, if you're truly \
+desperate, you can post a note on the rec.arts.int-fiction \
+usenet newsgroup, or send me email.^^\
+Thanks for playing! ^^\
+-- D. S. Yu [dsyu@@64holonet.net]";
+];
+
+Include "Grammar"; ! (Include grammar _after_ action defs, if we replace any)
+
+! **** Extensions
+!Extend "turn" first
+! * noun "to" number -> SpecialDial;
+Extend "examine" first
+ * scope=ReadableSpell -> Examine;
+
+
+
+! **** Action defs
+
+Verb "diagnose" "health" "status"
+ * -> Diagnose;
+
+Verb "spells" "memory" "chants"
+ * -> Spells;
+Verb "learn" "memorise" "memorize" "prepare"
+ * scope=ReadableSpell -> Learn;
+Verb "c,cast"
+ * -> CastOne
+ * noun -> CastOne;
+Verb "cast" "chant"
+ * is_spell -> Cast
+ * is_spell "at" noun -> Cast
+ * is_spell "on" noun -> Cast;
+Verb "yell" "scream" "bellow"
+ * -> Yell;
+Verb "sneeze" "cough"
+ * -> Sneeze;
+Verb "yawn"
+ * -> Yawn;
+Verb "laugh" "chuckle"
+ * -> Laugh;
+Verb "play"
+ * held -> Blow;
+Verb "clip" "trim"
+ * noun -> Cut;
+! Verb "lift" "raise"
+! * noun -> Lift;
+Verb "shake" "yank"
+ * noun -> Shake;
+Verb "fold"
+ * noun -> Fold;
+Verb "mix" "stir"
+ * noun -> Mix;
+Verb "join" "connect"
+ * noun "to" noun -> Join
+ * noun "with" noun -> Join;
+Verb meta "help" "hint"
+ * -> Help;
+
+! ** (nonsense verbs below, can be removed without affecting game)
+Verb "xyzzy" "plugh" "treasure" "plover" "yoho"
+ * -> Xyzzy;
+Verb "beg"
+ * -> Beg;
+Verb "meditate"
+ * -> Meditate;
+
+end;
+! fin.
+