! *************************************************************
! BORPHEE.INF -- add-on for SPIRITWRAK
!
! SPIRITWRAK 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.
!
! SPIRITWRAK 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 SPIRITWRAK. If not, see .
! *************************************************************
! (Single global variable to store progress of 'Trophy room puzzle'
global trophy_stage = 0; ! equals 'stage' completed, up to 4(th)
Object BORPHEE_GUSStop "Downtown New Borphee"
with description "You're right in the middle of downtown \
New Borphee -- perhaps the busiest, most crowded \
city you've ever seen. Huge brand-new buildings \
and throngs of fast-moving people make the whole \
scene somewhat surreal. The streets head north to \
a business district, while a set of stairs here leads \
down.",
name "buildings" "throngs" "crowd" "people" "streets" "district"
"stairs",
n_to BORPHEE_BD,
d_to BORPHEE_GUSStation,
cant_go "You walk around downtown a bit, are appalled by the \
sights, and hastily return here.",
! w_to "You walk around downtown a bit, are disturbed by the \
! sights, and hastily return here.",
has light;
Object BORPHEE_BD "Business District"
with description "You're in a crowded business district filled \
with busy people. The city thins out a bit to the north, \
while city streets head west and south. Directly to the east is a \
building so tall it makes you dizzy just looking at it.",
name "building" "crowd" "streets" "people",
s_to BORPHEE_GUSStop,
n_to BORPHEE_burbs,
w_to BORPHEE_CS,
e_to Skyscraper,
each_turn [;
if (self hasnt general) {
give self general;
move flour_scroll to BORPHEE_BD;
"^A number of people rudely brush past you and \
accidentally knock you down. A kindly old lady helps you \
to your feet. ~I think you dropped that,~ she says, pointing \
to a paper object nearby that doesn't seem familiar. She \
walks off, and is soon lost in the crowd.";
}
],
has light;
Object BORPHEE_CS "City Streets"
with description "You're on some busy side street in New Borphee. \
There's a crowded walk back east. To the north is the \
entrance to some sort of open area, with a large open arch.",
name "street" "walk" "area",
e_to BORPHEE_BD,
n_to GUE_Gate,
has light;
Nearby fake_arch "arch"
with name "open" "arch",
description "A large metal and stone arch. You'll have \
to get closer to see anything more.",
has scenery;
Object Skyscraper "Inside Skyscraper"
with description "You're inside a gigantic \
skyscraper. The marble and brass fixtures and trim \
exude professionalism. There's a small open chamber \
to the north. City streets are to the west.",
name "marble" "brass" "fixtures" "trim" "skyscraper"
"streets" "chamber",
w_to BORPHEE_BD,
e_to "You can't go that way.", ! but later...
n_to Elevator,
before [;
Go:
if (noun == n_obj)
print "As you enter the small chamber, metal \
doors suddenly spring forward and close \
behind you!^";
],
has light;
Object ss_sign "sign" Skyscraper
with initial "There is a large sign posted near the small chamber.",
name "sign",
description [;
print "The sign reads:^^\
~ELEVATOR UNDER CONSTRUCTION^PLEASE USE STAIRS.";
if ((self hasnt general) && (magic_door notin Skyscraper)) {
give self general;
"~^^Oddly, there don't seem to be any stairs.";
}
else "~";
],
has static;
Object Elevator "Inside Elevator"
with description "You are inside a cramped metal room, with \
featureless walls. There are no obvious exits.",
s_to "The doors seem to be closed tight.",
each_turn [;
if (random(20) == 1) {
print "^Suddenly, the doors spring open! You \
dive out.";
PlayerTo(SkyScraper);
rtrue;
}
],
;
Object elevator_sign "sign" Elevator
with name "sign",
initial "There's a small paper sign attached to a wall.",
description "~Shep:^^Put the elevator buttons _here_.^^-T~",
has static;
! (Not real doors, of course)
!Object elevator_doors "doors" Elevator
! with name "doors" "door",
! description "Solid-looking metal sliding doors.",
! before [;
! Push, Pull, Open:
! "Try as you might, the doors are shut fast.";
! Close:
! "They appear to already be closed.";
! ],
! has scenery;
Object BORPHEE_burbs "Suburbs"
with description "A suburb starts here, in contrast to the start \
of a big downtown to the south. For a residential area, \
it's surprisingly crowded. A main street runs \
north-south here.",
name "suburb" "downtown" "street",
n_to BORPHEE_Outskirts,
s_to BORPHEE_BD,
has light;
Object BORPHEE_Outskirts "Outskirts"
with description "New Borphee stops here, although it probably \
won't for long. A rough trail leads off into some \
woods to the northwest, or you can enter the city to \
the south.",
name "trail" "woods" "city",
s_to BORPHEE_burbs,
nw_to BORPHEE_forest,
ne_to "Accardi-By-The-Sea is closed to visitors these days.",
has light;
Object BORPHEE_forest "Forest"
with description "Deep forest surrounds you. A rough trail runs \
north and southeast.",
name "forest" "trail",
se_to BORPHEE_Outskirts,
n_to Over_river,
has light;
Object Over_river "Over River"
with description "You're on a nice new bridge crossing some \
large river below. Trails lead north and south into \
woods.",
name "bridge" "trails" "woods",
n_to Forest_trail,
s_to BORPHEE_forest,
before [;
Jump: "Bridge-jumping carries a stiff fine around here.";
],
has light;
Object c5 "coin" Over_river class coin_class;
Object Phee_river "river" Over_river
with name "river" "Phee",
description "Just a large east-west river.",
before [;
Receive:
remove noun;
print "You drop "; DefArt(noun); " into the river and \
watch it disappear.";
Search, LetGo, Rub, Take, Push, Pull, Touch, Squeeze, Turn, Shake:
"The river is far below the bridge.";
],
has scenery container;
Object Forest_trail "Forest Trail"
with description "A beaten trail cuts through some very dense \
forest running north and south.",
name "trail" "forest",
s_to Over_river,
n_to Ravine_pass,
has light;
Object Ravine_pass "Ravine Pass"
with description "A forest ravine opens into some sort of clearing \
to the north here, or a trail heads south.",
name "ravine" "forest" "clearing" "trail",
s_to Forest_trail,
n_to [;
if (army in self)
"The group of soldiers won't let you pass.";
else return Forest_clearing;
],
has light;
Nearby army "group of soldiers"
with name "group" "soldiers" "army",
description "A group of well-armed soldiers, who look a little \
haggard.",
life [;
Attack: "Forget it.";
default: "The soldiers are a little too weary to pay you any \
direct attention at the moment.";
],
has animate;
! (A rather mangled version of the Byzantine Generals Problem)
! (actually, completely different -- i.e., the BGP is unsolvable
! with three armies...)
Object wicker_cage "wicker cage" Ravine_pass
with name "cage" "wicker",
description "A wicker cage, with two compartments, and a lever \
attached to the front.",
capacity 3,
size 20,
before [;
Open:
"You can't seem to pry open the cage door by hand.";
],
add_to_scope cage_lever,
has static container transparent;
Object cage_lever "lever"
with name "lever",
description "A wooden lever attached to the cage.",
before [;
Pull:
if (Morgan in Delbins)
"A soldier slaps your hand away. ~That windcat \
messenger box belongs to our Captain, \
Morgan Grueslayer, so don't mess with it!~";
if (Morgan notin Ravine_pass)
"You pull the lever and watch the cage door \
momentarily open, then shut.";
if ((children(E_windcat) == 0) || (children(W_windcat) == 0))
"Morgan stops you and points at the windcats. ~An \
instruction must be sent with both of the cats, using the signal flags!~";
print "Morgan stops your hand, just as you are about to \
pull the lever. She looks at the cats. \
~Are you quite sure, Priest?~^^\
Now, that seems like a reasonable question. So, are you? ";
if (YesOrNo() == 0) "You pause, to reconsider.";
else {
remove E_windcat;
remove W_windcat;
remove army;
remove Morgan;
print "You nod and yank the lever. The cage door \
latch is loosened enough for both windcats to break free! The \
spotted windcat tears off to the west, and the speckled cat \
zips off to the east!^^There is a somewhat stressful pause.^^";
! simply put, the flags must both be red
if (((rf1 in E_windcat) && (rf2 in W_windcat)) ||
((rf2 in E_windcat) && (rf1 in W_windcat))) {
Achieved(13);
"Simultaneously, from the east and west, a three horn signal sounds! \
Morgan smiles triumphantly. ~A truce has been declared! The \
war has ended!~ The army soldiers yell a round of ~Three cheers!~ \
before heading off. Morgan shakes your hand \
with almost enough force to break it. ~Well done indeed, Priest. \
Your wisdom only compliments your tranquil nature.~ She walks off, \
seeking the next challenge.";
}
else {
move battle to Forest_clearing;
"Suddenly, from somewhere, a single horn note sounds! The sounds \
of a fight to the north are soon heard. Morgan \
gives you a sad, tired look. ~Perhaps it was meant to be,~ she \
says, as she and the army quickly march north to join their \
comrades.";
}
}
],
has static;
Object rf1 "red flag" Ravine_pass
class flag_class,
with name "red",
plural "red flags",
description "A red square of cloth.";
Object rf2 "red flag" Ravine_pass
class flag_class,
with name "red",
plural "red flags",
description "A red square of cloth.";
Object bf1 "blue flag" Ravine_pass
class flag_class,
with name "blue",
plural "blue flags",
description "A blue square of cloth.";
Object bf2 "blue flag" Ravine_pass
class flag_class,
with name "blue",
plural "blue flags",
description "A blue square of cloth.";
Object E_windcat "speckled windcat" wicker_cage
with name "windcat" "cat" "speckled",
description "A sleek, speckled salt-and-pepper windcat, with \
large paws.",
capacity 1,
before [;
Take:
"The windcat hisses and struggles until you desist.";
Receive:
if (noun hasnt is_flag)
"I don't think the windcat would appreciate that.";
Push, Pull, Attack, Squeeze, Turn:
"I don't think the windcat would appreciate that.";
Rub, Touch: "The windcat purrs.";
],
has supporter;
Object W_windcat "spotted windcat" wicker_cage
with name "windcat" "cat" "spotted",
description "A sleek, spotted black-and-white windcat, with \
large paws.",
capacity 1,
before [;
Take:
"The windcat hisses and struggles until you desist.";
Receive:
if (noun hasnt is_flag)
"I don't think the windcat would appreciate that.";
Push, Pull, Attack, Squeeze, Turn:
"I don't think the windcat would appreciate that.";
Rub, Touch: "The windcat purrs.";
],
has supporter;
Object Forest_clearing "Forest Clearing"
with description "A open clearing is surrounded by forest trees here. \
A ravine pass is to the south, and a short trail heads northwest. \
You can just see a small cave opening to the northeast.",
name "clearing" "forest" "trees" "ravine" "pass" "trail" "cave",
s_to Ravine_pass,
nw_to [;
if (battle in self)
"You're not getting past that bloody battle (intact).";
else return Forest_brambles;
],
ne_to [;
if (battle in self)
"You're not getting past that bloody battle (intact).";
else return Forest_cave;
],
has light;
Object battle "bloody battle"
with name "battle" "war" "warriors",
initial "There's a violent battle taking place in the middle \
of the field.",
description "It's a fierce battle. Kobolds and soldiers are locked \
in mortal combat. Getting too close would be certain death.",
life [;
Attack:
deadflag = 1;
"You give a yell and plunge into the battle, and get \
skewered by a kobold arrow moments later.";
default: "At the moment, everyone seems rather occupied.";
],
has animate;
Object Forest_brambles "Forest Brambles"
with description "There's a small area of forest surrounded by \
brambles and shrubs here. A trail leads southeast.",
name "forest" "brambles" "shrubs" "trail",
se_to Forest_clearing,
has light;
Object Forest_cave "In front of cave"
with description "A small cave mouth enters into darkness to the \
north here. A clearing lies to the southwest.",
name "cave" "mouth" "darkness" "clearing",
sw_to Forest_clearing,
n_to CAVE_NSTUNNEL,
has light;
Object CAVE_NSTUNNEL "North-South Tunnel"
with description "You're in a natural cave tunnel running north and \
south. To the south you can see a glimmer of daylight.",
name "glimmer" "daylight" "tunnel",
s_to Forest_cave,
n_to CAVE_INTER,
;
Object CAVE_INTER "Tunnel Intersection"
with description "Several natural cave tunnels intersect here, \
running north, south, and east.",
name "tunnel" "tunnels",
s_to CAVE_NSTUNNEL,
n_to CAVE_CURVE,
e_to CAVE_NCREVASSE,
;
!Object CAVE_BARE "Bare Cavern",
! with description "A bare cavern. The exit is east.",
! e_to CAVE_INTER,
! ;
Object CAVE_CURVE "Twisting Tunnel",
with description "A natural cave tunnel makes short twists and \
turns here, running south and east.",
name "tunnel" "twists" "turns",
s_to CAVE_INTER,
e_to CAVE_DAMP,
;
Object CAVE_DAMP "Damp Cave"
with description "You're in a small cave with noticeably damp walls. \
Exits lie to the west and south.",
name "cave" "damp",
w_to CAVE_CURVE,
s_to CAVE_NCREVASSE,
;
Object CAVE_NCREVASSE "Sloping Tunnel"
with description "You're in a windy tunnel that gradually slopes up to the \
east, or down to the west. A cold breeze blows from a tunnel to the north.",
name "tunnel" "breeze",
w_to CAVE_INTER,
n_to CAVE_DAMP,
e_to CAVE_WINDY,
d_to CAVE_INTER,
u_to CAVE_WINDY,
;
Object CAVE_WINDY "Windy Tunnel"
with description "A strange wind seems to howl through this \
winding tunnel heading east and west. A crack in the tunnel \
wall exposes an exit north.",
name "wind" "tunnel" "crack",
w_to CAVE_NCREVASSE,
e_to CAVE_BARE2,
n_to Ancient_Tunnel,
before [;
Listen: "A light wind howls through this tunnel.";
],
;
Object CAVE_BARE2 "Bare Cavern",
with description "A bare cavern. The exit is west.",
w_to CAVE_WINDY,
;
! (torn -- planes are reachable)
Object p4 "torn parchment" CAVE_BARE2
class parchment_class,
with name "torn",
description "~...places no mortal man should go, \
There are planes of existence far beyond our own, that \
connect and interlace, so that even mortal man may \
tread upon the featureless gray of . But, \
I believe that there may be other planes, perhaps \
where the Implementors are said to live. Are these \
places just parts of existing planes or planes unto \
themselves? I do not...~";
Object Ancient_Tunnel "Ancient Hallway"
with description "You're in a stone hallway, clearly man-made. \
The dust and musty smell indicate the place hasn't \
been used in quite some time. The corridor runs north, while the \
south wall has a large crack, creating a dark opening.",
name "dust" "hallway" "crack" "opening",
s_to CAVE_WINDY,
n_to End_of_hall,
before [;
Smell: "The air smells a bit musty and stale.";
],
;
Object End_of_hall "End of Hallway"
with description "You're at the north end of a long stone hallway. \
You can follow the hallway back south, or you can take a set of \
cracked stone stairs up.",
name "hallway" "stairs",
s_to Ancient_Tunnel,
u_to Domed_chamber,
;
Object Domed_chamber "Domed Chamber"
with description [;
print "You are in a large man-made underground chamber, with a \
perfectly domed high ceiling. Smooth stone archways lead to rooms to the \
north, south, east and west. Stone cut steps lead down. In the very \
center of the ceiling you notice a strange circular depression in \
the stone";
if ((self hasnt general) && (amulet has worn)) {
give self general;
".^^Your amulet suddenly gives off a flash of purple light, then fades!";
}
else ".";
],
name "dome" "archways" "steps" "ceiling",
d_to End_of_hall,
n_to TROPHY_N,
e_to TROPHY_E,
s_to TROPHY_S,
w_to TROPHY_W,
u_to "The ceiling is too far above you.";
Nearby fake_depression "depression"
with name "depression" "circle" "hole",
description "It looks like a slightly recessed circular depression \
in the ceiling. It's hard to tell from here if it was something cut out of \
the stone, or perhaps it's a separate piece.",
has scenery;
! (Player can only get here in end game, and probably doesn't want to be here either)
Object TROPHY_SECRET "Secret Trophy Room"
with description "You're in a small domed stone room. The only exit, \
unfortunately, is a hole in the stone floor to a floor of another chamber \
far below. Engraved in the wall is: ~LORD DUNCANTHRAX'S PRIVATE TROPHY \
ROOM~.",
number 0,
name "hole",
each_turn [;
if (TROPHY_SECRET.number == 0) {
TROPHY_SECRET.number = 1;
TROPHY_SECRET.description = "You're in a small domed stone room. \
There appear to be no exits -- the hole in the floor appears to have been \
sealed with stone. Engraved in \
the wall is: ~LORD DUNCANTHRAX'S PRIVATE TROPHY ROOM~.";
give self ~light ~visited;
"^Lord Duncanthrax and some of his soldiers are here.^^\
Duncanthrax looks up and sees you. ~Who is that?~ he asks. ~Looks like a \
priest,~ a soldier says. ~Wonderful. First, the black paint, and now, \
a priest breaks into my trophy room.~ He sighs. ~Will no one rid me of \
this meddlesome priest?~ One of the soldiers takes the hint and knocks \
you out cold.^^You awake a short time later.";
}
else {
deadflag = 1;
"^You soon run out of air in the sealed stone room.";
}
],
has light;
Object TROPHY_N "North Trophy Room"
with description "This is a bare cubical stone chamber. Some worn black \
lettering on the wall reads: ~THE EAST CHAMBER IS NOT THE FIRST TROPHY \
ROOM~. An archway exits south.",
name "archway" "stone",
s_to Domed_chamber,
;
Object TROPHY_E "East Trophy Room"
with description "This is a bare cubical stone chamber. Some worn black \
lettering on the wall reads: ~THE NORTH CHAMBER HAS SILVER LETTERING~. \
An archway exits west.",
name "archway" "stone",
w_to Domed_chamber,
;
! sigh: logic bug in rel 1. Try the following stmt below instead. Note
! that two solutions are possible in this case...
! on the wall reads: ~THE NORTH CHAMBER HAS GOLD LETTERING AND THE SOUTH \
! CHAMBER IS THE SECOND TROPHY ROOM~. \
Object TROPHY_S "South Trophy Room"
with description "This is a bare cubical stone chamber. Some worn black \
lettering on the wall reads: ~THE EAST CHAMBER HAS SILVER LETTERING AND \
I HAVE GOLD LETTERING~. An archway exits north.",
name "archway" "stone",
n_to Domed_chamber,
;
Object TROPHY_W "West Trophy Room"
with description "This is a bare cubical stone chamber. Some worn black \
lettering on the wall reads: ~EITHER I AM THE SECOND TROPHY ROOM AND THE \
NORTH CHAMBER IS THE LAST TROPHY ROOM, OR I HAVE GOLD LETTERING~. \
An archway exits east.",
name "archway" "stone",
e_to Domed_chamber,
;
Object lettering "lettering"
with name "lettering" "black" "writing",
description [; ; ],
found_in TROPHY_N TROPHY_E TROPHY_S TROPHY_W,
has scenery;
! (Now, the special key depressions
! AUTHOR NOTE: Originally, I represented all 4 by one object. I
! switched to four identical but separate objects to simplify the
! ease of have the trophy still sitting in the given depression
! (potentially increasing the likelihood that the player might
! drop the trophy in more than once, thereby fouling the puzzle)
Object Nkey_depression "circular depression" TROPHY_N
class trophy_dep_class,
with before [;
Receive:
if (noun ~= trophy)
"That doesn't quite fit.";
else {
if (trophy_stage == 3) {
! got it --- drop rod if in chamber
trophy_stage = 0; ! could get 'reset'
print "You hear a click";
move trophy to self;
if (white_rod_piece in TROPHY_SECRET) {
Achieved(14);
move white_rod_piece to Domed_chamber;
move air_spirit to Domed_chamber;
Domed_chamber.description = "You are in a large man-made underground chamber, with a \
perfectly domed high ceiling. Smooth stone archways lead to rooms to the \
north, south, east and west. Stone cut steps lead down. In the very \
center of the ceiling you notice a circular hole.";
fake_depression.description = "It's a small circular hole shrouded in darkness.";
", followed by a dull thump \
from the south.";
}
else ".";
}
else {
trophy_stage = 0; ! reset
move trophy to self;
"You hear a click.";
}
}
],
;
Object Ekey_depression "circular depression" TROPHY_E
class trophy_dep_class,
with before [;
Receive:
if (noun ~= trophy)
"That doesn't quite fit.";
else {
move trophy to self;
if (trophy_stage == 0) trophy_stage = 1;
else trophy_stage = 0; ! reset
"You hear a click.";
}
],
;
Object Skey_depression "circular depression" TROPHY_S
class trophy_dep_class,
with before [;
Receive:
if (noun ~= trophy)
"That doesn't quite fit.";
else {
move trophy to self;
if (trophy_stage == 2) trophy_stage = 3;
else trophy_stage = 0; ! reset
"You hear a click.";
}
],
;
Object Wkey_depression "circular depression" TROPHY_W
class trophy_dep_class,
with before [;
Receive:
if (noun ~= trophy)
"That doesn't quite fit.";
else {
move trophy to self;
if (trophy_stage == 1) trophy_stage = 2;
else trophy_stage = 0; ! reset
"You hear a click.";
}
],
;
! (GUE Tech -- with new curriculum...)
Object GUE_Gate "GUE Entrance"
with description "You're standing under an open archway that has \
the letters ~GUE TECH~ prominently displayed in \
twisted brass and copper. A busy street lies to the \
south, and the campus quad opens up to the north.",
name "letters" "street" "quad",
s_to BORPHEE_CS,
n_to GUE_QuadS,
has light;
Nearby GUE_arch "archway"
with name "arch" "archway",
description "It's an elaborate metal and stone affair that \
probably cost a fortune. On one side, an inscription reads \
~Forburn Gate~.",
has scenery;
Object GUE_QuadS "South Quad"
with description "You're walking across a grassy field. More \
lawn lies to the north, while an archway exits the area to the \
south. To the west is a low stone building with the word \
~GYMNASIUM~ etched in stone across the entrance. To the east \
is a old brick building covered in ivy.",
name "grass" "field" "lawn" "archway" "building"
"ivy",
s_to GUE_Gate,
n_to GUE_Quad,
w_to GUE_Gym,
e_to GUE_Hum,
has light;
Object GUE_Quad "Center of Quad"
with description "The center of the campus is a nicely tended \
green lawn with a bronze statue in the center. \
Paths lead north and south across grassy fields. \
To the west is a small brick building. To the east \
is a large stone building with a lintel roof and the \
words ~WOOMAX LIBRARY~ enscribed across the entrance.",
name "lawn" "grass" "fields" "building" "lintel",
s_to GUE_QuadS,
n_to GUE_QuadN,
w_to GUE_Cafe,
e_to GUE_Library,
each_turn [ i ;
i = random(20);
if (i==8 or 17)
"^Some students walk by. They must be upperclassmen, \
as they don't even look in your direction.";
if (i==9 or 14)
"^Some students walk by. They must be underclassmen, \
as some of them look at you with puzzled expressions.";
],
has light;
Nearby belboz_statue "statue"
with name "statue" "bronze",
description "An old bronze statue of a wise-looking \
man in wizard's clothes with a stern, disapproving look. An inscription \
at the base reads ~BELBOZ AT MITHICUS~.",
has scenery;
Object GUE_QuadN "North Quad"
with description "You're walking across a grassy field. More \
lawn lies to the south, while a large building that resembles a \
auditorium of some sort is north. An inscription near the entrance \
reads ~ENCHANTER HALL~. To the west you see a small house-like \
building. To the east you see a low stone building, clearly new \
and rather modern looking in contrast to its surroundings.",
name "grass" "field" "lawn" "building" "auditorium",
s_to GUE_Quad,
n_to GUE_Enchanter_hall,
w_to GUE_Dorms,
e_to GUE_Labs,
has light;
Object GUE_Gym "Gymnasium"
with description "There's a large field house here, filled with \
gym equipment and helpful rubber mats. The exit is east.",
e_to GUE_QuadS,
before [;
Jump: "You do a bit of exercise.";
],
has light;
Nearby gym_stuff "equipment"
with description "Various things useful to those who exercise.",
name "equipment" "mats",
before [;
Pull, Push: "You do a bit of exercise.";
],
has scenery;
Object dorm_key "flat key" GUE_Gym
with name "key" "flat" "dorm",
initial "Someone left a key here.",
description "A flat metal key with ~102~ marked on one side.",
!weight 5,
size 5,
;
Object GUE_Hum "Humanities Building"
with description "You're in the humanities building, which is \
vacant and closed for the summer. The exit is west.",
w_to GUE_QuadS,
has light;
Object History_book "history book" GUE_Hum
with name "book" "history",
initial "Someone left a history book here.",
description "It's a biography on the life and times of \
Duncanthrax the Bellicose. Most of it chronicles fairly \
dry stuff about his much publicized conquests of the \
Eastlands and his famous battles. There is an interesting \
bit about some secret trophy chamber that Duncanthrax \
had constructed near the end of his reign, but for more \
details, I'd suggest ~look up (word) in book~ specifically.",
before
[ w1; Consult:
if (consult_words > 1)
"The index is rather terse, try limiting your lookup \
to one word.";
wn = consult_from; w1 = NextWord();
switch (w1) {
'trophy', 'secret':
"Apparently, in 680 GUE, Duncanthrax grew increasingly \
withdrawn. At this time, of foremost importance to him was his collection of \
various battle trophys and awards he had bestowed to \
himself (for unusual valor on the field of battle) \
over the years. He decided to construct a hidden \
underground chamber south of Egreth to sequester this \
collection, which would be locked in a most clever means. \
He decided to order the construction of \
a ~four-room key~ which, when a miniature trophy \
was inserted and removed (once) in a special keyhole in each \
of the four rooms (in a specific order), would unlock a holding chamber \
in a center room containing his prized trophies. \
Priding himself on his logic skills, he requested that \
two captured foreigners produce a logic puzzle plainly \
inscribed in the four key rooms themselves that would \
detail the exact order that the key rooms were to be \
~applied~. A Prevaricon, \
who could not help but write untruths, was given a can of \
gold paint, while a Veritassi, who could only write the \
truth, was given a can of silver paint. Imagine \
Duncanthrax's rage when he discovered that the two \
prisoners had secretly painted over their gold and \
silver key phrases with _black_ paint! \
The prisoners were \
summarily executed, of course, but Duncanthrax sealed \
off the chamber and researchers can only guess at \
the final fate of the trophy collection of Duncanthrax.";
'Zilbo':
"Zilbo the third was overthrown in the great revolt lead \
by Duncanthrax in 659 GUE. The biographers suggest \
reading their companion text ~How Zilbo Came to Mithicus~.";
'Griffspotter', 'Antharia':
"In 665 GUE, Duncanthrax humiliated the Antharian naval \
Armada in the famous battle at Fort Griffspotter. \
(Well, okay, there's quite a bit more in the book about \
this battle, but remember, you're a priest, not a \
navy sailor.)";
'Diablo', 'Massacre':
"In 666 GUE, Duncanthrax invaded Zorbel Pass in the \
Eastlands and severely trounced a local militia of \
trolls armed with clubs and garlic. The key \
significance of this victory on Duncanthrax's \
conquest of the Eastlands, as well as the immediate \
recall of all vampiric soldiers in Duncanthrax's \
military force, cannot be understated.";
'Ogre', 'battle', 'duel':
"In late 666 GUE, Duncanthrax was engaged in a fierce \
battle with forces near Globby Hills. In a brilliant \
tactical move, Duncanthrax goaded the opposing force \
into decided the fate of the battle on a single duel -- \
himself versus their champion. Unfortunately for \
Duncanthrax, the Globby Hill champion turned out to \
be an Ogre of immense size. In an attempted diversion, \
Duncanthrax was quoted as saying to the Ogre, \
~It's all right, we're with Silvermane.~ The Ogre \
was quoted as responding with ~Huh?~. Duncanthrax then, \
perhaps in a moment of sheer bravado, was heard to \
say ~Your shoes are untied.~ As the Ogre bent down \
to examine his unshod feet, Duncanthrax gave the \
signal, and the Ogre was buried under a massive \
pile of granola.";
'Silvermane':
"Silvermane, the book notes, was the name of \
Duncanthrax's pet Dire Wolf.";
'Index', 'index':
"There appear to be notable entries on ~trophy~, \
~Zilbo~, ~Griffspotter~, ~Diablo~, ~Ogre~, and \
~Silvermane~.";
default:
"You can't find anything interesting about that.";
}
],
!weight 20,
size 15,
;
Object GUE_Cafe "Cafeteria"
with description "A small cramped area with lots of tables and \
chairs and food stains. The exit is east.",
name "table" "tables" "chair" "chairs" "food" "stains",
e_to GUE_Quad,
has light;
Nearby cafe_mess "mess"
with name "mess" "cups" "napkins" "junk",
initial "Someone must've had a late night recently, as \
there is quite a mess of coffee cups, napkins, and other junk \
on one table.",
before [;
Search:
if (self hasnt general) {
give self general;
move sugar_cube to GUE_Cafe;
move decaf_coffee_can to GUE_Cafe;
"You dig through the mess and find an \
unopened can of coffee and a sugar-cube.";
}
Take:
"There's too much to carry.";
Rub, Push, Pull, Turn, Touch, Shake:
"You mess with the mess. Nothing happens.";
],
has static;
Object sugar_cube "sugar cube"
with name "sugar" "cube",
short_name "sugar cube",
description "A perfect featureless white cube (of sugar).",
!weight 5,
size 5,
has edible;
Object GUE_Library "Library"
with description "A student library is here, filled with \
various texts. The exit is west.",
w_to [ x y z ;
objectloop (x in player) {
if ((x == marked_scroll) && (librarian hasnt general))
"Some strange invisible force stops you as you try \
to leave. The librarian doesn't look up, but merely says, \
~If you want to check something out, I'll \
need to see some ID first.~";
! (now, instead of doing recursive tree traverse, I do two levels
! of checking, to save code space, since there aren't that many
! workable containers in this game)
if (children(x) > 0) {
objectloop (y in x) {
if ((y == marked_scroll) && (librarian hasnt general))
"Some strange invisible force stops you as you try \
to leave. The librarian doesn't look up, but merely says, \
~If you want to check something out, I'll \
need to see some ID first.~";
if (children(y) > 0) {
objectloop (z in y) {
if ((z == marked_scroll) && (librarian hasnt general))
"Some strange invisible force stops you as you try \
to leave. The librarian doesn't look up, but merely says, \
~If you want to check something out, I'll \
need to see some ID first.~";
}
}
}
}
}
return GUE_Quad;
! if ((marked_scroll notin GUE_Library) && (librarian hasnt general))
],
has light;
Object magazine_lib "wrinkled magazine" GUE_Library
with name "magazine" "wrinkled" "report",
initial "There's a wrinkled magazine (~US News and Dungeon Report~) here.",
description "SPIRITWRAK Author notes:^\
3/96 -- Initial (beta) release. Functionally complete, some \
nagging bugs and typos may still be present.^\
4/96 -- Second release. Reported bugs fixed. A few puzzles \
added, some removed.^\
6/96 -- Third release. Bug fix release.",
size 15;
Object GUE_Dorms "Dorms"
with description "You're in a short hallway inside some student \
dormitories. The exit is east.",
e_to GUE_QuadN,
n_to dorm_doorN,
s_to dorm_doorS,
w_to "You wander the halls a bit and return here.",
has light;
Object dorm_doorN "northern door" GUE_Dorms
with name "door" "northern",
when_closed "There's a closed door to the north.",
when_open "There's an open door to the north.",
description "A wooden door with a keylock. A note \
attached to it says ~DOING WORK ABROAD~.",
with_key dorm_key,
door_dir n_to,
door_to GUE_dormroom,
after [;
Open:
give dorm_doorN2 open;
Close:
give dorm_doorN2 ~open;
],
has static door openable lockable locked;
Object dorm_doorS "southern door" GUE_Dorms
with name "door" "southern",
when_closed "There's a closed door to the south.",
description "A wooden door with a keylock. A note \
attached to it says ~BEWARE OF DOG~.",
door_dir n_to,
door_to GUE_Dorms, ! doesn't really go anywhere
before [;
Open:
deadflag = 1;
"As you open the door, an enormous hellhound jumps \
out! The unusual watchdog creeps back into the room and closes the \
door -- after having mauled you to pieces, of course.";
],
has static door openable lockable;
Object GUE_ID1 "dirty ID card" GUE_Dorms
with name "ID" "card" "dirty",
description "A slightly dirty ID card. There's a picture \
of some woman with short dark hair and glasses, and the name \
~Stephanie~ on the front.",
size 5,
;
Object GUE_ID2 "clean ID card"
with name "ID" "card" "clean",
description "An ID card with a picture \
of some young student and the name \
~Harold~ written on the front.",
size 5,
;
Object GUE_dormroom "Dorm room"
with description "A cramped room, mostly empty, with some \
bare furnishings.",
name "furnishings" "desk" "chair" "bed",
s_to dorm_doorN2,
has light;
! (due to short name confusion ("northern door"), 2nd half
! of this door done separately)
Object dorm_doorN2 "door" GUE_dormroom
with name "door",
when_closed "There's a closed door to the south.",
when_open "There's an open door to the south.",
description "An unremarkable wooden door.",
! with_key dorm_key,
door_dir s_to,
door_to GUE_Dorms,
after [;
Open:
give dorm_doorN open ~locked;
Close:
give dorm_doorN ~open;
],
before [;
Lock:
"You can't lock the door from this side.";
Unlock:
"You can't unlock the door from this side.";
],
has static door openable lockable;
!Nearby dormroom_furnishings "furnishings"
! with name "furnishings" "desk" "chair" "bed",
! description "Minimal furnishings -- a desk and chair, \
!a small bed. Almost reminds you of the Monastery.",
! has scenery;
Object textbook "textbook" GUE_dormroom
with name "book" "textbook" "text",
initial "A forgotten textbook is lying in one corner of \
the room.",
description [;
if (self hasnt open)
"The cover reads ~Ancient Mythology~.";
else
"~A colorful myth among ancient races has been \
called 'The myth of the Four Brothers' by Elder Kroonwatz \
(the famous Royal Chronicler). The story states that at the dawn of time, four \
evil gods, who were brothers, sought dominance over that \
which would become our world. Great battles were fought \
between forces of light and darkness, and these \
brothers were often victorious. \
Fortunately for us, they \
could not cooperate with each other, and \
fought amongst themselves in petty power \
struggles, driven individually by power and greed.
Indeed, legends state that on occassions, the brothers \
would seek ways to actually destroy their own siblings, \
along with the forces of good. \
One brother constructed a strange artifact that would \
have given him great power, but was discovered by agents of good. \
He was imprisoned within the very object he built. The remaining \
three, facing certain defeat without the combined strength of their \
trapped brother, fled into planes unknown, but made a pact \
that if the brother were ever freed, and the artifact of \
power returned to him, the four would \
agree to make their final attack against the forces of good. \
Kroonwatz points out the obvious parallels with various other \
mythologies that foretell the end of the known world.~";
],
!weight 20,
size 15,
before [;
Open:
if (self hasnt general) {
give self general;
give self open;
move GUE_ID2 to parent(player);
"As you open the book, a small card flies out and lands \
at your feet.";
}
],
has openable;
Object GUE_Enchanter_hall "Enchanter Hall (top)"
with description "You're at the top of a large auditorium which \
is empty. You can walk down a long aisle to the \
front of the hall, or out to the south.",
name "aisle" "seats",
s_to GUE_QuadN,
d_to GUE_Enchanter_hall_front,
n_to GUE_Enchanter_hall_front,
has light;
Object GUE_Enchanter_hall_front "Enchanter Hall (bottom)"
with description [;
print "You're at the very front of a large \
auditorium. From here you can look south and sees rows upon \
rows of empty seats focused on the stage-like area where you now \
stand. You can walk back into the seats to the south";
if (hall_switch has on)
". A soft dim glow highlights your current area.";
else ".";
],
name "rows" "seats" "glow",
s_to GUE_Enchanter_hall,
u_to GUE_Enchanter_hall,
has light;
Nearby hall_switch "switch"
with name "switch",
initial "There's a curious switch in the wall here.",
description "A small switch in the far wall.",
before [;
SwitchOn:
if (self hasnt on) {
give self on;
print "You hear a click. A dim light now makes the \
nearby area less gloomy.^";
}
else "It seems to be on already.";
if (self hasnt general) {
give self general;
move notebook to hall_desk;
"^A student creeps out of the shadows. He looks \
at you sheepishly. ~Sorry I haven't been to class all semester, \
Professor,~ he begins. ~Anyway, here's my final paper.~ He puts \
a notebook on the desk. ~All this stuff about the new 'science' \
-- I don't know what all the fuss \
is about. Magic was okay too, wasn't it? There's a part in my \
conclusion where --~ He stops and looks at the notebook. ~Well, \
anyhow.~ he says, and disappears back into the shadows.";
}
else rtrue;
SwitchOff:
if (self has on) {
give self ~on;
"The dim light fades.";
}
else "It seems to be off already.";
],
has static switchable;
Object hall_desk "large desk" GUE_Enchanter_hall_front
with name "desk",
description "A long desk sits in the middle of this area.",
capacity 30,
has static supporter;
Object notebook "notebook"
with name "notebook",
capacity 3,
description "A plain white notebook with some loose pages.",
!weight 10,
size 10,
before [;
Receive:
if ((noun ~= term_paper) && (noun hasnt is_scroll))
"You can't put that into the notebook.";
],
has container openable;
Object term_paper "term paper" notebook
with name "paper" "term",
!weight 5,
size 10,
description "~Magic, so what's it good for?~ by \
Wilbur Lunchbox. It's a long-winded haphazard writing about \
the virtues of magic in a time of science. Some of the topic \
sentences are particularly clumsy. However, there's an insightful \
bit at the end about how under certain circumstances, magic and \
science become indistinguishable.",
;
Object GUE_Labs "Science Center"
with description "You are in a short hallway of some new \
building. The words ~SCIENCE CENTER~ are painted on one wall. \
The hallway opens to rooms to the east, or you can escape to the west.",
name "words",
w_to GUE_QuadN,
e_to GUE_Labs_Eng,
has light;
Object GUE_Labs_Eng "Engineering Labs"
with description "\
You shudder as you look around this area. \
Clearly a place of science, piles of heavy machinery and strange \
delicate-looking tools and artifacts are everywhere here. Hallways \
run west and east.",
name "machinery" "tools" "artifacts",
w_to GUE_Labs,
e_to GUE_Labs_Office,
s_to GUE_Lab_door,
has light;
Object wood_book "research paper" GUE_Labs_Eng
with name "paper" "research",
description "~On the Structural Strength of Woods~, \
a short, fairly dry research paper. Apparently, the researcher was testing \
the breaking point of various woods. The conclusions reached \
are summed up in the final paragraph:^^\
~In summary, our findings indicate that out of the materials \
tested, Ebony wood is clearly the best choice, and Balsa wood \
clearly the worst. Balsa wood structures broke immediately when \
even the slightest weight was tested on them. Pine wood structures \
fared slightly better, holding light weights, but tended to break \
on repeated stress. Ebony wood structures were approximately twice \
as strong as Pine structures, holding up to at least one repeated \
stress test before breaking.~",
!weight 5,
size 15;
Object GUE_Labs_Office "Office"
with description "You're in a small office of some sort. The \
only exit is west.",
w_to GUE_Labs_Eng,
has light;
Nearby Lab_desk "desk"
with name "desk",
initial "A small desk sits in one corner here.",
description "It's quite tiny really.",
has static supporter;
Object Lab_journal "lab journal" Lab_desk
with name "journal" "lab",
description "Some loose handwritten pages read:^\
^~...DAY 14) We've put the artifact in the south lab. Still \
^ no idea what it does, but I'm sure I can find \
^ some lab student who can figure it out. \
^ DAY 20) My lab assistant Peabody believes that it's \
^ some sort of 'mystical gate'. \
^ Clearly this is hogwash. However \
^ my grant has been awarded, so I have allowed \
^ Peabody to continue work. \
^ DAY 25) Peabody demonstrated something fantastic today. \
^ He took my briefcase and put it on \
^ the artifact and in a white flash, it was gone! \
^ DAY 27) This is my last entry. I am leaving the University \
^ tomorrow. Peabody, in my request to retrieve my briefcase \
^ stepped onto the artifact, and was gone! I've read \
^ his recent research notes, and if he's right, he's \
^ now lost in a place unimaginable! I've locked the \
^ artifact away and destroyed the combination -- I pray no \
^ one ever sees it again!...~\
^ (The journal breaks off here)",
!weight 15,
size 15,
;
Object GUE_Lab_door "lab door"
with name "door" "lab",
when_closed [;
print "There's a closed heavy metal door to the";
if (self in GUE_Labs_Eng)
" south.";
else " north.";
],
when_open [;
print "There's an open metal door to the";
if (self in GUE_Labs_Eng)
" south.";
else " north.";
],
description "A large door made of some shiny hard metal. \
There are no obvious handles or hinges.",
door_dir [;
if (self in GUE_Labs_Eng) return s_to;
else return n_to;
],
door_to [;
if (self in GUE_Labs_Eng) return GUE_Labs_SECRET;
else return GUE_Labs_Eng;
],
before [;
Close:
if (self has open) {
left_dial.number = random(9);
right_dial.number = random(9);
center_dial.number = random(9);
give self ~open locked;
"You close the door and hear some mechanisms spin.";
}
],
found_in GUE_Labs_Eng GUE_Labs_SECRET,
has static door openable lockable locked;
! (and now a combination lock, which is probably going to be more
! of an effort to code than for the player to figure out)
Object special_lock "set of dials" GUE_Labs_Eng
with name "dials",
initial "There's an odd set of dials in the wall near the \
metal door.",
description [;
print "Three dials are in a left-to-right row. Above \
each dial is a tiny square window with some number visible behind it. \
The windows currently read: ~",left_dial.number,center_dial.number, right_dial.number;
"~. Right next to the set of dials is a small green button. \
Letters right above the dials read: ~FrobozzCo~.";
],
has static transparent;
Class dial_class
with name "dial",
number 0,
description [;
print "A small dial. The window above reads ~", self.number;
"~.";
],
has static;
Object left_dial "left dial" special_lock
class dial_class
with name "left",
before [;
Turn:
left_dial.number = left_dial.number + 1;
if (left_dial.number > 9) left_dial.number = 0;
print "The left window now reads: ~", left_dial.number;
"~.";
SetTo:
if ((second < 0) || (second > 9))
"The left dial apparently only goes from 0 to 9.";
else left_dial.number = second;
print "The left window now reads: ~", left_dial.number;
"~.";
],
;
Object center_dial "center dial" special_lock
class dial_class
with name "center" "middle",
before [;
Turn:
center_dial.number = center_dial.number + 1;
if (center_dial.number > 9) center_dial.number = 0;
print "The center window now reads: ~", center_dial.number;
"~.";
SetTo:
if ((second < 0) || (second > 9))
"The center dial apparently only goes from 0 to 9.";
else center_dial.number = second;
print "The center window now reads: ~", center_dial.number;
"~.";
],
;
Object right_dial "right dial" special_lock
class dial_class
with name "right",
before [;
Turn:
right_dial.number = right_dial.number + 1;
if (right_dial.number > 9) right_dial.number = 0;
print "The right window now reads: ~", right_dial.number;
"~.";
SetTo:
if ((second < 0) || (second > 9))
"The right dial apparently only goes from 0 to 9.";
else right_dial.number = second;
print "The right window now reads: ~", right_dial.number;
"~.";
],
;
Object green_button "green button" special_lock
with name "button" "green",
number 0,
weight 0,
description "A small green button next to the dials.",
before [;
Push:
! a simple game of mastermind. NOTE: I hate mastermind...
if (GUE_Lab_door has open)
"You hear a short buzzing noise.";
if ((left_dial.number == 7) &&
(center_dial.number == 3) &&
(right_dial.number == 4)) {
give GUE_Lab_door ~locked open;
Achieved(15);
"You hear three clicks, and the door swings open!";
}
! observe the bizarre numerical method of tracking guesses...
! ('0' implies wrong)
! (As with regular mastermind, we first check for all
! 'right # and right spot' and build a bitstring that
! indicates this (i.e. 700 combo would give 100 bitstring).
! Then, we scan over the slots that were not marked as
! 'right # and right spot' to check for 'right #, wrong
! spot'. If, notably, we already found that number in
! the 1st scan, we do _not_ treat it as 'right #, wrong
! spot' (i.e. 777 should give us 1 click, not 1 click,
! 2 thunks).
! -- Author's note: There is no doubt a simpler method
! to do this, and you Inform junkies should feel free
! to let me know this, however I found this method to
! be easy to code, easy to understand, and pretty
! robust.
green_button.number = 0; ! RESET
green_button.weight = 0; ! (# of 'thunks')
! FIRST SCAN
if (left_dial.number == 7) green_button.number = 100;
if (center_dial.number == 3)
green_button.number = green_button.number + 10;
if (right_dial.number == 4)
green_button.number = green_button.number + 1;
! SECOND SCAN
if (green_button.number ~= 100 or 101 or 110) {
if (green_button.number ~= 11) {
if ((left_dial.number == 3) &&
(green_button.number ~= 10))
green_button.weight = green_button.weight + 1; ! 'add a thunk'
if ((left_dial.number == 4) &&
(green_button.number ~= 1))
green_button.weight = green_button.weight + 1; ! 'add a thunk'
}
}
if (green_button.number ~= 10 or 11 or 110) {
if (green_button.number ~= 101) {
if ((center_dial.number == 7) &&
(green_button.number ~= 100))
green_button.weight = green_button.weight + 1; ! 'add a thunk'
if ((center_dial.number == 4) &&
(green_button.number ~= 1))
green_button.weight = green_button.weight + 1; ! 'add a thunk'
}
}
if (green_button.number ~= 1 or 11 or 101) {
if (green_button.number ~= 110) {
if ((right_dial.number == 7) &&
(green_button.number ~= 100))
green_button.weight = green_button.weight + 1; ! 'add a thunk'
if ((right_dial.number == 3) &&
(green_button.number ~= 10))
green_button.weight = green_button.weight + 1; ! 'add a thunk'
}
}
! Print number of clicks and thunks
if (green_button.number == 0 && green_button.weight == 0)
"Nothing happens.";
if (green_button.number == 1 or 10 or 100) {
print "You hear a single click";
if (green_button.weight == 0) ".";
else print " followed by ";
}
else {
if (green_button.number == 11 or 101 or 110) {
print "You hear two clicks";
if (green_button.weight == 0) ".";
else print " followed by ";
}
else {
print "You hear ";
}
}
EnglishNumber(green_button.weight);
if (green_button.weight == 1)
" thunk.";
else " thunks.";
],
has static;
Object GUE_Labs_SECRET "Strange Lab"
with description "This is an odd room, cramped even by lab \
standards. The place seems to have been cleared out recently.",
n_to GUE_Lab_door,
has light;
! *************
! critters/people
! *************
Object librarian "librarian" GUE_Library
with name "librarian" "student" "Stephanie",
description "A young woman with short dark hair and \
gold-framed glasses.",
life [;
Attack, ThrowAt:
"Attacking librarians is not very becoming of \
a priest.";
Show, Give:
if (noun == glasses)
"~Thanks no, I already have a pair.~";
if (noun == GUE_ID1) {
remove GUE_ID1;
"The librarian snatches the ID out of your hand. \
~Where'd you get my ID?~ she says. ~I've been looking for it \
everywhere.~";
}
if (noun == GUE_ID2) {
print "The librarian peers at the ID. ~Hi ";
if (self has general)
"again, Harold,~ she says.";
else {
give self general;
"Harold,~ \
she says. ~I heard you were going to be away for a least two \
more years. Got tired of Mithicus, eh? Well, anyway, remember to \
return anything you borrow after summer session is over.~ She \
scribbles something down in a notebook.";
}
}
default: "The librarian is currently too busy \
cataloging books.";
],
react_before [;
Cast:
"The librarian frowns as you start to chant. \
~Quiet! This is a library, you know.~ she says.";
Blow:
if (noun==whistle)
"You make an unusually high-pitched noise. \
The librarian frowns. ~Please! This is a library, you know.~";
Yell:
"The librarian frowns. ~Please! This is a library, you know.~";
Sneeze:
"~You should see the school nurse about that cold.~";
],
has animate female;
Object kobold "large kobold" Forest_brambles
with name "kobold" "large",
initial "There appears to be a wounded kobold here, resting \
against a shrub.",
description "He's a pretty tough looking kobold. The large wound \
in his shoulder clearly has him in a foul mood.",
each_turn [;
if (random(20) == 1)
"^The kobold swipes at you with a club in his good arm, \
but due to his condition, doesn't come close.";
],
life [;
Attack,ThrowAt: "Attacking a defenseless wounded would be somewhat \
unsporting.";
default: "The kobold hisses at you and spits out some words that \
you can't understand at all.";
],
before [;
Cast:
if (the_spell_was == espnis_spell or foblub_spell)
"The kobold cannot understand your language. The \
chant fails.";
if (the_spell_was == taclor_spell) {
move green_sphere to Forest_brambles;
remove self;
"You begin your chant, and the kobold seems stricken with \
fear. Soon, however, the kobold stands up and looks at \
his healed shoulder with wonder. He starts to say something, \
realizes you don't speak kobold, and stops. Puzzled by \
your actions, he stares at you for a moment, then searchs \
his jerkin, finding a small object which he tosses at your \
feet. He walks off into the deep forest, and vanishes.";
}
],
has animate;
Object air_spirit "air spirit"
with name "spirit",
description "It looks like a small, animated tornado capable \
of taking you for quite a spin.",
each_turn [ i ;
! spirit attack
! (in general, the 4 spirits are _very_ dangerous.
! There's a 1/5 chance of killing outright, and 2
! chances of doing 10 and 5 points of damage respectively.
! In short, the player needs to realize it's time to swanko,
! and do so, quickly)
if (self hasnt general) {
give self general ~concealed;
"^You hear a strange intake of air from the hole above \
your head. Without warning, a small tornado seems to \
flow in from above. It seems to be sentient!";
}
i = random(5);
if (i == 1) {
deadflag = 1;
"^The air creature moves with amazing speed! \
It surrounds you in a mass of whirling winds, and you \
find yourself spinning helplessly. The speed increases, \
and you are soon torn apart!";
}
if (i == 2)
Player_HP_CUR = Player_HP_CUR - 10;
if (i==3)
Player_HP_CUR = Player_HP_CUR - 5;
if (Player_HP_CUR <= 0) {
deadflag = 1;
"^The last blow from the air spirit was too much for \
you, I'm afraid to say. You are picked up and \
tossed against the wall in a lifeless heap by a \
massive gust of wind.";
}
print "^The air spirit ";
if (i==2)
"picks you up in a powerful gust \
of wind and sends you flying across the chamber! Ouch.";
if (i==3)
"surrounds you with flying dust and \
debris, momentarily choking you! You break free \
just in time.";
"charges, but you evade the moving tornado.";
],
before [;
Cast:
if (the_spell_was == swanko_spell) {
remove self;
"As you speak the chant, the air spirit falls back \
in fear! You finish the chant, and the air spirit \
slowly dissipates and grows smaller, until the \
creature vanishes completely.";
}
print "A sharp gust of wind practically \
tears your chant out of your lungs.^";
],
life [ ;
Attack:
print "You ";
if (random(20) >= 8)
"strike the air creature, but your attack passes \
harmlessly through it! Strange laughter seems to \
echo from everywhere.";
"attack the air spirit, but miss!";
default: "It's too busy trying to kill you.";
],
has animate concealed;
! *************
! scrolls/spells
! *************
Object flour_scroll "flour-coated scroll"
class scroll_class,
with name "flour-coated",
;
Object gloth_spell "fold dough 83 times" flour_scroll
class spell_class,
with name "gloth",
magic [;
if (second has animate)
"Well, when you see a living creature made out of \
dough around here, let me know.";
"The chant fails. I suppose you probably need actual dough \
for it to work.";
],
;
Object marked_scroll "pen-marked scroll" GUE_Library
class scroll_class,
with name "pen-marked",
initial "There's a pen-marked scroll sitting amongst some books here.",
;
Object taclor_spell "heal wounds" marked_scroll
class spell_class,
with name "taclor",
magic [;
if (second == 0)
"The chant searches for a body to heal, and fails.";
if (second == player) {
Player_HP_CUR = Player_HP_MAX;
"You speak the chant, and feel a warm glow surround you. \
In moments, you feel physically renewed!";
}
if (second hasnt animate) {
print "It's apparently beyond your powers to \
heal "; DefArt(second); ".";
}
else {
CDefArt(second);
" is no doubt grateful for the gift of better health.";
}
],
;
! *************
! interesting objects
! *************
Object white_rod_piece "white rod piece" TROPHY_SECRET
class rod_class,
with name "white",
initial "In the center of the room is a short white rod.",
description "It's a short section of a rod made of some \
undeterminable hard substance, \
colored cloud-white. A piece of the Rod of the Ancients, no doubt!",
;
Object green_sphere "green sphere"
class sphere_class,
with name "green",
description "A tiny perfect green sphere, made of some strange \
unknown metal.",
;