Rename game files to lowercase
[spiritwrak.git] / src / spirit.inf
diff --git a/src/spirit.inf b/src/spirit.inf
new file mode 100644 (file)
index 0000000..a458e6d
--- /dev/null
@@ -0,0 +1,3075 @@
+! *****************************************************************
+! 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.
+