1
0
mirror of https://github.com/sehugg/8bitworkshop.git synced 2024-11-25 03:34:05 +00:00
8bitworkshop/presets/zmachine/museum.inf
2020-07-07 18:40:03 -05:00

2170 lines
75 KiB
INI

! ----------------------------------------------------------------------------
! Museum 961111 One of the standard Inform 6 example games
!
! created: 20.12.95
! translated to Inform 6: 11.11.96
!
! This "game" is a compendium of solved exercises from the Designer's
! Manual. Room numbers are section numbers within the Third Edition.
! Many of these exercises are difficult, and so is some of the code below.
! ----------------------------------------------------------------------------
Constant Story "MUSEUM OF INFORM";
Constant Headline
"^An Interactive Companion to the Designer's Manual (Third Edition)^";
! The game is meant to be experimented with, so we always define:
Constant DEBUG;
Release 2;
Serial "961111";
Replace DrawStatusLine;
Include "Parser";
! --------------------------------------------------------------------------
Object samples_bag "samples bag"
with description "A capacious SACK_OBJECT (see section 20).",
name "samples" "bag", article "your",
when_closed "Your samples bag lies on the floor.",
when_open "Your samples bag lies open on the floor.",
has container open openable;
Constant SACK_OBJECT = samples_bag;
Include "VerbLib";
! --------------------------------------------------------------------------
Attribute crewmember;
Property weight 10;
Class Key with name "key";
! --------------------------------------------------------------------------
Object Foyer "Foyer"
has light
with description
"The foyer of the magnificent Museum of Inform. A flight of
stairs sweeps upward to Chapters V and VI, and corridors
fan out on this level into Chapter IV. These run:^
^ north into Room 10 (the Halls of Sense and Direction),
^ south along Corridor 12 (doors) to Room 13 (switches),
^ @00 to Room 11 (the Wonderful World of Containers)
^ and @01 to Room 14 (which houses larger exhibits).^^
(And a plain ladder descends into the basement; you can also
step out onto a balcony.)",
e_to Room11, u_to Second_Floor, n_to Room10,
s_to Corridor12, w_to Room14,
d_to basement, out_to balcony;
Object -> "map"
with name "map" "ground" "floor",
initial "A map of the ground floor is embossed in one wall.",
description
[; font off;
print
"^+------------------------------------------+
^| (mirror) |
^| Weights Room 10 --- Room 10a |
^| Room senses directions |
^| | | |
^| Room 14 --- Foyer --- Room 11 |
^| (changing (you are here) containers |
^| character) | |
^| | |
^| Room 15 --- Corridor 12 |
^| (MS room) (door, curator) |
^| (Bible) | |
^| Switches Hall 13 |
^| (chasm) |
^| | |
^| Far Side of Room 13 |
^+------------------------------------------+^";
font on;
],
has static;
! --------------------------------------------------------------------------
Object basement "Museum Basement"
with u_to Foyer,
description
"Once Room 17, this space has been abandoned by the curators,
who have simply sprayed its walls with moth-repellent and
abandoned it.",
before
[; Smell: "Napthalene.";
];
! --------------------------------------------------------------------------
Object Room10 "Hall of Senses"
with description
"This is Room 10, north of the foyer. If you try going further
north, a string will be printed instead. The exit to the @00
has a routine attached, and randomly leads either to the
Directions Room or back to the foyer.",
s_to Foyer,
n_to "This string is the ~n_to~ value for this room.",
e_to
[; if (random(2)==1) return Foyer; return Room10a; ],
has light;
Object -> "TRAP lever"
with name "trap" "lever",
before
[; Pull, Push:
if (self has on) <<SwitchOff self>>;
<<SwitchOn self>>;
],
after
[; SwitchOn: move orange_cloud to location;
"Clunk! An orange cloud suddenly descends upon you.";
SwitchOff: remove orange_cloud;
"Click! The orange cloud vanishes.";
],
has switchable static;
Object -> "gold watch"
with name "gold" "watch",
description "The watch has no hands, oddly.",
react_before
[; Listen: if (noun==0 or self) "The watch ticks loudly."; ];
Object -> "sprig of lavender"
with name "sprig" "of" "lavender",
react_before
[; Smell: if (noun==0 or self) "Lavender-perfume. Ahh!"; ];
Object orange_cloud "orange cloud"
with name "orange" "cloud",
react_before
[; Look: "You can't see for the orange cloud surrounding you.";
Go, Exit: "You wander round in circles, choking.";
Smell: if (noun==0 or self) "Cinnamon? No, nutmeg.";
],
has scenery;
! --------------------------------------------------------------------------
! For east-west reflection
! --------------------------------------------------------------------------
Lowstring east_str "east"; Lowstring west_str "west";
[ NormalWorld; string 0 east_str; string 1 west_str;
e_obj.door_dir = e_to; w_obj.door_dir = w_to;
];
[ ReversedWorld; string 0 west_str; string 1 east_str;
w_obj.door_dir = e_to; e_obj.door_dir = w_to;
];
Object Room10a "Hall of Directions"
with name "mirror",
description
"An annexe to Room 10: the main exit is back @01, and there's a
curiously misty mirror on the north wall. Also, there's an exit
in the fourth, ~hyper~ dimension (which is only visible in the
weird geometry of this room).",
initial
[; move hyper to compass; StartDaemon(hyper);
],
w_to Room10,
n_to
[; print "Walking through the mirror is confusing...^";
if (self has general) NormalWorld(); else ReversedWorld();
if (self has general) give self ~general; else give self general;
<<Look>>;
],
in_to [; print "Amazing! Your body corkscrews as you pass.^";
return Room11; ],
has light;
Object hyper "hyper-dimensional direction"
with name "hyper" "fourth" "dimension", article "the", door_dir in_to,
daemon
[; if (location ~= Room10a) { remove self; StopDaemon(self); }
],
has scenery;
! --------------------------------------------------------------------------
Object Room11 "Wonderful World of Containers"
with description
"This is Room 11, @00 of the foyer. You notice a typical piece
of scenery which turns out to be a supporter: a mantelpiece.",
w_to Foyer,
has light;
Object -> "bearded psychiatrist"
with name "bearded" "doctor" "psychiatrist" "psychologist" "shrink",
initial "A bearded psychiatrist has you under observation.",
life
[; "He is fascinated by your behaviour, but makes no attempt to
interfere with it.";
],
react_after
[; Insert: print "~Subject puts ", (a) noun, " in ", (the) second,
". Interesting.~^";
PutOn: print "~Subject puts ", (a) noun, " in ", (the) second,
". Interesting.~^";
],
react_before
[; Take, Remove: print "~Subject feels lack of ", (the) noun,
". Suppressed Oedipal complex? Mmm.~^";
],
has animate;
Object -> "mantelpiece"
with name "mantel" "mantle" "piece" "mantelpiece"
has scenery supporter;
Object -> "green ball" with name "green" "ball";
Object -> "red cone" with name "red" "cone";
Object -> "blue pyramid" with name "blue" "pyramid";
Object -> "plain shopping bag (which can only hold 2 things)"
with name "plain" "shopping" "bag", capacity 2,
has container open;
Object -> "glass box with a lid" with name "glass" "box" "with" "lid"
has container transparent openable open;
Object -> "steel box with a lid" with name "steel" "box" "with" "lid"
has container openable open;
Key -> bolted_key "bolted key" with name "bolted";
Object -> "toothed bag"
with name "toothed" "bag",
description "A capacious bag with a toothed mouth.",
before
[; LetGo: "The bag defiantly bites itself
shut on your hand until you desist.";
Close: "The bag resists all attempts to close it.";
],
after
[; Receive:
"The bag wriggles hideously as it swallows ",
(the) noun, ".";
],
has container open;
Object -> "bolted cupboard"
with name "bolted" "cupboard",
describe
[; if (self hasnt open)
"^A pretty typical shut cupboard is bolted to one wall.";
"^Bolted up on one wall is an open cupboard.";
],
with_key bolted_key
has locked container openable lockable static;
Object -> "portable television set"
with name "tv" "television" "set" "portable",
initial "A portable television set has two sub-objects attached:
a power button and a screen.",
before
[; SwitchOn: <<SwitchOn power_button>>;
SwitchOff: <<SwitchOff power_button>>;
Examine: <<Examine screen>>;
],
has transparent;
Object -> -> power_button "power button"
with name "power" "button" "switch",
after
[; SwitchOn, SwitchOff: <<Examine screen>>;
],
has switchable;
Object -> -> screen "television screen"
with name "screen",
before
[; Examine: if (power_button hasnt on) "The screen is black.";
"The screen writhes with a strange Japanese cartoon.";
];
Object -> "macrame bag"
with name "macrame" "bag" "string" "net" "sack",
react_before
[; Examine, Search, Listen, Smell: ;
default:
if (inp1>1 && inp1 in self)
print_ret (The) inp1, " is tucked away in the bag.";
if (inp2>1 && inp2 in self)
print_ret (The) inp2, " is tucked away in the bag.";
],
describe
[; print "^A macrame bag hangs from the ceiling, shut tight";
if (child(self)==0) ".";
print ". Inside you can make out ";
WriteListFrom(child(self), ENGLISH_BIT); ".";
],
has container transparent static;
Object -> -> "music box"
with name "music" "box" "musical",
description "Attractively lacquered.",
react_before
[; Listen: if (noun==0 or self)
"The musical box chimes some Tchaikovsky."; ];
! --------------------------------------------------------------------------
Object Corridor12 "Corridor 12"
with description
"Runs south of the foyer. A side exit leads @01 to Room 15,
the manuscripts room.",
n_to Foyer, s_to Oak_Door, w_to Room15,
has light;
Object -> "sinister curator"
with name "sinister" "curator",
initial
[; if (self hasnt general)
"A sinister curator leans against the wall, asleep.";
"The curator is here, casting menacing looks.";
],
daemon
[ i p j n k;
if (random(3)~=1 || self hasnt general) rfalse;
p=parent(self);
objectloop (i in compass)
{ j=p.(i.door_dir);
if (ZRegion(j)==1 && j hasnt door) n++;
}
if (n==0) rfalse;
k=random(n); n=0;
objectloop (i in compass)
{ j=p.(i.door_dir);
if (ZRegion(j)==1 && j hasnt door) n++;
if (n==k)
{ move self to j;
if (p==location) "^The curator stalks away.";
if (j==location) "^The curator stalks in.";
rfalse;
}
}
],
orders
[; if (self hasnt general) "The curator only snores.";
"He raises a skeletal finger to his lips. ~Shh!~";
],
life
[; WakeOther:
if (self hasnt general)
{ give self general; move self to Foyer;
"He wakes and rouses to his feet, pushes past you
and stalks away.";
}
default: "He rears back with disdain.";
],
has animate;
Object Oak_Door "oaken door"
with name "oak" "door" "oaken",
description "Despite appearances, there is no key to this door.",
door_dir
[; if (location==Corridor12) return s_to; return n_to; ],
door_to
[; if (location==Corridor12) return Room13; return Corridor12; ],
describe
[; if (self has open) "^The oaken door stands open.";
if (self hasnt locked) "^The corridor ends in an oaken door.";
],
found_in Corridor12 Room13
has static door openable lockable;
! --------------------------------------------------------------------------
Object Room15 "Manuscripts Room"
with description
"This is Room 15, adjoining a corridor to the @00.",
e_to Corridor12,
has light;
Object -> "black Tyndale Bible"
with name "bible" "black" "book",
initial "A black Bible rests on a spread-eagle lectern.",
description "A splendid foot-high Bible, which must have survived
the burnings of 1520.",
before
[ w x; Consult:
wn = consult_from; w = NextWord();
switch(w)
{ 'matthew': x="Gospel of St Matthew";
'mark': x="Gospel of St Mark";
'luke': x="Gospel of St Luke";
'john': x="Gospel of St John";
default: "There are only the four Gospels.";
}
if (consult_words==1)
"You read the ", (string) x, " right through.";
w = TryNumber(wn);
if (w==-1000)
"I was expecting a chapter number in the ",
(string) x, ".";
"Chapter ", (number) w, " of the ", (string) x,
" is too sacred for you to understand now.";
];
! --------------------------------------------------------------------------
Object Room13 "Switches Hall"
with description
"This is Room 13, at the south end of a long corridor leading
north. Progress further south is blocked by a chasm.",
n_to Oak_Door, s_to PlankBridge,
has light;
Object -> "Gotham City searchlight"
with name "gotham" "city" "search" "light" "template" "searchlight",
article "the",
description "It has some kind of template on it.",
when_on "The old city searchlight shines out a bat against
the alabaster ceiling of the Museum.",
when_off "The old Gotham city searchlight has been lovingly
restored and housed here."
has switchable static;
Object -> "basement light switch"
with name "basement" "light" "switch",
after
[; SwitchOn: give basement light; "Click!";
SwitchOff: give basement ~light; "Click!";
],
has switchable static;
Object -> PlankBridge "plank bridge"
with description "Extremely fragile and precarious.",
name "precarious" "fragile" "wooden" "plank" "bridge",
when_open
"A precarious plank bridge spans the chasm.",
door_to
[; if (children(player)~=0)
{ deadflag=1;
"You step gingerly across the plank, which bows under
your weight. But your meagre possessions are the straw
which breaks the camel's back! There is a horrid crack...";
}
print "You step gingerly across the plank, grateful that
you're not burdened.^";
if (location==Room13) return FarSide; return Room13;
],
door_dir
[; if (location==Room13) return s_to; return n_to;
],
found_in Room13 FarSide,
has static door open;
Object FarSide "Far Side of Chasm in Room 13"
with description
"This side of the chasm is dull and dusty after all.",
n_to PlankBridge,
has light;
! --------------------------------------------------------------------------
Object Room14 "Large Exhibits Room"
with description
"This is Room 14, @01 of the foyer, which gives onto the Weights
Room to the north.",
e_to Foyer, n_to Weights_Room,
has light;
Object -> "hypnotic portrait"
with name "hypnotic" "portrait" "warthog" "picture" "of" "hog",
initial "A somewhat hypnotic full-length portrait of a warthog hangs
on the wall.",
before
[; Examine: <Examine hog>; print "^...and somehow, so do you...^";
ChangePlayer(hog); <<Look>>;
],
has static;
Object -> "Louis XV chair"
with name "louis" "xv" "quinze" "chair",
initial "A valuable Louis XV chair takes pride of place.",
has enterable supporter;
Object -> car "little red car"
with name "little" "red" "car" "kar1",
description "Large enough to sit inside. Among the controls is a
prominent on/off switch. The numberplate is KAR 1.",
when_on "The red car sits here, its engine still running.",
when_off "A little red car is parked here.",
before
[; PushDir: AllowPushDir(); rtrue;
Go: if (car has on) { Achieved(1); "Brmm! Brmm!"; }
print "(The ignition is off at the moment.)^";
],
after
[; PushDir: "The car rolls very slowly as you push it.";
],
has switchable enterable static container open;
Object -> -> "small note"
with name "small" "note",
description
" !!!! FROBOZZ MAGIC CAR COMPANY !!!!^
^Hello, Driver!^
^Instructions for use:^
^Switch on the ignition and off you go!^
^Warranty:^
^This car is guaranteed against all defects for a period of
76 milliseconds from date of purchase or until used,
whichever comes first.^
^Good Luck!";
Object -> "Giant"
with name "giant",
initial "A Giant is here. (And you know the old legend... push a
Giant, become a Giant!)",
before
[; Push: ChangePlayer(self); <<Look>>;
Take: rtrue;
],
number 0,
orders
[; if (player==self)
{ if (actor~=self)
"You only become tongue-tied and gabble.";
if (action==##Push && noun==selfobj)
{ ChangePlayer(selfobj); <<Look>>; }
rfalse;
}
Attack: "The Giant looks at you with doleful eyes.
~Me not be so bad!~";
default: "The Giant is unable to comprehend your instructions.";
],
has animate;
! --------------------------------------------------------------------------
Object "Caldera"
with description
"An old volcanic crater of mud and ash, from which there is
nowhere to go.",
has light;
Object -> hog "Warthog"
with name "wart" "hog" "warthog",
description "Muddy, sniffing and grunting.",
number,
orders
[; if (player~=self || actor~=self) rfalse;
! So now we have just the case where the player
! is currently the warthog, ordering himself about:
Go, Look, Examine, Eat, Smell, Taste, Touch: rfalse;
default: "Warthogs can't do anything as tricky as that!";
],
has animate proper;
Object -> "red berry"
with name "red" "berry" "magic",
initial "A magic red berry is half-uncovered in the mud.",
before
[; Smell, Taste, Touch:
print "The blood-smell of the berry brings you back,
back...^";
ChangePlayer(selfobj); <<Look>>;
];
! --------------------------------------------------------------------------
Constant CARRYING_STRENGTH = 500;
Constant HEAVINESS_THRESHOLD = 100;
Object Weights_Room "Weights Room"
with description
"This is an annexe, south of Room 14. In here (though nowhere
else) objects have given weights, and
you can carry only a limited total weight. (Items from elsewhere
in the museum all weigh 10 zobs, regardless of what they are.)
The longer you carry heavy objects, the more tired you become,
until you're forced to drop them; your strength recovers once
you're carrying only a light load.",
initial [; weight_monitor.activate(); ],
s_to Room14,
has light;
Object -> "feather" with name "feather", weight 1;
Object -> "iron anvil" with name "iron" "anvil", article "an", weight 300;
Object -> "five-zob weight" with name "five" "zob" "weight", weight 5;
Object -> "ten-zob weight" with name "ten" "zob" "weight", weight 10;
Object -> "twenty-zob weight" with name "twenty" "zob" "weight", weight 20;
Object -> "fifty-zob weight" with name "fifty" "zob" "weight", weight 50;
Object -> "hundred-zob weight" with name "hundred" "zob" "weight", weight 100;
[ WeightOf obj t i;
t = obj.weight;
objectloop (i in obj) t = t + WeightOf(i);
return t;
];
Object weight_monitor
with
players_strength,
warning_level 5,
activate
[; self.players_strength = CARRYING_STRENGTH; StartDaemon(self);
],
daemon
[ w s b bw;
if (location ~= Weights_Room) { StopDaemon(self); return; }
s = self.players_strength
- WeightOf(player) + HEAVINESS_THRESHOLD;
if (s<0) s=0; if (s>CARRYING_STRENGTH) s=CARRYING_STRENGTH;
self.players_strength = s;
if (s==0)
{ bw=-1;
objectloop(b in player)
if (WeightOf(b) > bw) { bw = WeightOf(b); w=b; }
self.players_strength = self.players_strength + bw;
print "^Exhausted with carrying so much, you decide
to discard ", (the) w, ": "; <<Drop w>>;
}
w=s/100; if (w==self.warning_level) return;
self.warning_level = w;
switch(w)
{ 3: "^You are feeling a little tired.";
2: "^You possessions are weighing you down.";
1: "^Carrying so much weight is wearing you out.";
0: "^You're nearly exhausted enough to drop everything
at an inconvenient moment.";
}
];
! --------------------------------------------------------------------------
Constant SUNRISE 360; ! i.e., 6 am
Constant SUNSET 1140; ! i.e., 7 pm
Global day_state = 2;
Object balcony "Balcony"
with description
[; print "An open-air balcony on the cliffside wall of the
cathedral-like Museum, hundreds of feet above ";
if (day_state==1) "sunlit plains of farms and settlements.";
"a darkling plain. Dim light from the walls above is
the only beacon in this vast night.";
],
in_to Foyer,
cant_go "The only way is back inside.",
each_turn
[ f;
if (the_time >= SUNRISE && the_time < SUNSET) f=1;
if (day_state == f) return;
if (day_state==2) { day_state = f; return; }
day_state = f;
if (f==1) "^The sun rises, illuminating the landscape!";
"^As the sun sets, the landscape is plunged into darkness.";
],
has light;
Object -> "giant clock"
with name "giant" "clock" "face" "clockface" "clock-face",
before
[; Examine: "According to the giant clockface on the wall
above, it is now ", the_time/60, ":", (the_time%60)/10,
the_time%10, ".";
default: "The giant clock-face is too high above you.";
],
react_after [; Look: new_line; <Examine self>; ],
has static concealed;
Object -> moth "moth"
with name "moth",
initial "A catchable moth flits about.";
[ GoMothGo;
if (moth in player)
{ remove moth;
"As your eyes try to adjust, you feel a ticklish sensation
and hear a tiny fluttering sound.";
}
];
Object -> "Commander Data"
with name "data" "commander",
orders
[; "~I regret that I am only here to make an example work elsewhere.
Please proceed upstairs to 10 Forward to see.~";
],
has proper animate crewmember;
! ==========================================================================
Object Second_Floor "Mezzanine"
with description
"Halfway up the marble staircase of the building, a second floor
mezzanine which leads south into Grammar Hall (an extension
purpose-built for the Room 16 exhibition).",
d_to Foyer,
s_to Grammar_Hall,
u_to Third_Floor,
has light;
Object -> "map"
with name "map" "mezzanine" "level",
initial "A map of the mezzanine level is embossed in one wall.",
description
[; font off;
print
"^+------------------------------------------+
^| |
^| |
^| |
^| |
^| Mezzanine |
^| (you are here) |
^| | |
^| | |
^| Grammar Hall 16 |
^| (telepathy, clock) |
^| (Charlotte, Dan) --- Ten Forward |
^| | (replicator) |
^| Liberator (computer) |
^| Bridge (tricorder) |
^| (Zen) |
^+------------------------------------------+^";
font on;
],
has static;
Object -> "Room 16 exhibition leaflet"
with name "leaflet" "exhibition" "guide" "room" "sixteen",
initial "An exhibition leaflet has fallen to the floor.",
description
"Among the rare & fascinating exhibits in Room 16 are:...^^
Telekinetic (and telepathic) Martha. In the telepathy
booth, you can speak to her as though she were in Room 16
with you -- but she's not, she is far away. Tell her to
~look~ to find out where, and you can also ask her to give
you things (by telekinesis).^^
Charlotte, who is playing Simon Says. She'll obey
instructions you give as long as you preface it with
~simon says~. (Though she only knows how to wave, or how to
clap many times (just tell her a number).)^^
Dyslexic Dan knows how to take and drop things and how to
perform an inventory, but unfortunately confuses Take and
Drop orders.^^
The alarm clock can be told ~on~, ~off~ or a time of day
(to set its alarm to).";
! --------------------------------------------------------------------------
Object Grammar_Hall "Grammar Hall"
has light,
with description
"The main exhibit on the second floor: Room 16, south of the
mezzanine. A Jeffreys Tube runs @00 into a Star Trek: The
Next Generation room, while a hexagonal corridor to the south
leads to the bridge of the spaceship ~Liberator~.",
n_to Second_Floor, e_to Star_Trek, s_to Blakes_Seven;
Object -> booth "telepathy booth"
with name "booth" "telepathy",
initial
"A telepathy booth stands invitingly open:
~Talk To Telekinetic Martha~.",
has enterable static;
Object -> "Charlotte"
with name "charlotte" "charlie" "chas",
number 0,
grammar
[; give self ~general;
wn=verb_wordnum;
if (NextWord()=='simon' && NextWord()=='says')
{ give self general;
verb_wordnum=verb_wordnum+2;
}
self.number=TryNumber(verb_wordnum);
if (self.number~=-1000)
{ action=##Clap; noun=0; second=0; rtrue; }
],
orders
[ i; if (self hasnt general) "Charlotte sticks her tongue out.";
WaveHands: "Charlotte waves energetically.";
Clap: if (self.number==0) "Charlotte folds her arms.";
for (i=0:i<self.number:i++)
{ print "Clap! ";
if (i==100)
print "(You must be regretting this by now.) ";
if (i==200)
print "(What a determined girl she is.) ";
}
if (self.number>100)
"^^Charlotte's a bit out of breath now.";
"^^~Easy!~ says Charlotte.";
default: "~Don't know how,~ says Charlotte.";
],
initial "Charlotte wants to play Simon Says.",
has animate female proper crewmember;
Object -> "Dyslexic Dan"
with name "dan" "dyslexic",
grammar
[; if (verb_word == 'take') { verb_wordnum++; return 'drop'; }
if (verb_word == 'drop') { verb_wordnum++; return 'take'; }
],
orders
[;
Take: "~What,~ says Dan, ~ you want me to take ",
(the) noun, "?~";
Drop: "~What,~ says Dan, ~ you want me to drop ",
(the) noun, "?~";
Inv: "~That I can do,~ says Dan. ~I'm empty-handed.~";
default: "~Don't know how,~ says Dan.";
],
initial "Dyslexic Dan is here.",
has animate proper crewmember;
[ PrintTime x;
print (x/60), ":", (x%60)/10, (x%60)%10;
];
Object -> "alarm clock"
with name "alarm" "clock", article "an",
number 480,
description
[; print "The alarm is ";
if (self has general) print "on, "; else print "off, but ";
"the clock reads ", (PrintTime) the_time,
" and the alarm is set for ", (PrintTime) self.number, ".";
],
react_after
[; Inv: if (self in player) { new_line; <<Examine self>>; }
Look: if (self in location) { new_line; <<Examine self>>; }
],
daemon
[; if (the_time >= self.number && the_time <= self.number+3
&& self has general) "^Beep! Beep! The alarm goes off.";
],
grammar
[; return 'alarm,';
],
orders
[; SwitchOn: give self general; StartDaemon(self); "~Alarm set.~";
SwitchOff: give self ~general; StopDaemon(self);
"~Alarm cancelled.~";
SetTo: self.number=noun; <<Examine self>>;
default: "~Commands are on, off or a time of day only, pliz.~";
],
life
[; Ask, Answer, Tell:
"[Try ~clock, something~ to address the clock.]";
],
has talkable;
! --------------------------------------------------------------------------
Object Blakes_Seven "Spaceship Liberator: Bridge"
has light,
with description
"The great serried bridge of the alien spaceship Liberator,
captured by Blake's group of revolutionary criminals on the
run from the oppressive Earth Federation. (Don't worry --
it's just a convincing replica, and the museum still lies
back north.)",
n_to Grammar_Hall;
Object -> "informative plaque"
with name "informative" "plaque",
article "an",
description
"[Among the commands which Zen was often given by the hard-pressed
Liberator crew were:^^
zen, scan 360 orbital^
zen, speed standard by six^
zen, clear the neutron blasters for firing^
zen, raise the force wall^
zen, set course for centauro]",
has static;
Object -> "Zen"
with name "zen" "flight" "computer",
initial
"Square lights flicker unpredictably across a hexagonal fascia
on one wall, indicating that the flight computer Zen is on-line.",
grammar
[; return -'zen,';
],
orders
[; Show: "The main screen shows a starfield,
turning through ", noun, " degrees.";
Go: "~Confirmed.~ The ship turns to a new bearing.";
SetTo: if (noun==0) "~Confirmed.~ The ship comes to a stop.";
if (noun>12) "~Standard by ", (number) noun,
" exceeds design tolerances.~";
"~Confirmed.~ The ship's engines step to
standard by ", (number) noun, ".";
Take: if (noun~=force_wall) "~Please clarify.~";
"~Force wall raised.~";
Drop: if (noun~=blasters) "~Please clarify.~";
"~Battle-computers on line.
Neutron blasters cleared for firing.~";
NotUnderstood: "~Language banks unable to decode.~";
default: "~Information. That function is unavailable.~";
],
has talkable proper static;
Object -> -> force_wall "force wall" with name "force" "wall" "shields";
Object -> -> blasters "neutron blasters" with name "neutron" "blasters";
! --------------------------------------------------------------------------
Object "Captain Picard"
with name "captain" "picard",
has proper animate crewmember;
Object Star_Trek "10 Forward"
has light,
with description
"The starswept observation lounge forward of deck 10
of the Starship Enterprise, where many milkshakes have
been consumed in crisis situations. (It's only a replica,
of course, and the museum lies back @01.)",
w_to Grammar_Hall;
Object -> "informative plaque"
with name "informative" "plaque",
article "an",
description
"[The computer, called just ~computer~, is useful for locating
crew-members: try ~computer, where is commander data~, or
~...captain picard~, or any of the other people who can be
found in the Museum.^^
The tricorder will scan something if you tell it the name of
whom or what you wish to scan.^^
The replicator is a superior drinks machine: for instance,
Captain Picard is fond of saying ~replicator, tea earl grey~.
There's also brandy and distilled water.]",
has static;
Object -> "computer"
with name "computer",
initial "The computer, of course, always responds to your voice here.",
grammar
[; return 'stc,';
],
orders
[; Examine:
if (parent(noun)==0)
"~", (name) noun,
" is no longer aboard this demonstration game.~";
"~", (name) noun, " is in ", (name) parent(noun), ".~";
default: "The computer's only really good for locating the crew.";
],
life
[; Ask, Answer, Tell: "The computer is too simple.";
],
has talkable static;
Object -> "tricorder"
with name "tricorder",
grammar
[; return 'tc,';
],
orders
[; Examine: if (noun==player) "~You radiate life signs.~";
print "~", (The) noun, " radiates ";
if (noun hasnt animate) print "no ";
"life signs.~";
default: "The tricorder bleeps. It can only accept commands
~tricorder, <something>~.";
],
life
[; Ask, Answer, Tell: "The tricorder is too simple.";
],
has talkable;
Object -> "replicator"
with name "replicator",
initial
"A replicator (i.e. Star Trek drinks machine) occupies a niche
in one wall.",
grammar
[; return 'rc,';
],
orders
[; Give:
"The replicator serves up a cup of ",
(name) noun, " which you drink eagerly.";
default: "The replicator is unable to oblige. You must give
it the name of a drink it knows about.";
],
life
[; Ask, Answer, Tell: "The replicator has no conversation skill.";
],
has talkable static;
Object -> -> "Earl Grey tea" with name "earl" "grey" "tea";
Object -> -> "Aldebaran brandy" with name "aldebaran" "brandy";
Object -> -> "distilled water" with name "distilled" "water";
! --------------------------------------------------------------------------
Object "Sealed Room"
with description
"I'm in a sealed room, like a squash court without a door,
maybe six or seven yards across",
has light;
Object -> "fish" with name "fish";
Key -> "cadmium key"
with name "cadmium",
after
[; Drop: remove self; "The key smashes into smithereens!";
];
Object -> martha "Martha"
has animate female concealed proper crewmember
with name "martha",
orders
[ r; r=parent(self);
Give:
if (noun notin r) "~That's beyond my telekinesis.~";
if (noun==self) "~Teleportation's too hard for me.~";
move noun to player;
"~Here goes...~ and Martha's telekinetic talents
magically bring ", (the) noun, " to your hands.";
Look:
print "~", (string) r.description;
if (children(r)==1) ". There's nothing here but me.~";
print ". I can see ";
WriteListFrom(child(r),CONCEAL_BIT+ENGLISH_BIT);
".~";
default: "~Afraid I can't help you there.~";
],
life
[; Ask: "~You're on your own this time.~";
Tell: "Martha clucks sympathetically.";
Answer: "~I'll be darned,~ Martha replies.";
];
! ==========================================================================
Object Third_Floor "Third Floor"
with name "trapdoor",
description
"Atop the marble staircase, this third floor
foyer fans out into Rooms from Chapter V. These run:^
^ south to Corridor 22 (inventories)
and the List Property Office,
^ @00 to Room 24 (Curious Names),
^ @01 to Room 28, which is divided by a glass window.^
^Only a very rickety
ladder goes further up, through an open trapdoor to the roof.",
d_to Second_Floor, u_to roof,
e_to Room24, w_to window_w, s_to Corridor22,
has light;
Object -> "map"
with name "map" "third" "floor",
initial "A map of the third floor is embossed in one wall.",
description
[; font off;
print
"^+------------------------------------------+
^| |
^| (glass |
^| window) |
^| ! |
^| Room ! 28 --- Stairs --- Room 24 |
^| ! (you are here) Names |
^| | | |
^| | Museum Cafe |
^| Corridor 22 |
^| (Inventories) |
^| / | @@92 |
^| / | @@92 |
^| Room 23 W --- Room 23 --- Room 23 E |
^| (listing List Property (I Ching) |
^| machine) Office |
^+------------------------------------------+^";
font on;
],
has static;
Object -> "Lexicon"
with name "lexicon",
initial
"On the top step is a discarded Lexicon of verbs.",
description
"(The lexicon has the number 27 written on the spine.)^^
Inside are many familiar verbs that you regularly use
when navigating through Inform games. There are also
some special ones, only available in the Museum...^^
~megalook~ : like ~look~ but much fuller;^
~threefold <noun> <noun> <noun>~ : this doesn't
actually do anything, but it shows how a verb can
be parsed which has three objects, not just 0 to 2
as usual;^
~time <time of day>~ : sets the current time of day
(go out onto the Balcony to see sunrise at 6 AM);^
~fp <floating-point number>~ : shows how floating-point
numbers can be parsed;^
~dial <phone-style number>~ : likewise phone numbers.^^
Also, in the Museum, ~lock~ and ~unlock~ are cunningly
able to presume keys as their second objects.";
! --------------------------------------------------------------------------
Object Corridor22 "Corridor 22"
with description
"Runs south of the top floor foyer, and leads to Room 23,
such a long room that you can enter it to southwest, south
or southeast.^^
In the floor is a curious solid quartz window.",
n_to Third_Floor,
s_to Room23, se_to Room23b, sw_to Room23a,
d_to "Solid quartz.",
has light;
Object -> "quartz window"
with name "quartz" "window",
before
[; Examine, Search, LookUnder:
print "Through the window you can hazily make out the contents
of the Grammar Hall below...^";
if (Locale(Grammar_Hall, "You can see",
"You can also see")~=0)
" on the floor below.";
rtrue;
],
has scenery;
Object -> "Geoffrey's book"
with name "book" "old" "harmless" "lethal" "of" "geoffrey^s",
invent "that harmless old book of Geoffrey's",
before
[; Examine:
self.invent = "that lethal old book of Geoffrey's";
"The apparently harmless book turns fiery hot in your hands,
and your eyes are dragged toward the hideous sigils
inscribed within it... Just in time, you break the gorgon
gaze and look away.^^
[From this moment, its inventory entry changes.]";
],
has proper;
Object -> "platinum pyramid"
with name "platinum" "pyramid",
description "No matter how many times you pick this up and put it
down again, it never becomes an ~ordinary~ object for room
description purposes -- it always has a line to itself.",
describe
[; "^The platinum pyramid catches the light beautifully.";
];
Object -> "ornate box"
with name "decorated" "ornate" "box",
invent
[; if (inventory_stage==1) give self general;
else give self ~general;
],
short_name
[; if (self has general) { print "box"; rtrue; } ],
article
[; if (self has general)
{ print "that most remarkably decorated"; rtrue;
}
else print "an"; ],
description
"[What's interesting about the ornate box is that its
inventory listing overrides its short name entirely,
and yet its contents will still be inventoried.]",
has open openable container;
Object -> -> "pearl"
with name "pearl",
description "Don't look at me - I'm irrelevant.";
! --------------------------------------------------------------------------
Object Room23a "Room 23 @01: Inventory Annexe"
with description
"The @01ern end of Room 23 is a housing for the Listing Machine.",
e_to Room23, ne_to Corridor22,
has light;
Object -> list_machine "listing machine"
with name "listing" "list" "machine",
describe
[ i; print "The listing machine has a go button and a number of
switches, whose current settings are as follows:^";
objectloop (i in self)
{ if (i~=list_go)
{ print (address) (i.&name)-->0, " ";
if (i has on) print "(on)^"; else print "(off)^";
}
}
rtrue;
],
has transparent static;
Object -> -> list_go "go button"
with name "go" "button" "control",
before
[ i j; Push:
objectloop (i in list_machine)
if (i~=self && i has on) j=j+i.number;
print "~In this style, your inventory is listed as
follows...^";
WriteListFrom(child(player), j, 1);
"...~";
],
has static;
Class BitSwitch
with name "switch" "control",
has switchable static;
BitSwitch -> -> "newline switch"
with name "newline", number NEWLINE_BIT;
BitSwitch -> -> "indent switch"
with name "indent", number INDENT_BIT;
BitSwitch -> -> "fullinv switch"
with name "fullinv", number FULLINV_BIT, has on;
BitSwitch -> -> "english switch"
with name "english", number ENGLISH_BIT, has on;
BitSwitch -> -> "recurse switch"
with name "recurse", number RECURSE_BIT, has on;
BitSwitch -> -> "always switch"
with name "always", number ALWAYS_BIT;
BitSwitch -> -> "terse switch"
with name "terse", number TERSE_BIT;
BitSwitch -> -> "partinv switch"
with name "partinv", number PARTINV_BIT;
BitSwitch -> -> "defart switch"
with name "defart", number DEFART_BIT;
BitSwitch -> -> "workflag switch"
with name "workflag", number WORKFLAG_BIT;
BitSwitch -> -> "isare switch"
with name "isare", number ISARE_BIT;
BitSwitch -> -> "conceal switch"
with name "conceal", number CONCEAL_BIT;
! --------------------------------------------------------------------------
[ CoinsTogether cla i x y;
objectloop (i ofclass cla)
{ x=parent(i);
if (y==0) y=x; else { if (x~=y) return 0; }
}
return y;
];
[ Face x; if (x.number==1) print "Heads"; else print "Tails"; ];
Array gold_trigrams --> "fortune" "change" "river flowing" "chance"
"immutability" "six stones in a circle"
"grace" "divine assistance";
Array silver_trigrams --> "happiness" "sadness" "ambition" "grief"
"glory" "charm" "sweetness of nature"
"the countenance of the Hooded Man";
[ Trigram cla i k state;
objectloop (i ofclass cla)
{ print (Face) i; if (k++<2) print ","; print " ";
state=state*2 + (i.number-1);
}
if (cla == GoldCoin) i=gold_trigrams; else i=silver_trigrams;
print "(", (string) i-->state, ")";
];
[ CoinsLT cla k i c;
if (inventory_stage==1)
{ if (cla == GoldCoin) print "the gold"; else print "the silver";
print " coins ";
k=CoinsTogether(cla);
if (k==location || k has supporter)
{ objectloop (i ofclass cla)
{ print (name) i;
switch(++c)
{ 1: print ", "; 2: print " and ";
3: print " (showing the trigram ", (Trigram) cla, ")";
}
}
rtrue;
}
c_style = c_style | (ENGLISH_BIT+NOARTICLE_BIT);
if (c_style & NEWLINE_BIT ~= 0) c_style = c_style - NEWLINE_BIT;
if (c_style & INDENT_BIT ~= 0) c_style = c_style - INDENT_BIT;
}
rfalse;
];
Class Coin
with number 1, article "the",
parse_name
[ i j w;
if (parser_action==##TheSame) return -2;
w='gold'; if (self ofclass SilverCoin) w='silver';
for (::i++)
{ j=NextWord();
if (j=='coins') parser_action=##PluralFound;
else if (j~='coin' or w or self.name) return i;
}
],
after
[ j;
Drop, PutOn:
self.number=random(2); print (Face) self, ". ";
if (self ofclass GoldCoin) j=GoldCoin; else j=SilverCoin;
if (CoinsTogether(j)~=0)
{ print "The ";
if (j == GoldCoin) print "gold"; else print "silver";
" trigram is now ", (Trigram) j, ".";
}
new_line; rtrue;
];
Class GoldCoin class Coin
with list_together [; return CoinsLT(GoldCoin); ];
Class SilverCoin class Coin
with list_together [; return CoinsLT(SilverCoin); ];
Object Room23b "Room 23 @00: Chinese Room"
with description "A small, well-composed Chinese room for meditation,
through which ~a wind can blow~. (But only if it blows from
@01 back to north@01, because they're the only exits.)
From each cornice of the ceiling, a cherub looks down.",
w_to Room23, nw_to Corridor22,
has light;
Object -> "Chinese scroll"
with name "chinese" "scroll" "instructions",
initial "A scroll hangs on one wall.",
description
"Instructing you in the arts of the I Ching, the scroll advises
you to throw the two trigrams of gold and silver coins, that
you may find wisdom in the result.";
GoldCoin -> "goat" with name "goat";
GoldCoin -> "deer" with name "deer";
GoldCoin -> "chicken" with name "chicken";
SilverCoin -> "robin" with name "robin";
SilverCoin -> "snake" with name "snake";
SilverCoin -> "bison" with name "bison";
Global cherub_warning_given;
Class Cherub
with parse_name
[ i j flag;
for (flag=1:flag==1:)
{ flag=0;
j=NextWord();
if (j=='cherub' || j==self.name) flag=1;
if (j=='cherubs')
{ parser_action=##PluralFound; flag=1;
if (cherub_warning_given==0)
print "(I'll let this go,
but the plural of ~cherub~ is ~cherubim~.)^";
cherub_warning_given = true;
}
if (j=='cherubim')
{ parser_action=##PluralFound; flag=1; }
i++;
}
return i-1;
],
has scenery;
Cherub -> "northeast cherub" with name "northeast";
Cherub -> "southeast cherub" with name "southeast";
Cherub -> "northwest cherub" with name "northwest";
Cherub -> "southwest cherub" with name "southwest";
! --------------------------------------------------------------------------
Object Room23 "Room 23: List Property Office"
with description
"This the List Property Office (it seems that an ~O~
was lost some time ago), at the southern end of the top floor;
the management have kindly provided a green baize table, while
the rest is presumably the work of patrons.^^
Room 23 continues @00 to @01.",
n_to Corridor22,
e_to Room23b,
w_to Room23a
has light;
Object -> "green baize table"
with name "green" "baize" "table"
has scenery supporter;
Class PlasticCutlery
with name "plastic" "cutlery", article "a plastic",
list_together
[; if (inventory_stage==1)
{ if (c_style & NOARTICLE_BIT == 0) c_style=c_style+NOARTICLE_BIT;
if (c_style & ENGLISH_BIT == 0) c_style=c_style+ENGLISH_BIT;
if (c_style & NEWLINE_BIT ~= 0) c_style=c_style-NEWLINE_BIT;
if (c_style & INDENT_BIT ~= 0) c_style=c_style-INDENT_BIT;
print "a plastic ";
}
];
PlasticCutlery -> "fork" with name "fork";
PlasticCutlery -> "knife" with name "knife";
PlasticCutlery -> "spoon" with name "spoon";
Class Hat with list_together "hats", name "hat" "hats", has clothing;
Hat -> "fez" with name "fez";
Hat -> "Panama" with name "panama";
Hat -> "sombrero" with name "sombrero";
Class Letter
with list_together
[; if (inventory_stage==1)
{ print "the letters ";
c_style = c_style | (ENGLISH_BIT+NOARTICLE_BIT);
if (c_style & NEWLINE_BIT ~= 0) c_style = c_style - NEWLINE_BIT;
if (c_style & INDENT_BIT ~= 0) c_style = c_style - INDENT_BIT;
}
else print " from a Scrabble set";
],
short_name
[; if (listing_together ofclass Letter) rfalse;
print "letter ", (object) self, " from a Scrabble set"; rtrue;
],
article "the";
Letter -> "X" with name "x";
Letter -> "Y" with name "y";
Letter -> "Z" with name "z";
Letter -> "P" with name "p";
Letter -> "Q" with name "q";
Letter -> "R" with name "r";
Object -> "defrosting Black Forest gateau"
with name "black" "forest" "gateau" "cake",
has edible;
Object -> "Punch magazine"
with name "punch" "magazine",
description
"Five years out of date by the cover, a hundred by the contents.",
list_together 1,
has proper;
Object -> "issue of the Spectator"
with name "spectator" "issue" "magazine", article "a recent",
description
"Up to date by the cover, a nightmare view of the future within.",
list_together 1;
Object -> "die"
with name "die" "dice",
after [; Drop: print "It comes up ", random(6); "!"; ];
Class Star
with name "star",
description
"A little star of precious-metal, perhaps exotic currency.",
parse_name
[ i j w;
if (parser_action==##TheSame)
{ if ((parser_one.&name)-->0 == (parser_two.&name)-->0) return -1;
return -2;
}
w=(self.&name)-->0;
for (::i++)
{ j=NextWord();
if (j=='stars') parser_action=##PluralFound;
else if (j~='star' or w) return i;
}
],
list_together "stars",
plural
[; print (address) (self.&name)-->0;
if (~~(listing_together ofclass Star)) print " stars";
],
short_name
[; if (listing_together ofclass Star)
{ print (address) (self.&name)-->0; rtrue; }
],
article
[; if (listing_together ofclass Star) print "one"; else print "a";
];
Class GoldStar class Star with name "gold";
Class SilverStar class Star with name "silver";
Class BronzeStar class Star with name "bronze";
SilverStar -> "silver star";
SilverStar -> "silver star";
SilverStar -> "silver star";
SilverStar -> "silver star";
BronzeStar -> "bronze star";
GoldStar -> "gold star";
GoldStar -> "gold star";
GoldStar -> "gold star";
! --------------------------------------------------------------------------
Object Room24 "Curious Names"
with description
"This is Room 24, @00 of the mezzanine. The exhibits are
packed in here, but fortunately there's a plaque making
some sense of it all.",
w_to Third_Floor, s_to Museum_Cafe,
has light;
Object -> plaque "plaque"
with name "plaque",
description
"Room 24 Plaque^^
Princess is capable of a startling change of name when kissed.^^
The genie's lamp, when rubbed, may make alarming things
happen to your ability to refer to the colours ~black~ and
~white~. The stones may help you to experiment with this.^^
Carrying the magnifying glass allows you to ~magnify~ things.^^
The game's parser has been specially programmed for the
fly in amber object, so that ~put the fly in amber in box~
will work correctly (and not be interpreted as ~put (the fly) in
(amber in box)~).",
has scenery;
Object -> genies_lamp "genie's lamp"
with name "lamp",
before
[; Rub:
if (self hasnt general) give self general;
else give self ~general;
"A genie appears from the lamp, declaring:^^
~Mischief is my sole delight:^
If white means black, black means white!~";
];
Object -> "white stone" with name "white" "stone";
Object -> "black stone" with name "black" "stone";
Object -> "fly in amber" with name "fly" "amber";
Object -> magnifier "magnifying glass"
with name "glass" "magnifying" "magnifier" "lense",
description "Using this, you can ~magnify~ things.";
[ MagnifySub;
if (magnifier notin player)
"You're not holding a magnifying glass.";
if (noun==magnifier) "Light is not so flexible as that.";
print "You can just make out that ", (the) noun,
" is inscribed as being ~object ", noun, "~.^";
if (magnifier hasnt general)
{ give magnifier general;
"^(When you're carrying the magnifier, you can refer to
things by their numbers like this; and you can even use
# to mean ~any single object~ and * to mean ~all objects~.)";
}
];
[ ParseNoun obj;
if (magnifier notin player) return -1;
if (NextWord() == 'object' && TryNumber(wn) == obj) return 2;
wn--;
if (WordLength(wn)==1 && WordAddress(wn)->0 == '#') return 1;
if (WordLength(wn)==1 && WordAddress(wn)->0 == '*')
{ parser_action = ##PluralFound; return 1; }
return -1;
];
Object -> "/?%?/ (the artiste formally known as Princess)"
with name "princess" "artiste" "formally" "known" "as",
description "You somehow feel it would be appropriate
to kiss Princess.",
short_name
[; if (self hasnt general) { print "Princess"; rtrue; }
],
react_before
[; Listen: print_ret (name) self, " sings a soft siren song.";
],
initial
[; print_ret (name) self, " is singing softly.";
],
parse_name
[ x n; if (self hasnt general)
{ if (NextWord()=='princess') return 1;
return 0;
}
x=WordAddress(wn);
if ( x->0 == '/' && x->1 == '?' && x->2 == '%'
&& x->3 == '?' && x->4 == '/')
{ while (wn<=parse->1 && WordAddress(wn++)<x+5) n++;
return n;
}
return -1;
],
life
[; Kiss: give self general; self.life = NULL;
"In a fairy-tale transformation, the Princess
steps back and astonishes the world by announcing
that she will henceforth be known as ~/?%?/~.";
],
has animate proper female;
! --------------------------------------------------------------------------
Object Museum_Cafe "Room 24 Annexe: The Museum Cafe"
with description
"Very much a self-service refreshments area, which
somehow cunningly continues the exhibition from the north.",
n_to Room24,
has light;
Object -> "upright fridge"
with name "upright" "fridge",
initial "There is an upright fridge in one corner.",
after
[; Open:
print
"On the inside of the door is a note to the effect
that the pepper is a standardly-named Inform object
and can be called ~green~, ~pepper~, ~green pepper~,
~pepper green~, etc.;
whereas, in the case of the red tomato, ~red~ and
~tomato fried red~, etc., will not be allowed.^^";
<<Search self>>;
],
has openable container static;
Object -> -> "green pepper"
with name "green" "pepper",
has edible;
Object -> -> "red fried tomato"
with name "red" "pepper",
parse_name
[ i w; w=NextWord();
while (w=='red' or 'fried')
{ w=NextWord(); i++;
}
if (w=='tomato') return i+1;
return 0;
],
has edible;
Object -> "drinks machine"
with name "drinks" "machine",
initial
"Next to the fridge is a drinks machine with buttons
for Cola, Coffee and Tea.",
has static transparent;
Object -> -> "drinks machine button"
has scenery
with parse_name
[ i flag type;
for (: flag == 0: i++)
{ flag = 1;
switch(NextWord())
{ 'button', 'for': flag = 0;
'coffee': if (type == 0) { flag = 0; type = 1; }
'tea': if (type == 0) { flag = 0; type = 2; }
'cola': if (type == 0) { flag = 0; type = 3; }
}
}
if (type==drink.number && i==2 && type~=0 && drink in player)
return 0;
self.number=type; return i-1;
],
number 0,
before
[; Push, SwitchOn:
if (self.number == 0)
"You'll have to say which button to press.";
if (parent(drink) ~= 0) "The machine's broken down.";
drink.number = self.number; move drink to player; itobj = drink;
"Whirr! The machine puts ", (a) drink, " into your
glad hands.";
Attack: "The machine shudders and squirts cola at you.";
Drink: "You can't drink until you've worked the machine.";
];
Object drink "drink"
with parse_name
[ i flag type;
for (: flag == 0: i++)
{ flag = 1;
switch(NextWord())
{ 'drink', 'cup', 'of': flag = 0;
'coffee': if (type == 0) { flag = 0; type = 1; }
'tea': if (type == 0) { flag = 0; type = 2; }
'cola': if (type == 0) { flag = 0; type = 3; }
}
}
if (type ~= 0 && type ~= self.number) return 0;
return i-1;
],
short_name
[; print "cup of ";
switch (self.number)
{ 1: print "coffee"; 2: print "tea"; 3: print "cola"; }
rtrue;
],
number 0,
before
[; Drink: remove self;
"Ugh, that was awful. You crumple the cup and responsibly
dispose of it.";
];
! --------------------------------------------------------------------------
Class WindowRoom
with description
[; print "This is one end of a long east/west room. ";
if (self==window_w) "An exit leads back @00.";
"There appears to be no way in or out at this end.";
],
before
[; Examine, Search: ;
default:
if (inp1~=1 && noun~=0 && noun in self.far_side)
print_ret (The) noun, " is on the far side of
the glass.";
if (inp2~=1 && second~=0 && second in self.far_side)
print_ret (The) second, " is on the far side of
the glass.";
],
after
[; Look:
if (ggw has general) rfalse;
print "^The room is divided by a great glass window";
if (location.far_side hasnt light) " onto darkness.";
print ", stretching from floor to ceiling.^";
if (Locale(location.far_side,
"Beyond the glass you can see",
"Beyond the glass you can also see")~=0) ".";
],
has light;
WindowRoom window_w "Room 28: @01 of Window"
with e_to Third_Floor, w_to "The window is in your way.",
far_side window_e;
Object -> "plastic cup"
with name "plastic" "cup";
WindowRoom window_e "Room 28: @00 of Window"
with far_side window_w;
Key -> "bronze key"
with name "bronze";
Object -> "golden chalice"
with name "golden" "chalice" "cup" "grail" "holy";
Object ggw "great glass window"
with name "great" "glass" "window",
before
[ place; Examine, Search: place=location;
if (place.far_side hasnt light)
"The other side is dark.";
print "The view through the window:^";
give self general;
PlayerTo(place.far_side,1); <Look>; PlayerTo(place,1);
give self ~general;
give place.far_side ~visited; rtrue;
],
found_in window_w window_e,
has scenery;
! ==========================================================================
Object roof "Museum Roof: area 33"
with name "trapdoor",
description
"A small trapdoor leads down from this tiled roof into the
museum. The view is indescribable, which saves me some typing
and you some reading, right? Yes -- this is one of those
post-modern room descriptions, the kind that makes you aware
you're only playing a game.",
d_to Third_Floor,
has light;
Global status_style = 3;
Object -> "dial"
with name "dial",
initial
"A dial here has four settings, which control the appearance
of the status line drawn by the computer to indicate the
state of play. Settings are: 1 - invisible; 2 - centred
place name only; 3 - standard Score/Turns display;
4 - a compass rose of possible directions to go in.",
before
[; SetTo:
if (second<1 || second>4) "There are only four settings.";
status_style = second; "Set.";
],
has static;
! --------------------------------------------------------------------------
[ Initialise;
location = Foyer; move samples_bag to player;
thedark.short_name = "An odd-smelling darkness";
thedark.initial = GoMothGo;
NormalWorld(); lookmode=2;
SetTime(SUNRISE-10,1);
"^^^^^Welcome indeed to the...^";
];
[ InScope actor;
if (actor==martha) PlaceInScope(player);
if (actor==player && scope_reason==TALKING_REASON && player in booth)
PlaceInScope(martha);
if (location==window_w && window_e has light)
ScopeWithin(window_e);
if (location==window_e && window_w has light)
ScopeWithin(window_w);
rfalse;
];
[ BeforeParsing i j;
for (i=parse->1,j=2:j<i:j++)
{ wn=j-1;
if (NextWord()=='fly' && NextWord()=='in' && NextWord()=='amber')
parse-->(j*2-1) = 'fly';
}
if (genies_lamp hasnt general) return;
for (wn=1::)
{ switch(NextWordStopped())
{ 'white': parse-->(wn*2-3) = 'black';
'black': parse-->(wn*2-3) = 'white';
-1: return;
}
}
];
! --------------------------------------------------------------------------
Constant U_POS 28; Constant W_POS 30; Constant C_POS 31;
Constant E_POS 32; Constant IN_POS 34;
Array printed_text table 64;
[ DrawStatusLine j posa posb width;
if (location==0) rfalse;
width = 0->33; if (width==0) width=80;
switch(status_style)
{ 1: @split_window 0;
2: font off;
@split_window 1; @buffer_mode 0; @set_window 1;
style reverse; @set_cursor 1 1; spaces width;
printed_text-->0 = 64;
@output_stream 3 printed_text;
print (name) location;
@output_stream -3;
j=(width-(printed_text-->0))/2;
@set_cursor 1 j; print (name) location; spaces(j-1);
style roman;
@buffer_mode 1; @set_window 0; font on;
3: @split_window 1; @set_window 1; @set_cursor 1 1; style reverse;
posa = width-26; posb = width-13;
spaces width;
@set_cursor 1 2; print (name) location;
if (width > 76)
{ @set_cursor 1 posa; print "Score: ", sline1;
@set_cursor 1 posb; print "Moves: ", sline2;
}
if (width > 63 && width <= 76)
{ @set_cursor 1 posb; print sline1, "/", sline2;
}
@set_cursor 1 1; style roman; @set_window 0;
4: if (e_obj.door_dir~=e_to)
{ @split_window 1; @set_window 1; style reverse; font off;
@set_cursor; spaces width;
print "You're very disoriented in this reflected world";
@set_cursor 1 1; style roman; @set_window 0; font on;
rfalse;
}
@split_window 3; @set_window 1; style reverse; font off;
@set_cursor 1 1; spaces width;
@set_cursor 2 1; spaces width;
@set_cursor 3 1; spaces width;
@set_cursor 1 2; print (name) location;
@set_cursor 1 51; print "Score: ", sline1;
@set_cursor 1 64; print "Moves: ", sline2;
if (location ~= thedark)
{ ! First line
if (location.u_to ~= 0) { @set_cursor 1 U_POS; print "U"; }
if (location.nw_to ~= 0) { @set_cursor 1 W_POS; print "@@92"; }
if (location.n_to ~= 0) { @set_cursor 1 C_POS; print "@@124"; }
if (location.ne_to ~= 0) { @set_cursor 1 E_POS; print "/"; }
if (location.in_to ~= 0) { @set_cursor 1 IN_POS; print "I"; }
! Second line
if (location.w_to ~= 0) { @set_cursor 2 W_POS; print "-"; }
@set_cursor 2 C_POS; print "o";
if (location.e_to ~= 0) { @set_cursor 2 E_POS; print "-"; }
! Third line
if (location.d_to ~= 0) { @set_cursor 3 U_POS; print "D"; }
if (location.sw_to ~= 0) { @set_cursor 3 W_POS; print "/"; }
if (location.s_to ~= 0) { @set_cursor 3 C_POS; print "@@124"; }
if (location.se_to ~= 0) { @set_cursor 3 E_POS; print "@@92"; }
if (location.out_to ~= 0){ @set_cursor 3 IN_POS; print "O"; }
}
@set_cursor 1 1; style roman; @set_window 0; font on;
}
];
! --------------------------------------------------------------------------
Include "Grammar";
! --------------------------------------------------------------------------
[ FPXSub;
"You typed the floating point number ", noun/100, ".",
(noun%100)/10, noun%10, " (rounded off to 2 decimal places.)";
];
[ DigitNumber n type x;
x = NextWordStopped(); if (x==-1) return -1; wn--;
if (type==0)
{ x = WordAddress(wn);
if (x->n>='0' && x->n<='9') return (x->n) - '0';
return -1;
}
if (x=='nought' or 'oh') { wn++; return 0; }
x = TryNumber(wn++); if (x==-1000 || x>=10) x=-1; return x;
];
[ FloatingPoint a x b w d1 d2 d3 type;
a = TryNumber(wn++);
if (a==-1000) return -1;
w = NextWordStopped(wn); if (w==-1) return a*100;
x = NextWordStopped(wn); if (x==-1) return -1; wn--;
if (w=='point') type=1;
else
{ if (WordAddress(wn-1)->0~='.' || WordLength(wn-1)~=1)
return -1;
}
d1 = DigitNumber(0,type);
if (d1==-1) return -1;
d2 = DigitNumber(1,type); d3 = DigitNumber(2,type);
b=d1*10; if (d2>=0) b=b+d2; else d3=0;
if (type==1)
{ x=1; while (DigitNumber(x,type)>=0) x++; wn--;
}
else wn++;
parsed_number = a*100 + b;
if (d3>=5) parsed_number++;
return 1;
];
Verb "fp" * FloatingPoint -> FPX;
! --------------------------------------------------------------------------
Constant MAX_PHONE_LENGTH 30;
Array dialled_number string MAX_PHONE_LENGTH;
[ PhoneNumber f a l ch pp i;
pp=1; if (NextWordStopped()==-1) return 0;
do
{ a=WordAddress(wn-1); l=WordLength(wn-1);
for (i=0:i<l:i++)
{ ch=a->i;
if (ch<'0' || ch>'9')
{ if (ch~='-') { f=1; if (i~=0) return -1; } }
else
{ if (pp<MAX_PHONE_LENGTH)
dialled_number->(pp++)=ch-'0';
}
}
} until (f==1 || NextWordStopped()==-1);
if (pp==1) return -1;
dialled_number->0 = pp-1;
return 0;
];
[ DialPhoneSub i;
print "You dialled <";
for (i=1:i<=dialled_number->0:i++) print dialled_number->i;
">";
];
Verb "dial" * PhoneNumber -> DialPhone;
! --------------------------------------------------------------------------
Global assumed_key;
[ DefaultLockSub;
print "(with ", (the) assumed_key, ")^"; <<Lock noun assumed_key>>;
];
[ DefaultUnlockSub;
print "(with ", (the) assumed_key, ")^"; <<Unlock noun assumed_key>>;
];
[ DefaultKeyTest i count;
if (noun hasnt lockable) rfalse;
objectloop (i in player && i ofclass Key)
{ count++; assumed_key = i; }
if (count==1) rtrue; rfalse;
];
Extend "lock" first * noun = DefaultKeyTest -> DefaultLock;
Extend "unlock" first * noun = DefaultKeyTest -> DefaultUnlock;
! --------------------------------------------------------------------------
Constant TWELVE_HOURS 720;
[ NumericTime hr mn word x;
if (hr>=24) return -1;
if (mn>=60) return -1;
x=hr*60+mn; if (hr>=13) return x;
x=x%TWELVE_HOURS; if (word=='pm') x=x+TWELVE_HOURS;
if (word~='am' or 'pm' && hr==12) x=x+TWELVE_HOURS;
return x;
];
[ MyTryNumber wordnum i j;
i=wn; wn=wordnum; j=NextWordStopped(); wn=i;
switch(j)
{ 'twenty-five': return 25;
'thirty': return 30;
default: return TryNumber(wordnum);
}
];
[ TimeOfDay i j k x flag loop ch hr mn;
i=NextWord();
if (i=='midnight') { parsed_number=0; return 1; }
if (i=='midday' or 'noon') { parsed_number=TWELVE_HOURS; return 1; }
! Next try the format 12:02
j=WordAddress(wn-1); k=WordLength(wn-1);
flag=0;
for (loop=0:loop<k:loop++)
{ ch=j->loop;
if (ch==':' && flag==0 && loop~=0 && loop~=k-1) flag=1;
else { if (ch<'0' || ch>'9') flag=-1; }
}
if (k<3 || k>5) flag=0;
if (flag==1)
{ for (loop=0:j->loop~=':':loop++, hr=hr*10)
hr=hr+j->loop-'0';
hr=hr/10;
for (loop++:loop<k:loop++, mn=mn*10)
mn=mn+j->loop-'0';
mn=mn/10;
j=NextWordStopped();
parsed_number=NumericTime(hr, mn, j);
if (parsed_number<0) return -1;
if (j~='pm' or 'am') wn--;
return 1;
}
! Next the format "half past 12"
j=-1; if (i=='half') j=30; if (i=='quarter') j=15;
if (j<0) j=MyTryNumber(wn-1); if (j<0) return -1;
if (j>=60) return -1;
k=NextWordStopped();
if ((k=='o^clock' or 'am' or 'pm')||(k==-1))
{ hr=j; if (hr>12) return -1; jump TimeFound; }
if (k=='to' or 'past')
{ mn=j; hr=MyTryNumber(wn);
if (hr<=0)
{ x=NextWordStopped();
if (x=='noon' or 'midday') hr=12;
if (x=='midnight') hr=0;
if (hr<0) return -1;
}
if (hr>=13) return -1;
if (k=='to') { mn=60-mn; hr=hr-1; if (hr==-1) hr=23; }
wn++; k=NextWordStopped();
jump TimeFound;
}
hr=j; mn=MyTryNumber(--wn);
if (mn<0 || mn>=60) return -1;
wn++; k=NextWordStopped();
.TimeFound;
parsed_number = NumericTime(hr, mn, k);
if (parsed_number<0) return -1;
if (k~='pm' or 'am' or 'o^clock') wn--;
return 1;
];
[ SetTheTimeSub;
SetTime(noun,1);
"The time is set to ", (PrintTime) noun, ".";
];
Verb "time" * TimeOfDay -> SetTheTime;
! --------------------------------------------------------------------------
Global third;
[ ThreefoldSub; "You do something involving ", (the) noun, ", ",
(the) second, " and ", (the) third, ".";
];
[ GhostObject x;
x=NounDomain(player,location,0);
if (x==REPARSE_CODE) return x;
if (x==0 or 1) return -1;
third = x;
return 0;
];
Verb "threefold" * noun noun GhostObject -> Threefold;
! --------------------------------------------------------------------------
[ MegaExam obj; print (a) obj, ": "; <Examine obj>; ];
[ MegaLookSub; <Look>; LoopOverScope(MegaExam); ];
Verb meta "megalook" * -> MegaLook;
! --------------------------------------------------------------------------
[ ClapSub; "You clap."; ];
Verb "clap" * -> Clap;
! --------------------------------------------------------------------------
Verb "magnify" * noun -> Magnify;
! --------------------------------------------------------------------------
Verb "alarm," * "on" -> SwitchOn
* "off" -> SwitchOff
* TimeOfDay -> SetTo
* ConTopic -> Inv;
Verb "tc," * noun -> Examine
* ConTopic -> Inv;
[ Crew i;
switch(scope_stage)
{ 1: rfalse;
2: objectloop (i has crewmember) PlaceInScope(i); rtrue;
}
];
Verb "stc," * "where" "is" scope=Crew -> Examine
* "locate" scope=Crew -> Examine;
Verb "rc," * held -> Give
* ConTopic -> Inv;
[ Planet;
switch(NextWord())
{ 'centauro', 'earth': return 1;
default: return -1;
}
];
Verb "zen," * "scan" number "orbital" -> Show
* "set" "course" "for" Planet -> Go
* "speed" "standard" "by" number -> SetTo
* "raise" held -> Take
* "clear" held "for" "firing" -> Drop;
! ----------------------------------------------------------------------------