! *****************************************************************
! 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, see .
!
! 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;
Serial "190819";
! ** 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: ; ".";
],
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 (k0)
{ 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 (k3) print " yet another time.";
if (self.number <= self.capacity) { new_line; rtrue; }
i=youngest(self); ;
"^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.";
}
; 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:ii)~=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:ii)~=0:i++)
{ j=p-->i; ;
}
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 ~"; ; "~.";
],
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:kk~=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; ; ]; ! 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.)^";
;
];
global the_spell_was = gnusto_spell;
[ CastOneSub; ; ];
! 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;
! <>;
! 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; ;
! 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 [; <>;],
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."; !
],
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) <>;
else <>;
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: <>;
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: <>;
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) <>;
],
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:
<>;
],
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;
;
;
move prayer_book to player;
location=MON_Chapel1;
! (FOR TESTING ONLY)
!move amulet to player;
!;
!;
!;
!;
!;
!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;
!;
!;
!;
!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 ) <>;
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);
; 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.