mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2024-09-11 09:54:37 +00:00
1026 lines
44 KiB
INI
1026 lines
44 KiB
INI
!==============================================================================!
|
||
! RUINS - an Inform example game, with answers to the exercises.
|
||
!==============================================================================!
|
||
! The Inform Designer's Manual (16May97) includes various references to a
|
||
! sample game called "Ruins", which unfortunately is not supplied with the
|
||
! compiler. This file attempts to knit together several of the fragments from
|
||
! the DM into a small but complete game, intended primarily as an example for
|
||
! novices of a typical way to use Inform features, and as a starting point
|
||
! for experimentation.
|
||
!
|
||
! In order to keep the game manageably small, the following references from
|
||
! the DM have been omitted:
|
||
! parrot, low mist, chasm, pumice-stone ball, glyphs, dictionary,
|
||
! food rations, sodium lamp, cage.
|
||
! Other items have been changed as necessary for simplicity and consistency.
|
||
!
|
||
! Object definitions explicitly state the name of their parent object (if
|
||
! appropriate), rather than using the "->" construct.
|
||
!
|
||
! Once you've played the game and (hopefully) understood how it works, you
|
||
! are strongly encouraged to try modifying or extending it. For instance:
|
||
! - add the low mist in the Forest and Square_Chamber. In the DM it smells of
|
||
! broth, so perhaps you should provide a source for the smell (or just
|
||
! change the description)? [EASY]
|
||
! - implement the parrot, perhaps having it fly into the Forest once the plane
|
||
! has departed? [EASY]
|
||
! - extend the number of rooms. There's a suggestion that you could Down from
|
||
! the Shrine, or perhaps you could add a dark passage leading West from the
|
||
! Corridor? [EASY/MIDDLING]
|
||
! - if the passage is dark, perhaps a lamp would be useful? [EASY]
|
||
! - if you've got a lamp, the maze in the Web becomes much less daunting.
|
||
! So perhaps it's the lamp rather than the bangle which you find on your
|
||
! exit from the darkened Web? [EASY]
|
||
! - there are a couple of daemons in the example, but no timer. How about
|
||
! extending the Honeycomb so that if dropped it starts a timer object
|
||
! causing itself to melt unless picked up again pretty quickly? [EASY]
|
||
! - a routine called SmartCantGo prints a helpful message if you try to move
|
||
! in an illegal direction. The routine, not in the standard library, is
|
||
! commonly Included from a separate file. Download the file from:
|
||
! ftp://ftp.gmd.de/if-archive/infocom/compilers/inform6/library/contributions/
|
||
! [EASY]
|
||
! - the DM is a bit unclear about the role(!) of the pumice-stone ball, but
|
||
! it seems to need pushing into the chasm. Maybe it blocks the gap and
|
||
! allows you to cross to the other side (in order to reach the bangle)?
|
||
! Maybe there's more to moving it than just one push? [MIDDLING/TRICKY]
|
||
! - finally, many games accept an XYZZY command (in tribute to the magic word
|
||
! in the original Adventure). Implement such a verb which transports the
|
||
! player to At_End_of_Road for one turn, then restores the original
|
||
! location (you can copy the room description from Advent.inf). [MIDDLING]
|
||
!
|
||
! You can find another version of this game, without answers to these
|
||
! exercises, in the file Ruins.inf.
|
||
!
|
||
! Of course, it isn't worth spending too long on Ruins, since it's only a
|
||
! somewhat dull and well-visited example. As soon as you start to feel
|
||
! comfortable with the way that an Inform game is constructed...
|
||
!
|
||
! ...have a go at writing one of your own. Good luck!
|
||
|
||
!==============================================================================!
|
||
! Every game needs a Story and Headline, and must include Parser and VerbLib.
|
||
! As DM <20><>7 except: constants MANUAL_PRONOUNS and MAX_SCORE defined (the former
|
||
! is in the Library 6/7 Release Notes, not the DM). Also specified values for
|
||
! Release and Serial, but only to aid in identifying any variants in this file
|
||
! over time; normally, you'd omit these two lines and use Inform's defaults.
|
||
!
|
||
Constant Story "RUINS";
|
||
Constant Headline
|
||
"^An Interactive Worked Example^
|
||
Copyright (c) 1995 by Graham Nelson.^
|
||
Revisited 1998 by Roger Firth.^";
|
||
|
||
Release 4;
|
||
Serial "981127";
|
||
|
||
!!!!Constant MANUAL_PRONOUNS; ! <-- Causes compilation warning; ignore...
|
||
Constant MAX_SCORE 100;
|
||
|
||
Include "Parser";
|
||
Include "VerbLib";
|
||
!Include "SmartCantGo"; !!
|
||
|
||
!==============================================================================!
|
||
! Every game needs an Initialise routine, whose primary role is to set the
|
||
! player's location (i.e. you) at the start of the game.
|
||
! As DM <20><>7 and 19 except: StartDaemon() call added, no TitlePage().
|
||
!
|
||
[ Initialise;
|
||
location = Forest;
|
||
thedark.description =
|
||
"The darkness of ages presses in on you, and you feel claustrophobic.";
|
||
move Bangle to Rocky_Alcove; !!
|
||
StartDaemon(Packing_Case);
|
||
"^^^^^Days of searching, days of thirsty hacking through the briars of
|
||
the forest, but at last your patience was rewarded. A discovery!^";
|
||
];
|
||
|
||
!==============================================================================!
|
||
! As DM <20><>20. PrintRank, if defined, is called when printing the score.
|
||
!
|
||
[ PrintRank;
|
||
print ", earning you the rank of ";
|
||
switch (score) {
|
||
0 to 9: "humble rainforest Tourist.";
|
||
10 to 39: "Investigator.";
|
||
40 to 69: "Acquisitor.";
|
||
70 to 99: "Archaeologist.";
|
||
100: "Master Archaeologist.";
|
||
}
|
||
];
|
||
|
||
!==============================================================================!
|
||
! As DM <20><>11 except: daemon added, to bring the immovable crate at the start,
|
||
! and take it (and you) away at the end.
|
||
!
|
||
Object Packing_Case "packing case"
|
||
with name 'packing' 'case' 'crate' 'box' 'strongbox',
|
||
initial
|
||
"Your packing case rests here, ready for you to hold any important
|
||
cultural finds you might make, for shipping back to civilisation.",
|
||
description
|
||
"A stout wooden crate, only slightly battered by its fall through
|
||
the branches.",
|
||
before [;
|
||
PushDir, Remove, Take:
|
||
"The case is too heavy to bother moving, as long as your
|
||
expedition is still incomplete.
|
||
It'll probably have to be taken out by helicopter.";
|
||
],
|
||
number 0, ! <-- used by the daemon
|
||
daemon [;
|
||
switch (++self.number) {
|
||
!-- Start of game
|
||
1: "^You hear the distant drone of an aeroplane.";
|
||
2: "^The plane is much louder, and seems to be flying very
|
||
low. Terrified birds rise in screeching flocks.";
|
||
3: move self to Forest;
|
||
if (location == Forest)
|
||
"^You involuntarily crouch as the plane flies directly
|
||
overhead, seemingly only inches above the treetops.
|
||
With a loud thump, something drops heavily to the
|
||
ground.";
|
||
"^Even underground, the engine roar is deafening.
|
||
Then there's a dull thump overhead and a little dust
|
||
falls from the ceiling.";
|
||
4: StopDaemon(self);
|
||
move Parrot to Forest; !!
|
||
if (location == Forest) !!
|
||
"^The roar dies away; calm returns to the forest.
|
||
A brightly-coloured parrot alights
|
||
on a nearby branch."; !!
|
||
"^The roar dies away."; !!
|
||
!-- End of game
|
||
5: remove Parrot; !!
|
||
"^A deep throbbing noise can be heard.
|
||
The parrot flies off in alarm."; !!
|
||
6: "^A helicopter appears, hovering overhead.";
|
||
7: StopDaemon(self);
|
||
remove self;
|
||
deadflag = 2; ! <-- You win!
|
||
"^The helicopter lowers a rope; you tie it around the
|
||
packing case, which is hauled up into the air,
|
||
then a rope ladder comes dangling down.
|
||
With one last look around the clearing, you climb the
|
||
ladder into the waiting craft.
|
||
Back to civilisation, and a decent pint of Brakspear's!";
|
||
}
|
||
],
|
||
has container open openable static;
|
||
|
||
!==============================================================================!
|
||
! As DM <20><>8 except: started endgame processing when all treasure has been
|
||
! found. Added Bangle and Ruby treasures. "Undiscovered" is useful when
|
||
! ensuring that treasures can't be found twice.
|
||
!
|
||
Class Treasure
|
||
with cultural_value 10,
|
||
before [;
|
||
Remove, Take:
|
||
if (self in Packing_Case)
|
||
"Unpacking such a priceless artifact had best wait
|
||
until the Metropolitan Museum can do it.";
|
||
],
|
||
after [;
|
||
Insert:
|
||
if (second == Packing_Case) {
|
||
parrot.squawk("Thief"); !!
|
||
score = score + self.cultural_value;
|
||
print "Safely packed away.^";
|
||
}
|
||
if (score == MAX_SCORE) {
|
||
StartDaemon(Packing_Case);
|
||
"^The case is full, and you're feeling really homesick.
|
||
Now, how to get out of here?";
|
||
}
|
||
rtrue; ! <-- print nothing further
|
||
];
|
||
|
||
Object Undiscovered "hidden treasure room"
|
||
with description "How the heck did you get here!?.";
|
||
|
||
Treasure Statuette "pygmy statuette" Undiscovered
|
||
with name 'pygmy' 'statuette' 'statue' 'mayan' 'snake' 'spirit',
|
||
description
|
||
"A menacing, almost cartoon-like statuette of a pygmy spirit
|
||
with an enormous snake around its neck.";
|
||
|
||
Treasure Bangle "silver bangle" Undiscovered
|
||
with name 'silver' 'bangle' 'bracelet' 'ring',
|
||
cultural_value 20,
|
||
description "An intricately chased piece of jewellery.";
|
||
|
||
Treasure Ruby "blood-red ruby" Undiscovered
|
||
with name 'blood' 'red' 'blood-red' 'ruby' 'stone' 'jewel',
|
||
cultural_value 30,
|
||
description "A vivid red jewel, as large as a hen's egg.";
|
||
|
||
Treasure Honeycomb "lump of wax" Undiscovered
|
||
with name 'ancient' 'honeycomb' 'old' 'honey' 'comb' 'wax' 'lump',
|
||
cultural_value 40,
|
||
description
|
||
"On closer examination, the lump appears to be an old honeycomb.",
|
||
after [;
|
||
Eat:
|
||
"Perhaps the most expensive meal of your life.
|
||
The honey tastes odd, perhaps because it was used to store the
|
||
entrails of the king buried here, but still like honey.";
|
||
Drop: !!
|
||
StartTimer(self, 2); !!
|
||
"The honeycomb immediately starts to soften."; !!
|
||
Take: !!
|
||
StopTimer(self); !!
|
||
"The wax, though very soft, still forms a honeycomb."; !!
|
||
],
|
||
time_left 0, !!
|
||
time_out [; !!
|
||
if (self in location) !!
|
||
print "The honeycomb suddenly turns to liquid wax,
|
||
spreads to a puddle and immediately vapourises.^"; !!
|
||
remove self; !!
|
||
], !!
|
||
has edible;
|
||
|
||
!==============================================================================!
|
||
! Not in the DM as such, but useful (a) to distinguish room definitions from
|
||
! those of ordinary objects in the file, and (b) to provide light everywhere
|
||
! (unless overruled). See DM <20><>3.8.
|
||
!
|
||
Class Room
|
||
! with cant_go [; SmartCantGo(); ], !!
|
||
has light;
|
||
|
||
!==============================================================================!
|
||
! As DM <20><>7 and 10.
|
||
!
|
||
Room Forest "Dark Forest"
|
||
with name 'forest' 'jungle' 'clearing' 'olive' 'tree' 'trees' 'midges',
|
||
description
|
||
"In this tiny clearing, the pine-needle carpet is broken by
|
||
stone-cut steps leading down into the darkness.
|
||
Dark olive trees crowd in on all sides, the air steams with
|
||
warm recent rain, midges hang in the air.",
|
||
d_to Stone_Steps,
|
||
u_to
|
||
"The trees are spiny and you'd cut your hands to ribbons
|
||
trying to climb them.",
|
||
after [; Go: parrot.squawk("Where you been?"); ], !!
|
||
cant_go
|
||
"The rainforest-jungle is dense, and you haven't hacked through it
|
||
for days to abandon your discovery now.
|
||
Really, you need a good few artifacts to take back to civilisation
|
||
before you can justify giving up the expedition.";
|
||
|
||
!==============================================================================!
|
||
! As DM <20><>7 and 8 except: added discovery of Statuette on picking the
|
||
! mushroom.
|
||
!
|
||
Object Mushroom "speckled mushroom" Forest
|
||
with name 'speckled' 'mushroom' 'fungus' 'toadstool',
|
||
initial
|
||
"A speckled mushroom grows out of the sodden earth,
|
||
on a long stalk.",
|
||
description
|
||
"The mushroom is capped with blotches,
|
||
and you aren't at all sure it's not a toadstool.",
|
||
before [;
|
||
Eat:
|
||
if (random(100) > 30)
|
||
"You nibble at one corner,
|
||
but the curious taste repels you.";
|
||
deadflag = 1; ! <-- You die!
|
||
"The tiniest nibble is enough.
|
||
It was a toadstool, and a poisoned one at that!";
|
||
],
|
||
after [;
|
||
Drop:
|
||
parrot.squawk("Who's a good boy?"); !!
|
||
"The mushroom drops to the ground, battered slightly.";
|
||
Take:
|
||
parrot.squawk("Nasty mushroom"); !!
|
||
if (self has general)
|
||
"You pick up the slowly-disintegrating mushroom.";
|
||
give self general;
|
||
move Statuette to location;
|
||
"You stoop to pick the mushroom, neatly cleaving its thin stalk.
|
||
As you straighten up, you notice what looks like a
|
||
snake in the grass.";
|
||
],
|
||
has edible;
|
||
|
||
!==============================================================================!
|
||
! As DM <20><>7 and 8 except: replaced "first feet" by cobwebs.
|
||
!
|
||
Object Stone_Steps "stone-cut steps" Forest
|
||
with name 'stone' 'stone-cut' 'steps' 'stairs' 'cobwebs',
|
||
description [;
|
||
print "The cracked and worn steps descend into a dim chamber. ";
|
||
if (Square_Chamber has visited)
|
||
"The filmy cobwebs which once spanned the entrance
|
||
now hang in tatters.";
|
||
else
|
||
"Cobwebs form a flimsy barrier,
|
||
unlikely to impede your descent.";
|
||
],
|
||
door_to Square_Chamber, door_dir d_to,
|
||
has door open scenery;
|
||
|
||
!==============================================================================!
|
||
! As DM <20><>10 except: added examination of floor, word on east lintel,
|
||
! insect trails when mushroom bursts.
|
||
!
|
||
Room Square_Chamber "Square Chamber"
|
||
with name 'square' 'chamber' 'sand' 'dust' 'lintel' 'lintels' 'lintelled'
|
||
'east' 'south' 'doorways' 'doors' 'steps',
|
||
description
|
||
"A sunken, gloomy stone chamber, ten yards across,
|
||
whose floor is covered with fine sandy dust.
|
||
A shaft of sunlight cuts in from the steps above,
|
||
giving the chamber a diffuse light, but in the shadows low
|
||
lintelled doorways to east and south
|
||
lead into the deeper darkness of the Temple.",
|
||
before [;
|
||
Drop:
|
||
if (noun == mushroom)
|
||
<<Insert Mushroom Sunlight>>;
|
||
Examine:
|
||
if (noun == d_obj) {
|
||
if (Trails in location)
|
||
<<Examine Trails>>;
|
||
"Only your own footprints disturb the dust.";
|
||
}
|
||
Go: if (noun == e_obj) {
|
||
print "As you move into the eastern shadows, you seem to
|
||
glimpse the word SENE scratched on the lintel,
|
||
but before you can stop to inspect it more closely,
|
||
you find yourself in...^";
|
||
rfalse; ! <-- continue with the regular action
|
||
}
|
||
Insert:
|
||
if ((noun == Mushroom) && (second == Sunlight)) {
|
||
remove Mushroom;
|
||
move Trails to location;
|
||
"You drop the mushroom on the floor, in the glare of the
|
||
shaft of sunlight.
|
||
It bubbles obscenely, distends and then bursts into a
|
||
hundred tiny insects which run for the darkness in every
|
||
direction, leaving strange trails in the sandy floor.
|
||
No trace of fungus remain.";
|
||
}
|
||
],
|
||
u_to Forest,
|
||
e_to Inner_Web,
|
||
s_to Corridor;
|
||
|
||
!==============================================================================!
|
||
! As DM <20><>10.
|
||
!
|
||
Object Sunlight "shaft of sunlight" Square_Chamber
|
||
with name 'shaft' 'of' 'sunlight' 'sun' 'light' 'beam' 'sunbeam' 'ray'
|
||
'rays' 'sun^s',
|
||
description
|
||
"The shaft of sunlight glimmers motes of dust in the air,
|
||
making it seem almost solid.",
|
||
before [;
|
||
Examine, Search:
|
||
;
|
||
default:
|
||
"It's only an insubstantial shaft of sunlight.";
|
||
],
|
||
has scenery;
|
||
|
||
!==============================================================================!
|
||
! Not in the DM as such, but useful because employed twice. It seemed easier
|
||
! to have two sets of carvings rather just one plus a lot of if... tests.
|
||
! See DM <20><>3.8.
|
||
!
|
||
Class Carved
|
||
with name 'carved' 'inscription' 'inscriptions' 'carving' 'carvings'
|
||
'group' 'of',
|
||
initial "Carved inscriptions crowd the walls and ceiling.",
|
||
has container open pluralname static;
|
||
|
||
!==============================================================================!
|
||
! As DM <20><>10 except: changed to include insect trails suggesting a carving,
|
||
! and pressable carving which reveals cavity.
|
||
!
|
||
Carved Carvings "carved inscriptions" Square_Chamber
|
||
with description [;
|
||
print "The carvings cut deep into the rocks from which the
|
||
chamber is built, forming swirling sinuous patterns.";
|
||
if (cavity in self)
|
||
print " In the middle of one wall, a small cavity can be seen.";
|
||
new_line;
|
||
],
|
||
before [;
|
||
Push:
|
||
"Pressing the carved rock walls at random is unlikely
|
||
to be revealing.";
|
||
Touch:
|
||
"The carvings are warm and smooth to the touch.";
|
||
];
|
||
|
||
Carved Other_Carvings "carved inscriptions"
|
||
with description
|
||
"You stare at a group of carvings in the middle of one wall,
|
||
uncannily resembling the insects' trail left in the sand,
|
||
and feel your hand reaching out in that direction.",
|
||
before [;
|
||
Push:
|
||
remove Other_Carvings;
|
||
move Carvings to location;
|
||
move Cavity to Carvings;
|
||
"The carvings slide inwards, revealing a small cavity.";
|
||
Touch:
|
||
"The carvings seems to shift slightly under your hand.
|
||
Perhaps with a little more pressure...?";
|
||
];
|
||
|
||
Object Cavity "cavity among the carvings"
|
||
with name 'cavity' 'hole' 'deep' 'gloomy',
|
||
description
|
||
"The cavity, a few inches across, is deep and gloomy.",
|
||
has container open static;
|
||
|
||
Object Trails "trails in the sand"
|
||
with name 'trail' 'trails' 'sand' 'sandy' 'pattern' 'insect' 'insects',
|
||
initial "Strange trails swirl on the sandy floor.",
|
||
description [;
|
||
if (self has general) {
|
||
remove Carvings;
|
||
move Other_Carvings to location;
|
||
give self ~general;
|
||
}
|
||
"The insect trails seem to resemble one particular group of
|
||
carvings on the wall.";
|
||
],
|
||
has general pluralname static;
|
||
|
||
!==============================================================================!
|
||
! A Web room is implied at DM <20><>10, but not defined. Here, it's implemented
|
||
! as a simple dark maze of two rooms, once of which is home to the
|
||
! scuttling claws described in Example 37. The Sodium_Lamp is here.
|
||
!
|
||
Class Maze
|
||
class Room,
|
||
with name 'dark' 'darkness' 'web',
|
||
description "Gloomy passages lead in all directions.",
|
||
before [;
|
||
Go: give self ~visited;
|
||
],
|
||
cant_go
|
||
"Blundering around in the gloom, it's impossible to tell
|
||
which direction is which.",
|
||
has ~light;
|
||
|
||
Maze Inner_Web "Web of Darkness"
|
||
with se_to Outer_Web,
|
||
ne_to Inner_Web,
|
||
n_to Inner_Web, s_to Inner_Web, e_to Inner_Web, w_to Inner_Web,
|
||
nw_to Inner_Web, sw_to Inner_Web,
|
||
u_to Inner_Web, d_to Inner_Web;
|
||
|
||
Maze Outer_Web "Web of Darkness"
|
||
with se_to Outer_Web,
|
||
ne_to Square_Chamber,
|
||
n_to Inner_Web, s_to Inner_Web, e_to Inner_Web, w_to Inner_Web,
|
||
nw_to Inner_Web, sw_to Inner_Web,
|
||
u_to Inner_Web, d_to Inner_Web,
|
||
before [;
|
||
Go: if ((noun == ne_obj) && (Sodium_Lamp in Undiscovered)) { !!
|
||
move Sodium_Lamp to player; !!
|
||
print "Sensing a slight draught you move in that direction,
|
||
stumbling over something lying on the ground in the dark.
|
||
Almost inadvertently you grab it before gratefully
|
||
emerging into the gloomy chamber.^";
|
||
rfalse; ! <-- continue with the regular action
|
||
}
|
||
];
|
||
|
||
!==============================================================================!
|
||
! As DM Ex.37 except: daemon runs only in the Inner_Web room.
|
||
!
|
||
Object Tiny_Claws "sound of tiny claws" thedark
|
||
with name 'tiny' 'claws' 'sound' 'of' 'scuttling' 'scuttle' 'things'
|
||
'creatures' 'insects' 'monsters',
|
||
article "the",
|
||
initial "Somewhere, tiny claws are scuttling.",
|
||
description "Without a light, you'll never see anything here!",
|
||
before [;
|
||
Attack: "They easily avoid your flailing about in the dark.";
|
||
Listen: "How intelligent they sound, for mere insects.";
|
||
Smell: "You can smell only your own fear.";
|
||
Taste, Touch:
|
||
"You wouldn't want to. Really.";
|
||
default:
|
||
"The creatures evade you, chittering.";
|
||
],
|
||
number 0, ! <-- used by the daemon
|
||
each_turn [; StartDaemon(self); ],
|
||
daemon [;
|
||
if (real_location ~= Inner_Web) { ! location just has "thedark"
|
||
self.number = 0;
|
||
StopDaemon(self);
|
||
rtrue; ! <-- ?
|
||
}
|
||
switch(++self.number) {
|
||
1: "^The scuttling draws a little nearer,
|
||
and your breathing grows load and hoarse.";
|
||
2: "^The perspiration of terror runs off your brow.
|
||
The creatures are almost here!";
|
||
3: "^You feel a tickling at your extremities and kick outward,
|
||
shaking something chitinous off.
|
||
Their sound alone is a menacing rasp.";
|
||
4: deadflag = 1; ! <-- You die!
|
||
"^Suddenly there is a tiny pain, of a hypodermic-sharp
|
||
fang at your calf.
|
||
Almost at once your limbs go into spasm, your shoulders
|
||
and knee-joints lock, your tongue swells...";
|
||
}
|
||
];
|
||
|
||
!==============================================================================!
|
||
! As DM <20><>12 except: added the moss concealing the Ruby.
|
||
!
|
||
Room Corridor "Stooped Corridor"
|
||
with name 'low' 'stooped' 'corridor',
|
||
description
|
||
"A low, square-cut corridor, running north to south,
|
||
stooping over you.
|
||
Patches of moss emit a faint green fluorescent glow,
|
||
just enough that you can see your surroundings.",
|
||
n_to Square_Chamber,
|
||
s_to Stone_Door,
|
||
w_to Junction, !!
|
||
has ;
|
||
|
||
Object Moss "mossy patches" Corridor
|
||
with name 'moss' 'mossy' 'patches' 'green' 'fluorescent' 'glow' 'clumps',
|
||
description [;
|
||
if (Ruby in Undiscovered)
|
||
"The moss grows in rough clumps, surprisingly thick in places.
|
||
Is that a hint of red hidden among all the greenery?";
|
||
"The moss, now somewhat raggy, grows in rough clumps.";
|
||
],
|
||
before [;
|
||
Search:
|
||
if (Ruby in Undiscovered) {
|
||
move Ruby to location;
|
||
"Something rolls from the moss onto the ground.";
|
||
}
|
||
],
|
||
has pluralname scenery;
|
||
|
||
!==============================================================================!
|
||
! As DM <20><>12. The key isn't actually defined in the DM.
|
||
!
|
||
Object Stone_Door "stone door"
|
||
with name 'stone' 'door' 'big' 'massive' 'yellow',
|
||
description "It's just a big stone door.",
|
||
when_closed "The passage is barred by a massive door of yellow stone.",
|
||
when_open "The massive yellow stone door is open.",
|
||
door_to
|
||
[; if (location == Corridor) return Shrine; return Corridor; ],
|
||
door_dir
|
||
[; if (location == Corridor) return s_to; return n_to; ],
|
||
with_key Stone_Key,
|
||
found_in Corridor Shrine,
|
||
has door lockable locked openable static;
|
||
|
||
Object Stone_Key "huge iron key" Cavity
|
||
with name 'huge' 'iron' 'key',
|
||
description "It must be a pretty big door to need a key like this.";
|
||
|
||
!==============================================================================!
|
||
! A Shrine room is implied at DM <20><>10, but not defined.
|
||
!
|
||
Room Shrine "Lofty Shrine"
|
||
with name 'lofty' 'shrine' 'haze' 'hazy' 'craggy' 'walls' 'quartz',
|
||
description
|
||
"For an underground chamber, the Shrine is remarkably high,
|
||
though its upper half is hazy and difficult to see clearly.
|
||
The craggy walls are polished natural rock, in which tiny
|
||
flecks of quartz catch the light of the flickering candle.",
|
||
n_to Stone_Door;
|
||
|
||
!==============================================================================!
|
||
! As DM <20><>14 except: added processing of objects placed on the altar.
|
||
!
|
||
Object Stone_Table "slab altar" Shrine
|
||
with name 'stone' 'table' 'slab' 'altar' 'great',
|
||
initial "A great stone slab of a table dominates the Shrine.",
|
||
description
|
||
"It's big enough to lie on, though in the circumstances
|
||
that might prove to be a A Really Bad Idea.",
|
||
after [;
|
||
Enter:
|
||
deadflag = 1; ! <-- You die!
|
||
"With astonishing speed, the horror-struck priest plucks
|
||
a bronze dagger from his tattered robe, and stabs you
|
||
in your sacrilegious heart.";
|
||
Receive:
|
||
remove noun;
|
||
switch (noun) {
|
||
Stone_Key:
|
||
move Honeycomb to player;
|
||
"His eyes dimly agleam with gratitude, the priest takes
|
||
the key and conceals it among his rags.
|
||
Then, lifting the candle, he carefully detaches a large
|
||
lump of the mottled wax, and gives it to you.";
|
||
Honeycomb:
|
||
move Honeycomb to player;
|
||
"~For returning the key, that is yours to keep.~";
|
||
}
|
||
print "The priest takes ", (the) noun, " and conceals it
|
||
among his rags.^";
|
||
rtrue; ! <-- print nothing further
|
||
],
|
||
has enterable supporter static;
|
||
|
||
!==============================================================================!
|
||
! Not in the DM as such, but added to provide light, and as a source for
|
||
! the Honeycomb.
|
||
!
|
||
Object Candle "flickering candle" Stone_Table
|
||
with name 'flickering' 'candle' 'flame',
|
||
initial
|
||
"A flickering candle at one end of the slab casts
|
||
grotesque shadows on the walls.",
|
||
description
|
||
"The candle is little more than a crudely moulded lump of wax.
|
||
Its texture is vaguely crystalline, with small fragments
|
||
embedded within.",
|
||
has static;
|
||
|
||
!==============================================================================!
|
||
! As DM <20><>16 except: the priest deal in objects, not the dictionary.
|
||
!
|
||
Object Priest "mummified priest" Shrine
|
||
with name 'mummified' 'priest' 'old' 'ancient' 'dessicated',
|
||
initial
|
||
"Behind the slab, a mummified priest stands waiting,
|
||
barely alive at best, impossibly venerable.",
|
||
description
|
||
"He is dessicated and hangs together only by will-power.
|
||
Though his first language is presumably local Mayan, you have
|
||
the curious instinct that he will understand your speech.",
|
||
life [;
|
||
Answer:
|
||
switch (noun) {
|
||
'hello', 'hi', 'bye', 'goodbye', 'good-bye', 'cheerio',
|
||
'thanks', 'thank', 'thankyou', 'you', 'cheers', 'ta':
|
||
"Silently, carefully, the priest nods his head.";
|
||
}
|
||
"The priest coughs, and almost falls apart.";
|
||
Ask:
|
||
switch (second) {
|
||
'king', 'tomb', 'shrine', 'temple', 'altar', 'slab':
|
||
"~The King (life! propserity! !happiness!) is buried
|
||
deep under this Shrine, where you will never go.~";
|
||
'silver', 'bangle', 'bracelet', 'ring',
|
||
'blood', 'red', 'blood-red', 'ruby', 'stone', 'jewel',
|
||
'pygmy', 'statuette', 'statue', 'mayan', 'snake', 'spirit':
|
||
"~That is one of my people's sacred relics.~";
|
||
'ancient', 'honeycomb', 'old', 'honey', 'comb', 'wax',
|
||
'lump':
|
||
"~That is the most sacred of all my people's relics.~";
|
||
'huge', 'iron', 'key':
|
||
if (parent(Stone_Key) == nothing)
|
||
"~Now my people will be able to visit the Shrine.~";
|
||
"~That has been lost for generations.
|
||
My gratitude to anyone who returns it will be
|
||
overwhelming.~";
|
||
}
|
||
"~You must find your own answer.~";
|
||
Attack, Kiss:
|
||
remove self;
|
||
"The priest desiccates away into dust until nothing remains,
|
||
not a breeze or a bone.";
|
||
Give, Show:
|
||
switch (noun) {
|
||
Bangle, Ruby, Statuette:
|
||
"~I would be grateful if you placed that before me.~";
|
||
Honeycomb:
|
||
"~For returning the key, that is yours to keep.~";
|
||
Stone_Key:
|
||
"~I would be profoundly grateful if you placed that
|
||
before me.~";
|
||
}
|
||
"The priest is indifferent to earthly things.";
|
||
Tell:
|
||
"The priest has no interest in your sordid life.";
|
||
ThrowAt:
|
||
move noun to location;
|
||
<<Attack self>>;
|
||
],
|
||
orders [;
|
||
Go: "~I must not leave the Shrine.~";
|
||
NotUnderstood:
|
||
switch (noun) {
|
||
'hello', 'hi', 'bye', 'goodbye', 'good-bye', 'cheerio',
|
||
'thanks', 'thank', 'thankyou', 'you', 'cheers', 'ta':
|
||
"Silently, carefully, the priest nods his head.";
|
||
}
|
||
"~You speak in riddles~";
|
||
default:
|
||
"~It is not your orders that I serve.~";
|
||
],
|
||
has animate;
|
||
|
||
!==============================================================================!
|
||
! ANSWERS TO EXERCISES
|
||
!==============================================================================!
|
||
! Exercise: low mist
|
||
!
|
||
Object Low_Mist "low mist"
|
||
with name 'low' 'swirling' 'mist',
|
||
initial "A low mist swirls about your feet.",
|
||
description "The mist smells slightly of rotting vegetation.",
|
||
found_in Forest Square_chamber,
|
||
before [;
|
||
Examine, Search:
|
||
;
|
||
Smell:
|
||
<<Examine self>>;
|
||
default:
|
||
"The mist is too insubstantial.";
|
||
],
|
||
has static;
|
||
|
||
!==============================================================================!
|
||
! Exercise: parrot
|
||
!
|
||
Object Parrot "red-tailed parrot"
|
||
with name 'red' 'tailed' 'red-tailed' 'parrot' 'bird',
|
||
description "Beautiful plumage.",
|
||
squawk [ utterance;
|
||
if (self in location)
|
||
print "The parrot squawks, ~", (string) utterance,
|
||
"! ", (string) utterance, "!~^";
|
||
],
|
||
has animate;
|
||
|
||
!==============================================================================!
|
||
! Exercise: lamp
|
||
!
|
||
Object Sodium_Lamp "sodium lamp" Undiscovered
|
||
with name 'sodium' 'lamp' 'light' 'lantern',
|
||
describe [;
|
||
if (self has on)
|
||
"The lamp is burning brightly.";
|
||
"The lamp isn't lit.";
|
||
],
|
||
battery_power 40,
|
||
before [;
|
||
Burn:
|
||
<<SwitchOn self>>;
|
||
Examine:
|
||
print "It is a heavy-duty archaeologist's lamp, ";
|
||
if (self hasnt on) "currently off.";
|
||
if (self.battery_power < 10) "glowing a dim yellow.";
|
||
"blazing with brilliant yellow light.";
|
||
],
|
||
after [;
|
||
SwitchOff: give self ~light;
|
||
SwitchOn: give self light;
|
||
],
|
||
has switchable;
|
||
|
||
!==============================================================================!
|
||
! Exercise: five rooms west of the Corridor
|
||
!
|
||
Room Junction "Junction between passages"
|
||
with name 'junction',
|
||
description
|
||
"A rough-hewn circular passage from the south forks to the
|
||
northwest and northeast.
|
||
A narrower passage leads east.",
|
||
e_to Corridor,
|
||
nw_to Northwest_Passage,
|
||
ne_to Northeast_Passage,
|
||
s_to South_Passage,
|
||
has ~light;
|
||
|
||
Room Northwest_Passage "North west passage"
|
||
with name 'north' 'west' 'northwest' 'nw' 'passage',
|
||
description
|
||
"The passage ends abruptly at a rocky wall.
|
||
In the far east corner, you can just see a narrow crack.",
|
||
before [;
|
||
Go: if (Huge_Ball in location) {
|
||
if ((noun == e_obj && self hasnt general) ||
|
||
(noun == s_obj && self has general))
|
||
"The ball almost fills the passage -
|
||
you can't get past.";
|
||
}
|
||
if (noun == e_obj) {
|
||
give Northeast_Passage general;
|
||
print "It's tight, but you just squeeze through.^";
|
||
}
|
||
],
|
||
s_to Junction,
|
||
e_to Narrow_Crack,
|
||
has ~general ~light;
|
||
|
||
Room Northeast_Passage "North east passage"
|
||
with name 'north' 'east' 'northeast' 'ne' 'passage',
|
||
description
|
||
"The passage ends abruptly at a rocky wall.
|
||
In the far west corner, you can just see a narrow crack.",
|
||
before [;
|
||
Go: if (Huge_Ball in location) {
|
||
if ((noun == w_obj && self hasnt general) ||
|
||
(noun == s_obj && self has general))
|
||
"The ball almost fills the passage -
|
||
you can't get past.";
|
||
}
|
||
if (noun == w_obj) {
|
||
give Northwest_Passage general;
|
||
print "It's tight, but you just squeeze through.^";
|
||
}
|
||
],
|
||
s_to Junction,
|
||
w_to Narrow_Crack,
|
||
has ~general ~light;
|
||
|
||
Object Narrow_Crack "narrow crack"
|
||
with name 'narrow' 'crack',
|
||
description
|
||
"Not much more than a fault in the rock,
|
||
but it might just be passable.",
|
||
door_to [;
|
||
if (location == Northwest_Passage)
|
||
return Northeast_Passage; return Northwest_Passage;
|
||
],
|
||
door_dir [;
|
||
if (location == Northwest_Passage) return e_to; return w_to;
|
||
],
|
||
found_in Northwest_Passage Northeast_passage,
|
||
has door open scenery;
|
||
|
||
Room South_Passage "Southerly passage"
|
||
with name 'south' 'passage',
|
||
description [;
|
||
print "The passage ends abruptly at a narrow ledge,
|
||
where a bottomless chasm opens at your feet. ";
|
||
if (Huge_Ball in Chasm)
|
||
print "The pumice-stone ball is wedged in the gap, forming
|
||
a precarious bridge to the cave on the southern side.";
|
||
else
|
||
print "To the east and west, the narrow ledge fades to nothing.
|
||
There's a small cave in the opposite wall,
|
||
but it's too far away to reach.";
|
||
if (Bangle in Rocky_Alcove)
|
||
" In the cave, something faintly gleams.";
|
||
"";
|
||
],
|
||
n_to Junction,
|
||
s_to [;
|
||
if (Huge_Ball in Chasm) return Rocky_Alcove; return nothing;
|
||
],
|
||
cant_go [;
|
||
if (noun == s_obj) "The chasm presents an impossible gap.";
|
||
if (Huge_Ball in Chasm)
|
||
"You can only go north or (gulp) south.";
|
||
"The only safe way is back to the north.";
|
||
],
|
||
has ~light;
|
||
|
||
Room Rocky_Alcove "Rocky alcove"
|
||
with name 'south' 'alcove' 'cave' 'rocky',
|
||
description
|
||
"This little cave is just a rough excavation in the wall above
|
||
the chasm; you can only go back the way that you came.",
|
||
n_to South_Passage,
|
||
has ~light;
|
||
|
||
!==============================================================================!
|
||
! Exercise: ball and chasm
|
||
!
|
||
Object Huge_Ball "huge pumice-stone ball" Junction
|
||
with name 'huge' 'pumice' 'stone' 'pumice-stone' 'ball',
|
||
initial "A huge pumice-stone ball rests here, nearly filling the room.",
|
||
description "A good eight feet across, though fairly lightweight.",
|
||
before [;
|
||
Pull, Push, Turn:
|
||
"With a firm sense of direction,
|
||
you could probably push it ahead of you.";
|
||
PushDir:
|
||
if (location == Junction)
|
||
switch (second) {
|
||
nw_obj: give Northwest_Passage ~general;
|
||
ne_obj: give Northeast_Passage ~general;
|
||
e_obj:
|
||
"The corridor entrance is but seven feet across.";
|
||
s_obj:
|
||
if (self has general) {
|
||
print "Now that it's got started,
|
||
the ball rolls easily.
|
||
You pause for breath.^";
|
||
move Huge_Ball to Chasm;
|
||
move Bangle to Rocky_Alcove;
|
||
rtrue;
|
||
}
|
||
else
|
||
"The ball rocks slightly,
|
||
but won't start moving.";
|
||
}
|
||
if ((location == Northwest_Passage && second == e_obj) ||
|
||
(location == Northeast_Passage && second == w_obj))
|
||
"Get real - the crack's barely a foot wide.";
|
||
if ((location == Northwest_Passage or Northeast_Passage) &&
|
||
(location hasnt general) && (second == s_obj))
|
||
"You need to be behind the ball to do that.";
|
||
AllowPushDir();
|
||
rtrue;
|
||
Remove, Take:
|
||
"There's a lot of stone in an eight-foot sphere.";
|
||
],
|
||
after [;
|
||
PushDir:
|
||
if (second == s_obj) {
|
||
give self general;
|
||
StartTimer(self, 1);
|
||
"The ball rolls away; you follow close behind.";
|
||
}
|
||
if (second == nw_obj or ne_obj)
|
||
"You strain to push the ball along the passage.";
|
||
],
|
||
time_left 0,
|
||
time_out [; give self ~general; ],
|
||
has ~general static;
|
||
|
||
Object Chasm "horrifying chasm"
|
||
with name 'chasm' 'pit' 'depths' 'horrifying' 'bottomless' 'depths',
|
||
react_before [;
|
||
Go: if (noun == d_obj)
|
||
<<Enter self>>;
|
||
Jump:
|
||
<<Enter self>>;
|
||
],
|
||
before [;
|
||
Enter:
|
||
deadflag = 1; ! <-- you die!
|
||
"You plummet through the silent voids of darkness.";
|
||
],
|
||
after [;
|
||
Receive:
|
||
remove noun;
|
||
print_ret (The) noun, " tumbles silently into the darkness
|
||
of the chasm.";
|
||
Search:
|
||
"The chasm is deep and murky.";
|
||
],
|
||
found_in South_Passage Rocky_Alcove,
|
||
has container open scenery;
|
||
|
||
!==============================================================================!
|
||
! Exercise: XYZZY
|
||
!
|
||
Room At_End_Of_Road "At End Of Road"
|
||
with name 'road' 'street' 'path' 'forest' 'stream' 'building' 'gully',
|
||
description
|
||
"You are standing at the end of a road before a small
|
||
brick building. Around you is a forest. A small
|
||
stream flows out of the building and down a gully.",
|
||
before [;
|
||
Examine, Look:
|
||
;
|
||
default:
|
||
"There'll be time for that later.
|
||
Your immediate concern is, where on earth are you?.";
|
||
],
|
||
original_location 0,
|
||
time_left 0,
|
||
time_out [;
|
||
print "^Before you can get your bearings,
|
||
the landscape swirls again and you're back in...^";
|
||
PlayerTo(self.original_location);
|
||
];
|
||
|
||
[ XyzzySub;
|
||
print "Your surroundings swirl before you in a painful blur.
|
||
Instinctively, you close your eyes.
|
||
When you cautiously re-open them, the Ruins have gone...^";
|
||
At_End_Of_Road.original_location = location;
|
||
StartTimer(At_End_Of_Road, 1);
|
||
PlayerTo(At_End_Of_Road);
|
||
];
|
||
|
||
!==============================================================================!
|
||
! END OF ANSWERS TO EXERCISES
|
||
!==============================================================================!
|
||
! Every game needs to include the Grammar.
|
||
!
|
||
Include "Grammar";
|
||
|
||
!==============================================================================!
|
||
! Added to enable you to "pick" the mushroom (as well as the usual "take",
|
||
! "get", "pick up", etc). See DM <20><>26.
|
||
!
|
||
Extend "pick" * edible -> Take;
|
||
|
||
Verb "xyzzy" * -> Xyzzy; !!
|
||
|
||
!==============================================================================!
|