bl791/IFDB / games /source /hugo /hugozork.hug
bl791's picture
download
raw
354 kB
!---------------------------------------------------------------------------
!
! HUGO ZORK
! A Hugo Port of Infocom's Zork I
! Zork I is copyright by Activision and is used without permission
! Source code written by John Menichelli
!
! Modified for Hugo v2.4, v2.5
! by K. Tessman
!---------------------------------------------------------------------------
#version 2.5 ! KT
! #set DEBUG ! include HugoFix library and grammar
#set VERBSTUBS ! include verb stub routines
#set USE_VEHICLES ! from OBJLIB.H
#set USE_ATTACHABLES !
#set NO_AUX_MATH ! don't need advanced math routines
#switches -ls ! print statistics to HZ.LST
!----------------------------------------------------------------------------
! NEW ACTION VERBS
!----------------------------------------------------------------------------
verb "board"
* (magic_boat) DoEnter
verb "launch"
* DoLaunch
verb "land"
* DoLand
verb "count"
* DoVague
* object DoCount
verb "fly"
* DoVague
* object DoFly
verb "ulysses", "odysseus"
* DoSailor
verb "lift"
* DoVague
* object DoLift
verb "jump"
* DoJump
verb "turn" "flip"
* DoVague
* object DoTurn
* object "with" xobject DoTurn
verb "find"
* DoVague
* object DoFind
verb "raise", "lift"
* DoVague
* object DoRaise
verb "lower"
* DoVague
* object DoLower
verb "ring"
* DoVague
* held DoRing
verb "burn", "light", "incinerate"
* DoVague
* object DoBurn
* object "with" xobject DoBurn
* object "with" held DoBurn
verb "extinguish" "douse"
* DoVague
* object DoExtinguish
verb "push", "shove"
* DoVague
* object "with" xobject DoPushWith
* "on" object DoPush
* object DoPush
verb "pump" "inflate"
* DoVague
* "up" object "with" xobject DoPump
* object "with" xobject DoPump
* "up" object DoPump
* object DoPump
verb "deflate"
* DoVague
* object DoDeflate
verb "poke" "puncture"
* DoVague
* object "with" xobject DoPoke
* object DoPoke
verb "patch" "repair" "glue"
* DoVague
* object "with" xobject DoPatch
* object DoPatch
verb "wind"
* "up" DoVague
* DoVague
* "up" object DoWind
* object DoWind
verb "dig", "burrow"
* DoVague
* "in"/"into" object DoDig
* object DoDig
* "in"/"into" object "with" xobject DoDig
* object "with" xobject DoDig
verb "throw", "hurl", "toss"
* held "in"/"into" xobject DoThrowIn
* DoVague
* held DoThrowAt
* held "at" xobject DoThrowAt
verb "go", "walk"
* "around" DoWalkAround
* "around" object DoWalkAround
* "on" object DoWalkOn
* "to"/"in"/"into"/"inside"/"through" object DoEnter
* "out" object DoGo
* "out"/"outside" DoExit
* object DoGo
verb "cross"
* DoVague
* object DoWalkOn
verb "kill", "murder", "fight"
* DoVague
* object DoHit
* object "with" held DoHit
verb "diagnose"
* DoDiagnose
verb "read" "skim" "peruse"
* DoVague
* "from" readable DoRead
* readable DoRead
verb "squeeze"
* DoVague
* object DoSqueeze
verb "echo"
* DoEcho
verb "treasure"
* DoTreasure
verb "temple"
* DoTemple
verb "pray"
* DoPray
verb "zork"
* DoZork
verb "xyzzy", "plugh"
* DoFool
verb "chomp", "barf"
* DoChomp
verb "win"
* DoWin
verb "repent"
* DoRepent
verb "bug"
* DoBug
verb "mumble", "sigh"
* DoMumble
verb "damn" "fuck" "shit"
* DoCurse
* object DoCurse
verb "frobozz"
* DoFrobozz
verb "smell", "sniff", "inhale", "breathe"
* DoVague
* object DoSmell
verb "molest" "rape"
* DoVague
* object DoMolest
verb "fill"
* DoVague
* object DoFill
verb "pour" "spill"
* DoVague
* object DoPour
* object "on" xobject DoPour
verb "touch", "feel", "rub"
* DoVague
* object DoTouch
verb "shake"
* DoVague
* object DoShake
verb "what"
* "is" object DoLook
verb "oil" "grease" "lubricate"
* DoVague
* object DoOil
* object "with" xobject DoOil
!----------------------------------------------------------------------------
! NEW NON-ACTION VERB
!----------------------------------------------------------------------------
xverb "help"
* DoHelp
* "me" DoHelp
#include "verblib.g" ! KT ! normal game grammar
!----------------------------------------------------------------------------
#ifset PRECOMPILED_LIBRARY
#link "hugolib.hlb"
#endif
#ifclear PRECOMPILED_LIBRARY
#include "hugolib.h" ! standard library routines
#endif
!----------------------------------------------------------------------------
!----------------------------------------------------------------------------
! NEW GLOBALS, PROPERTIES AND ATTRIBUTES
!----------------------------------------------------------------------------
global reservoir_status
global reservoir_level
global maint_room_level
global rank
global match_count
global ceremony_1
global ceremony_2
global candle_life
global hole_depth
global wound_level
global turns_to_heal
global current_hit_points
global max_hit_points
global lives_used
global current_threat_level
global old_threat_level
global dark_warning
global combat_result
global damage
global old_thief_location
property no_weapon
property knocked_out
property take_damage
property hit_points
property take_points ! for picking up treasure
property deposit_points ! for putting the treasure into the trophy case
property room_points ! for entering certain rooms
property threat_level ! 0 = Sword not glowing
! 1 = Sword is glowing faintly
! 2 = Sword is glowing brightly
attribute unconscious
attribute stunned
attribute disarmed
attribute burnable
attribute found
attribute deposited
attribute valuable
attribute room_scored
attribute heat_source
attribute broken
attribute thief_free
attribute water_location
attribute ghost
attribute hostile
attribute weapon
attribute sharp
!----------------------------------------------------------------------------
! INIT
!----------------------------------------------------------------------------
routine init
{
MAX_SCORE = 350
ranking[0] = "Beginner"
ranking[1] = "Amateur Adventurer"
ranking[2] = "Novice Adventurer"
ranking[3] = "Junior Adventurer"
ranking[4] = "Adventurer"
ranking[5] = "Master"
ranking[6] = "Wizard"
ranking[7] = "Master Adventurer"
counter = -1 ! 1 turn before turn 0
STATUSTYPE = 1 ! score/turns
TEXTCOLOR = WHITE
BGCOLOR = BLUE
SL_TEXTCOLOR = BLUE
SL_BGCOLOR = WHITE
FORMAT = NOINDENT_F + LIST_F
AFTER_PERIOD = " "
DEFAULT_FONT = PROP_ON ! KT
Font(DEFAULT_FONT)
prompt = ">"
color TEXTCOLOR, BGCOLOR
cls
"HUGO ZORK: The Great Underground Empire"
"A Port of Infocom's Zork I to Hugo"
"Beta Release 1"
"Hugo Zork written by John Menichelli"
"\"Zork I\" is copyright by Activision and is used without permission"
print BANNER
Font(BOLD_ON)
"(New players should type \"help\")"
Font(BOLD_OFF)
player = you
location = west_of_house
old_location = location
move player to location ! initialize player location
FindLight(location) ! whether the player can see
DescribePlace(location) ! the appropriate description
location is visited
CalculateHolding(player) ! total size of player contents
Activate(ChirpingBird) ! Displays "chirping bird" messages
Activate(HealPlayer) ! Heals player if injured
Activate(ThiefDaemon) ! Moves the thief around
reservoir_status = 1 ! 1 = reservoir full
! 2 = reservoir drained
! 3 = reservoir draining
! 4 = reservoir filling
reservoir_level = 9 ! reservoir is full
maint_room_level = 0 ! level of water in maintenance room
match_count = 5 ! For the matches in the Dam Lobby
score = 0
candle_life = 75 ! For the candles in the Altar Room
hole_depth = 0 ! At Sandy Cave
wound_level = 0 ! How wounded the character is
turns_to_heal = 0 ! How long it takes for the player
! to completely heal
current_hit_points = 2
max_hit_points = 2
lives_used = 0 ! Out of three
current_threat_level = 0 ! For the "glowing sword" messages
old_threat_level = 0
rank = 0 ! For scoring
dark_warning = 0 ! For the DarkWarning routine
}
#ifset PRECOMPILED_LIBRARY
replace main
{
#endif
#ifclear PRECOMPILED_LIBRARY
routine main
{
#endif
counter++
PrintStatusLine
run location.each_turn
runevents
RunScripts
if speaking not in location ! in case the character being spoken
speaking = 0 ! to leaves
}
player_character you "you"
{
long_desc
{
"That's difficult unless your eyes are prehensile."
}
before
{
actor
{
if not FindLight(location)
{
if (verbroutine = &DoGet or
verbroutine = &DoTouch) and
not Contains(player, object)
{
"It's too dark to see!"
return true
}
}
if player is not ghost
{
return false
}
elseif verbroutine = &DoScore
{
"You're dead! How can you think of your
score?"
return true
}
elseif verbroutine = &DoEat, &DoDrink, &DoOpen,
&DoClose, &DoTurn, &DoBurn, &DoTouch,
&DoExtinguish
{
"Even such an action is beyond your
capabilities."
return true
}
elseif verbroutine = &DoPump, &DoDeflate, &DoTie,
&DoUntie, &DoMove, &DoPull
{
"Even such an action is beyond your
capabilities."
return true
}
elseif verbroutine = &DoSwitchOn
{
"You need no light to guide you."
return true
}
elseif verbroutine = &DoInventory
{
"You have no possessions."
return true
}
elseif verbroutine = &DoDiagnose
{
"You are dead."
return true
}
elseif verbroutine = &DoLookAround, &DoLookIn,
&DoLookThrough, &DoLookUnder
{
if location is not light
{
"Although there is no light, the room
seems dimly illuminated."
return false
}
else
{
"The room looks strange and unearthly";
if children(location) > 1
{
" and objects appear
indistinct."
}
else
{
"."
}
return false
}
}
elseif verbroutine = &DoPray
{
if location = altar_room
{
"From the distance the sound of a
lone trumpet is heard. The room
becomes very bright and you feel
disembodied. In a moment, the brightness
fades and you find yourself rising as if
from a long sleep, deep in the woods. In
the distance you can faintly hear a
songbird and the sounds of the forest."
player is not ghost
player is not light
trap_door is special
Activate(ThiefDaemon)
MovePlayer(forest1)
}
else
{
"Your prayers are not heard."
return true
}
}
elseif verbroutine = &DoHit
{
"All such attacks are vain in your
condition."
return true
}
elseif verbroutine = &DoGet, &DoPush
{
"Your hand passes through the object."
return true
}
elseif verbroutine = &DoEnter
{
"You cannot enter in your condition."
return true
}
elseif verbroutine = &DoWait
{
"Might as well. You've got an eternity."
return true
}
else
{
return false
}
}
object DoFind
{
"You're around here somewhere..."
}
object DoGet
{
"How romantic!"
}
object DoEat
{
"Auto-cannibalism is not the answer."
}
object DoHit
{
"If you insist.... Poof, you're dead!"
NotDeadYet
}
}
}
!----------------------------------------------------------------------------
! NEW ROOM TYPES
!----------------------------------------------------------------------------
room DarkRoom
{
is not light, not thief_free
room_points 0
threat_level 0
after
{
AnyVerb(location)
{
old_threat_level = current_threat_level
current_threat_level = self.threat_level
if current_threat_level ~= old_threat_level and
Contains(player, sword)
{
"Your sword ";
select current_threat_level
case 0
{
"is no longer glowing."
}
case 1
{
"is glowing with a faint blue glow."
}
case 2
{
"has begun to glow very brightly."
}
}
if self is not room_scored
{
score += self.room_points
self is room_scored
}
return false
}
}
}
room LightRoom
{
is light, not thief_free
room_points 0
threat_level 0
after
{
AnyVerb(location)
{
old_threat_level = current_threat_level
current_threat_level = self.threat_level
if current_threat_level ~= old_threat_level and
Contains(player, sword)
{
"Your sword ";
select current_threat_level
case 0
{
"is no longer glowing."
}
case 1
{
"is glowing with a faint blue glow."
}
case 2
{
"has begun to glow very brightly."
}
}
if self is not room_scored
{
score += self.room_points
self is room_scored
}
return false
}
}
}
room MazeRoom
{
is not light, not thief_free
threat_level 0
long_desc
{
"This is part of a maze of twisty little passages,
all alike."
}
after
{
AnyVerb(location)
{
old_threat_level = current_threat_level
current_threat_level = self.threat_level
if current_threat_level ~= old_threat_level and
Contains(player, sword)
{
"Your sword ";
select current_threat_level
case 0
{
"is no longer glowing."
}
case 1
{
"is glowing with a faint blue glow."
}
case 2
{
"has begun to glow very brightly."
}
}
return false
}
}
}
room Dead_End_Room
{
is not light, not thief_free
long_desc
{
"You have come to a dead end in the maze."
}
}
room CoalRoom
{
is not light, thief_free
long_desc
{
"This is a non-descript part of a coal mine."
}
}
!----------------------------------------------------------------------------
! NEW CLASSES
!----------------------------------------------------------------------------
class treasure
{
take_points 10 ! points awarded when item is picked up
deposit_points 10 ! points awarded when item is put into
! trophy case
before
{
object DoGet
{
if self is not found
{
score += self.take_points
self is found
}
return false
}
}
is valuable
}
class boat
{
type vehicle
prep "in", "out"
vehicle_move true
is enterable, container, open, not static, burnable
}
class creature
{
type character
pronouns "he", "him", "his", "himself"
capacity 50
holding 0
is living, transparent, static, unfriendly
}
!----------------------------------------------------------------------------
! FUSES AND DAEMONS
!----------------------------------------------------------------------------
daemon LampDaemon
{}
event LampDaemon
{
local t
self = lamp
self.misc--
t = self.misc
if t <= 0
{
self.misc = 0
t = 0
self is not switchedon
self is not light
}
if FindObject(self, location)
{
select t
case 195
{
event_flag = true
"The lamp appears a bit dimmer."
}
case 95
{
event_flag = true
"The lamp is definitely dimmer now."
}
case 25
{
event_flag = true
"The lamp is nearly out."
}
case 0
{
event_flag = true
"You'd better have more light than from the brass
lantern."
Deactivate(LampDaemon)
self is not switchedon
}
}
}
daemon ChirpingBird
{}
event ChirpingBird
{
if location = forest_path or
location = forest1 or
location = forest2 or
location = forest3 or
location = forest4 or
location = up_a_tree
{
if random(10) <= 2
{
event_flag = true
"You hear in the distance the chirping of a
song bird."
}
}
}
daemon FillDam
{}
event FillDam
{
reservoir_level++
if reservoir_level < 9
{
reservoir_status = 4 ! reservoir is filling
loud_room is special ! It's quiet
if location = reservoir and
parent(player) ~= magic_boat
{
event_flag = true
"You notice that the water level here is rising
rapidly. The currents are also becoming stronger.
Staying here seems quite perilous!"
}
}
elseif reservoir_level = 9
{
reservoir_status = 1 ! reservoir is full
Deactivate(FillDam)
remove trunk_of_jewels
reservoir is water_location
loud_room is not special
if location = reservoir_south
{
event_flag = true
"You notice that the water level has risen to the
point that it is impossible to cross."
}
elseif location = loud_room
{
event_flag = true
"All of a sudden, an alarmingly loud roaring sound
fills the room. Filled with fear, you scramble
away."
DoTooLoud
}
elseif location = deep_canyon
{
event_flag = true
"A sound, like that of flowing water, starts to come
from below."
}
elseif location = reservoir and
parent(player) = magic_boat
{
event_flag = true
"The boat lifts gently out of the mud and is now
floating on the reservoir."
}
elseif location = reservoir
{
event_flag = true
"You are lifted up by the rising river! You try to
swim, but the currents are too strong. You come
closer, closer to the awesome structure of Flood
Control Dam #3. The dam beckons to you. The roar of
the water nearly deafens you, but you remain
conscious as you tumble over the dam toward your
certain doom among the rocks at its base."
NotDeadYet
}
}
}
daemon EmptyDam
{}
event EmptyDam
{
reservoir_level--
if reservoir_level > 0
{
reservoir_status = 3 ! reservoir is draining
loud_room is not special ! It's loud
}
elseif reservoir_level = 0
{
reservoir_status = 2 ! reservoir is drained
reservoir is not water_location
Deactivate(EmptyDam)
move trunk_of_jewels to reservoir
if location = reservoir_south
{
event_flag = true
"The water level is now quite low here and you could
easily cross over to the other side."
}
elseif location = deep_canyon
{
event_flag = true
"The roar of rushing water is quieter now."
}
elseif location = reservoir and
parent(player) = magic_boat
{
event_flag = true
"The water level has dropped to the point at which
the boat can no longer stay afloat. It sinks into
the mud."
}
}
}
daemon FillMaintRoom
{}
event FillMaintRoom
{
maint_room_level++
if location = maintenance_room and
maint_room_level < 14
{
event_flag = true
"The water level here is now up to your ";
select maint_room_level
case 0, 1
"ankles."
case 2, 3
"shin."
case 4, 5
"knees."
case 6, 7
"hips."
case 8, 9
"waist."
case 10, 11
"chest."
case 12, 13
"neck."
}
if maint_room_level = 14
{
Deactivate(FillMaintRoom)
}
if location = maintenance_room and
maint_room_level = 14
{
event_flag = true
"I'm afraid you have done drowned yourself."
NotDeadYet
}
}
fuse HotBell ! When the brass bell is rung, it takes 20 turns for it
{} ! to cool down.
event HotBell
{
if not self.tick
{
remove red_hot_bell
move brass_bell to entrance_to_hades
if red_hot_bell in location
{
event_flag = true
"The bell appears to have cooled down."
}
}
}
fuse Match
{}
event Match
{
if not self.tick
{
event_flag = true
"The match has gone out."
matchbook is not light
matchbook is not heat_source
}
}
fuse Ceremony
{}
event Ceremony
{
if not self.tick
{
if player in entrance_to_hades
{
event_flag = true
"\nThe tension of this ceremony is broken, and the
wraiths, amused but shaken at your clumsy attempt,
resume their hideous jeering."
}
ceremony_1 = 0 ! resets the ceremony
ceremony_2 = 0
}
}
daemon Candle
{}
event Candle
{
! This only reduces candle life if the player is carrying
! lit candles or the lit candles are in the player's location
if Contains(player, candles) or
Contains(location, candles)
{
candle_life--
select candle_life
case 35
{
event_flag = true
"The candles grow shorter."
}
case 15
{
event_flag = true
"The candles are becoming quite short."
}
case 5
{
event_flag = true
"The candles won't last long now."
}
case 0
{
event_flag = true
"You'd better have more light than from the
pair of candles."
candles is not light
candles is not heat_source
Deactivate(Candle)
FindLight(location)
}
}
}
fuse RiverCurrent
{}
event RiverCurrent
{
if not self.tick
{
event_flag = true
"The flow of the river carries you downstream."
select location
case river1
{
move magic_boat to river2
location = river2
DescribePlace(location, 1)
Deactivate(RiverCurrent)
Activate(RiverCurrent, 4)
Break
}
case river2
{
move magic_boat to river3
location = river3
DescribePlace(location, 1)
Deactivate(RiverCurrent)
Activate(RiverCurrent, 3)
Break
}
case river3
{
move magic_boat to river4
location = river4
DescribePlace(location, 1)
Deactivate(RiverCurrent)
Activate(RiverCurrent, 2)
Break
}
case river4
{
move magic_boat to river5
location = river5
DescribePlace(location, 1)
Deactivate(RiverCurrent)
Activate(RiverCurrent, 1)
Break
}
case river5
{
"\nUnfortunately, the magic boat doesn't provide
protection from the rocks and boulders one meets
at the bottom of waterfalls. Including this one."
Deactivate(RiverCurrent)
NotDeadYet
}
}
}
daemon HealPlayer
{}
event HealPlayer
{
if player is stunned
{
player is not stunned
}
CalculateRank
max_hit_points = (rank/2) + 2
if max_hit_points > current_hit_points and
turns_to_heal = 0
{
current_hit_points = max_hit_points
}
if turns_to_heal > 0
{
turns_to_heal--
select turns_to_heal
case 0
{
wound_level = 0
current_hit_points = max_hit_points
}
case 30
{
wound_level = 1
current_hit_points++
}
case 60
{
wound_level = 2
current_hit_points++
}
case 90
{
wound_level = 3
current_hit_points++
}
case 120
{
wound_level = 4
current_hit_points++
}
}
}
! This daemon moves the thief around the dungeon. It doesn't move the
! thief on a fixed track, since that would allow the player to catch up
! to him.
daemon ThiefDaemon
{}
event ThiefDaemon
{
local a, b, c, d, i, j, dest, diff
self = thief
if self in location and
self is hostile
{
if contains(player, sword)
{
"Your sword has begun to glow very brightly."
}
event_flag = true
Jump ThiefAttacks
}
! If the thief is hostile, skip this part
! The longer the game goes on, the more likely the thief will come
! to visit
a = 350 - counter
if a < 10
a = 10
b = random(a)
if b = 1 and
location is not thief_free
{
move self to location
old_thief_location = location
}
else
{
do
{
a = random(45)
select a
case 1
dest = maze1
case 2
dest = maze2
case 3
dest = maze3
case 4
dest = maze4
case 5
dest = maze5
case 6
dest = maze6
case 7
dest = maze7
case 8
dest = maze8
case 9
dest = maze9
case 10
dest = maze10
case 11
dest = maze11
case 12
dest = maze12
case 13
dest = maze13
case 14
dest = maze14
case 15
dest = maze15
case 16
dest = dead_end1
case 17
dest = dead_end2
case 18
dest = dead_end3
case 19
dest = dead_end4
case 20
dest = east_west_passage
case 21
dest = round_room
case 22
dest = narrow_passage
case 23
dest = mirror_south
case 24
dest = winding_passage
case 25
dest = cave
case 26
dest = engravings_cave
case 27
dest = damp_cave
case 28
dest = north_south_passage
case 29
dest = chasm
case 30
dest = deep_canyon
case 31
dest = reservoir_south
case 32
dest = stream_view
case 33
dest = reservoir_north
case 34
dest = atlantis_room
case 35
dest = cave2
case 36
dest = twisting_passage
case 37
dest = mirror_north
case 38
dest = cold_passage
case 39
dest = slide_room
case 40
dest = mine_entrance
case 41
dest = squeaky_room
case 42
dest = coal_mine1
case 43
dest = coal_mine2
case 44
dest = coal_mine3
case 45
dest = coal_mine4
}
while old_thief_location = dest
move self to dest
old_thief_location = dest
}
if self not in location
{
for i in old_thief_location
{
if i is moved
{
c++
}
}
if c > 0
{
while c > 0
{
for i in old_thief_location
{
if i is moved
{
j = i
}
}
move j to thiefs_bag
c--
}
}
}
elseif self in location and
self is not hostile
{
! Several options: take everything from the room, or from
! the player, both, take a light source, or take nothing.
! First, determine is the player and/or the room have
! anything in them
for i in location
{
if i is valuable and
i not in player
{
b++
}
}
for i in player
{
if i is valuable
{
c++
}
}
for i in player
{
if i is light
{
d++
}
}
! Now choose the thief's action
a = random(5)
select a
case 1
{
Jump RobRoom
}
case 2
{
Jump RobPlayer
}
case 3
{
Jump RobBoth
}
case 4
{
Jump RobLight
}
case 5
{
Jump RobNothing
}
:RobRoom
if b > 0 and ! Valuable item(s) in room (only)
c = 0
{
while b > 0
{
for i in location
{
if i is not living and
i is valuable
{
j = i
}
}
move j to thiefs_bag
b--
}
"The thief just left, still carrying his large
bag. You may not have noticed that he
appropriated the valuables in the room."
Jump ThiefEnd
}
else
{
Jump RobNothing
}
:RobPlayer
if c > 0 and ! Valuable item(s) in player (only)
b = 0
{
while c > 0
{
for i in player
{
if i is valuable
{
j = i
}
}
move j to thiefs_bag
c--
}
"The thief just left, still carrying his large
bag. You may not have noticed that he robbed you
blind first."
Jump ThiefEnd
}
else
{
Jump RobNothing
}
:RobBoth
if c > 0 and ! Valuable item(s) in player and location
b > 0
{
c += b
while c > 0
{
for i in player
{
if i is valuable
{
j = i
}
}
for i in location
{
if i is not living and
i is valuable
{
j = i
}
}
move j to thiefs_bag
c--
}
"A seedy-looking individual with a large bag
just wandered through the room. On the way
through, he quietly abstracted some valuables
from the room and from your possession,
mumbling something about \"Doing unto others
before...\""
Jump ThiefEnd
}
else
{
Jump RobNothing
}
:RobLight
if d > 0
{
while d > 0
{
for i in player
{
if i is light
{
j = i
if j = lamp
{
Deactivate(LampDaemon)
lamp is not switchedon
lamp is not light
}
}
}
move j to thiefs_bag
d--
}
"The thief seems to have left you in the dark."
Jump ThiefEnd
}
else
{
Jump RobNothing
}
:RobNothing
a = random(2)
select a
case 1
{
"The thief, finding nothing of value, left disgusted."
}
case 2
{
"Someone carrying a large bag is casually leaning
against one of the walls here. He does not speak,
but it is clear from his aspect that the bag will
be taken only over his dead body."
}
:ThiefEnd
return true
}
else
{
:ThiefAttacks
if self is living and
self is hostile and
self in location and
self is not unconscious and
self is not stunned and
self is not disarmed
{
CalculateRank
diff = 6 - rank
ResolveAttack(diff)
select combat_result
case 0
{
a = random(4)
select a
case 1
{
"The thief stabs nonchalantly with
his stiletto and misses."
}
case 2
{
"You dodge as the thief comes in low."
}
case 3
{
"You parry a lightning thrust, and
the thief salutes you with a grim nod."
}
case 4
{
"The thief tries to sneak past your
guard, but you twist away."
}
return true
}
case 1
{
:Instead3
player is stunned
a = random(3)
select a
case 1
{
"The butt of his stiletto cracks you
on the skull, and you stagger back."
}
case 2
{
"The thief rams the haft of his blade
into your stomach, leaving you out of
breath."
}
case 3
{
"The thief attacks, and you fall back
desperately."
}
return true
}
case 2
{
if xobject and
xobject is weapon and
xobject in player
{
a = random(3)
select a
case 1
{
"A long, theatrical slash.
You catch it on your ";
print xobject.name;
", but the thief twists his
knife, and the ";
print xobject.name;
" goes flying."
}
case 2
{
"The thief neatly flips your ";
print xobject.name;
" out of your hands, and it
drops to the floor."
}
case 3
{
"You parry a low thrust, and
your ";
print xobject.name;
" slips out of your hand."
}
move xobject to location
}
elseif object and
object is weapon and
object in player
{
a = random(3)
select a
case 1
{
"A long, theatrical slash.
You catch it on your ";
print object.name;
", but the thief twists his
knife, and the ";
print object.name;
" goes flying."
}
case 2
{
"The thief neatly flips your ";
print object.name;
" out of your hands, and it
drops to the floor."
}
case 3
{
"You parry a low thrust, and
your ";
print object.name;
" slips out of your hand."
}
move object to location
}
else
{
Jump Instead3
}
}
case 3
{
a = random(2)
select a
case 1
{
"Shifting in the midst of a thrust,
the thief knocks you unconscious
with the haft of his stiletto."
}
case 2
{
"The thief knocks you out."
}
a = random(2)
select a
case 1
{
"The thief, forgetting his
essentially genteel upbringing, cuts
your throat."
}
case 2
{
"The thief, a pragmatist, dispatches
you as a threat to his livelihood."
}
NotDeadYet
}
case 4
{
current_hit_points--
turns_to_heal += 30
if current_hit_points <= 0
{
Jump PlayerDead3
}
else
{
a = random(4)
select a
case 1
{
"A quick thrust pinks your
left arm, and blood starts
to trickle down."
}
case 2
{
"The thief draws blood,
raking his stiletto across
your arm."
}
case 3
{
"The stiletto flashes faster
than you can follow, and
blood wells from your leg."
}
case 4
{
"The thief slowly approaches,
strikes like a snake, and
leaves you wounded."
}
return true
}
}
case 5
{
current_hit_points -= 2
turns_to_heal += 60
if current_hit_points <= 0
{
Jump PlayerDead3
}
else
{
a = random(4)
select a
case 1
{
"The thief strikes like a snake!
The resulting wound is serious."
}
case 2
{
"The thief stabs a deep cut
in your upper arm."
}
case 3
{
"The stiletto touches your
forehead, and the blood
obscures your vision."
}
case 4
{
"The thief strikes at your
wrist, and suddenly your grip
is slippery with blood."
}
return true
}
}
case 6
{
:PlayerDead3
a = random(3)
select a
case 1
{
"Finishing you off, the thief inserts
his blade into your heart."
}
case 2
{
"The thief comes in from the side,
feints, and inserts the blade into
your ribs."
}
case 3
{
"The thief bows formally, raises
his stiletto, and with a wry grin,
ends the battle and your life."
}
NotDeadYet
}
}
elseif self is living and
self is stunned
{
self is not stunned
"The thief, a man of superior breeding, pauses for a
moment to consider the propriety of finishing you off."
return true
}
elseif self is living and
self is not unconscious and
self is disarmed
{
if FindObject(stiletto, location) and
random(10) < 6
{
"The robber, somewhat surprised at this turn
of events, nimbly retrieves his stiletto."
move stiletto to self
stiletto is hidden
self is not disarmed
return true
}
else
{
"Your opponent, determining discretion to be
the better part of valor, decides to
terminate this little contretemps. With a
rueful nod of his head, he steps backward
into the gloom and disappears."
RemoveThief(0)
}
}
}
return true
}
!----------------------------------------------------------------------------
!
! EVENTS
!
!----------------------------------------------------------------------------
event troll
{
local a, b
self = troll
! 10% chance to spontaneously attack.
if self is not hostile and
random(10) = 1
{
self is hostile
}
if self is hostile and
self is living and
self is not unconscious and
self is not stunned and
self is not disarmed
{
ResolveAttack(-1)
combat_result--
if combat_result < 0
{
combat_result = 0
}
select combat_result
case 0
{
a = random(4)
select a
case 1
{
"The troll swings his axe, but it misses."
}
case 2
{
"The troll's axe barely misses your ear."
}
case 3
{
"The axe sweeps past as you jump aside."
}
case 4
{
"The axe crashes against the rock, throwing sparks!"
}
return true
}
case 1
{
:Instead1
player is stunned
a = random(4)
select a
case 1
{
"The troll hits you with a glancing blow,
and you are momentarily stunned."
}
case 2
{
"The troll swings; the blade turns on your
armor but crashes broadside into your head."
}
case 3
{
"You stagger back under a hail of axe
strokes."
}
case 4
{
"The troll's mighty blow drops you to your
knees."
}
return true
}
case 2
{
if xobject and
xobject is weapon and
xobject in player
{
a = random(3)
select a
case 1
{
"The axe hits your ";
print xobject.name;
" and knocks it spinning."
}
case 2
{
"The troll swings, you parry, but
the force of his blow knocks your ";
print xobject.name;
" away."
}
case 3
{
"The axe knocks your ";
print xobject.name;
" out of your hand. It falls to the
floor."
}
move xobject to location
}
elseif object and
object is weapon and
object in player
{
a = random(3)
select a
case 1
{
"The axe hits your ";
print xobject.name;
" and knocks it spinning."
}
case 2
{
"The troll swings, you parry, but
the force of his blow knocks your ";
print xobject.name;
" away."
}
case 3
{
"The axe knocks your ";
print xobject.name;
" out of your hand. It falls to the
floor."
}
move object to location
}
else
{
Jump Instead1
}
}
case 3
{
"The flat of the troll's axe hits you delicately on
the head, knocking you out."
"Conquering his fears, the troll puts you to death."
NotDeadYet
}
case 4
{
current_hit_points--
turns_to_heal += 30
if current_hit_points <= 0
{
Jump PlayerDead1
}
else
{
a = random(5)
select a
case 1
{
"The axe gets you right in the side.
Ouch!"
}
case 2
{
"The flat of the troll's axe skins
across your forearm."
}
case 3
{
"The troll's swing almost knocks you
over as you barely parry in time."
}
case 4
{
"The troll swings his axe, and it
nicks your arm as you dodge."
}
case 5
{
"The troll charges, and his axe
slashes you on your ";
b = random(2)
select b
case 1
{
"left";
}
case 2
{
"right";
}
" arm."
}
return true
}
}
case 5
{
current_hit_points -= 2
turns_to_heal += 60
if current_hit_points <= 0
{
Jump PlayerDead1
}
else
{
a = random(2)
select a
case 1
{
"An axe stroke makes a deep wound in
your leg."
}
case 2
{
"The troll's axe swings down, gashing
your shoulder."
}
return true
}
}
case 6
{
:PlayerDead1
a = random(3)
select a
case 1
{
"The troll neatly removes your head."
}
case 2
{
"The troll's axe stroke cleaves you
from the nave to the chops."
}
case 3
{
"The troll's axe removes your head."
}
NotDeadYet
}
}
elseif self is living and
self is stunned
{
self is not stunned
if axe is hidden ! hidden = troll is carrying the axe
{
"The troll hesitates, fingering his axe."
}
else
{
"The troll scratches his head ruminatively:
Might you be magically protected, he
wonders?"
}
return true
}
elseif self is living and
self is not unconscious and
self is disarmed
{
if FindObject(axe, location) and
random(10) < 6
{
"The troll, angered and humiliated, recovers his
weapon. He appears to have an axe to grind with you."
move axe to self
axe is hidden
self is not disarmed
return true
}
else
{
"The troll, disarmed, cowers in terror, pleading for
his life in the guttural tongue of the trolls."
return true
}
}
}
event cyclops
{
local a, diff
self = cyclops
if self is hostile and
self is living and
self is not unconscious and
self is not stunned
{
CalculateRank
diff = 6 - rank
ResolveAttack(diff)
select combat_result
case 0
{
a = random(2)
select a
case 1
{
"The Cyclops misses, but the backwash almost
knocks you over."
}
case 2
{
"The Cyclops rushes you, but runs into the
wall."
}
return true
}
case 1
{
:Instead2
"The Cyclops lands a punch that knocks the wind out
of you."
player is stunned
return true
}
case 2
{
if xobject and
xobject is weapon and
xobject in player
{
a = random(2)
select a
case 1
{
"The Cyclops grabs your ";
print xobject.name;
", tastes it, and throws it to the
ground in disgust."
}
case 2
{
"The monster grabs you on the wrist,
squeezes, and you drop your ";
print xobject.name;
" in pain."
}
move xobject to location
}
elseif object and
object is weapon and
object in player
{
a = random(2)
select a
case 1
{
"The Cyclops grabs your ";
print object.name;
", tastes it, and throws it to the
ground in disgust."
}
case 2
{
"The monster grabs you on the wrist,
squeezes, and you drop your ";
print object.name;
" in pain."
}
move object to location
}
else
{
Jump Instead2
}
}
case 3
{
"The Cyclops sends you crashing to the floor,
unconscious."
"The Cyclops, no sportsman, dispatches his
unconscious victim."
NotDeadYet
}
case 4
{
current_hit_points--
turns_to_heal += 30
if current_hit_points <= 0
{
Jump PlayerDead2
}
else
{
a = random(2)
select a
case 1
{
"A quick punch, but it was only a
glancing blow."
}
case 2
{
"A glancing blow from the Cyclops'
fist."
}
return true
}
}
case 5
{
current_hit_points -= 2
turns_to_heal += 60
if current_hit_points <= 0
{
Jump PlayerDead2
}
else
{
a = random(2)
select a
case 1
{
"The monster smashes his huge fist
into your chest, breaking several
ribs."
}
case 2
{
"Heedless of your weapons, the
Cyclops tosses you against the rock
wall of the room."
}
return true
}
}
case 6
{
:PlayerDead2
"The Cyclops breaks your neck with a massive smash."
NotDeadYet
}
}
elseif self is living and
self is stunned
{
self is not stunned
"The Cyclops seems unable to decide whether to broil
or stew his dinner."
return true
}
}
!----------------------------------------------------------------------------
!
! Scenery Items - These items are always in the player's location
!
!----------------------------------------------------------------------------
scenery grue "lurking grue"
{
noun "grue"
adjective "lurking"
article "a"
found_in {return location}
long_desc
{
"The grue is a sinister, lurking presence in the dark places
of the earth. Its favorite diet is adventurers, but its
insatiable appetite is tempered by its fear of light. No grue
has ever been seen by the light of day, and few have survived
its fearsome jaws to tell the tale."
}
before
{
object DoFind
{
"There is no grue here, but I'm sure there is at
least one lurking in the darkness nearby. I wouldn't
let my light go out if I were you!"
}
object DoListen
{
"It makes no sound but is always lurking in the
darkness nearby."
}
}
}
scenery zorkmid "zorkmid"
{
noun "zorkmid"
article "a"
found_in {return location}
long_desc
{
"The zorkmid is the unit of currency of the Great Underground
Empire."
}
before
{
object DoFind
{
"The best way to find zorkmids is to go out and
look for them."
}
}
}
scenery teeth "set of teeth"
{
noun "teeth"
adjective "set"
article "a"
found_in {return location}
before
{
object DoFind
{
"You find it."
}
}
}
scenery hands "pair of hands"
{
noun "hands"
adjectives "pair" "bare"
article "the"
found_in {return location}
before
{
object DoFind
{
"Within six feet of your head, assuming you haven't
left that somewhere."
}
}
}
scenery sailor "sailor"
{
noun "sailor"
article "the"
found_in {return location}
}
scenery blessings "blessings"
{
noun "blessings"
article "my"
found_in {return location}
before
{
object DoCount
{
"Well, for one, you are playing Hugo Zork..."
}
}
}
scenery way "way"
{
nouns "way" "path"
article "the"
found_in {return location}
}
scenery ground "ground"
{
nouns "ground" "dirt" "sand"
article "the"
found_in {return location}
before
{
object DoDig
{
if xobject = shovel or
xobject = hands
{
"The ground is too hard for digging here."
}
else
{
return false
}
}
}
}
scenery surrounding_wall "surrounding wall"
{
noun "wall"
adjective "surrounding"
article "the"
found_in {return location}
}
scenery air "blast of air"
{
noun "air"
adjective "blast"
article "a"
found_in {return location}
}
!----------------------------------------------------------------------------
! CHARACTERS
!----------------------------------------------------------------------------
creature troll "troll"
{
noun "troll"
adjective "nasty"
article "a"
in troll_room
room_points 5 ! OK, so he's not a room...
hit_points 2
short_desc
{
if self is not unconscious and
self is not disarmed
{
"A nasty-looking troll, brandishing a bloody axe,
blocks all passages out of the room."
}
elseif self is unconscious
{
"An unconscious troll is sprawled on the floor. All
passages out of the room are open."
}
else
{
"A pathetically babbling troll is here."
}
}
long_desc
{
if self is not unconscious and
self is not disarmed
{
"A nasty-looking troll, brandishing a bloody axe,
blocks all passages out of the room."
}
elseif self is unconscious
{
"An unconscious troll is sprawled on the floor. All
passages out of the room are open."
}
else
{
"A pathetically babbling troll is here."
}
}
knocked_out
{
self is unconscious
if troll is not room_scored
{
score += troll.room_points
troll is room_scored
}
troll_room.threat_level = 0
cellar.threat_level = 0
move axe to location
axe is not hidden
self is disarmed
KnockOutMessage(troll)
}
no_weapon
{
self is disarmed
move axe to location
axe is not hidden
DisarmedMessage(troll)
}
take_damage
{
self.hit_points -= damage
if self is unconscious or
self is disarmed
{
Jump TrollDead
}
elseif self.hit_points <= 0
{
DeadMessage(troll)
:TrollDead
"Almost as soon as ";
print The(self);
" breathes his last breath, a cloud
of sinister black fog envelops him,
and when the fog lifts, the carcass
has disappeared."
remove self
self is not living
if self is not room_scored
{
score += self.room_points
self is room_scored
}
troll_room.threat_level = 0
cellar.threat_level = 0
axe is not hidden
move axe to location
}
else
{
MinorWoundMessage(troll)
}
}
before
{
object DoWakeCharacter
{
if self is not unconscious
{
Already_done
}
else
{
self is not unconscious
troll_room.threat_level = 2
cellar.threat_level = 1
if FindObject(axe, location)
{
move axe to self
axe is hidden
self is not disarmed
"The troll stirs, quickly resuming a
fighting stance."
return true
}
else
{
"The troll, disarmed, cowers in
terror, pleading for his life in the
guttural tongue of the trolls."
return true
}
}
}
object DoListen
{
if self is not unconscious and
self is not disarmed
{
"Every so often the troll says something,
probably uncomplimentary, in his guttural
tongue."
return true
}
elseif self is not unconscious and
self is disarmed
{
"The troll, disarmed, cowers in
terror, pleading for his life in the
guttural tongue of the trolls."
return true
}
else
{
return false
}
}
object DoAsk, DoTell, DoAskQuestion, DoTalk, DoHello
{
if self is not unconscious
{
"The troll isn't much of a
conversationalist."
return true
}
else
{
"Unfortunately, the troll can't hear you."
}
}
object DoGet
{
if self is not unconscious
{
"The troll spits in your face, saying
\"Better luck next time\"."
}
else
{
return false
}
}
xobject DoGive, DoThrowAt
{
if object = axe
{
"The troll scratches his head in confusion,
then takes the axe."
axe is hidden
self is not disarmed
return true
}
if verbroutine = &DoGive
{
"The troll, who is not overly proud,
graciously accepts the gift";
}
else
{
"The troll, who is remarkably coordinated,
catches ";
print The(object);
}
if object = sword
{
" and eats it hungrily. Poor troll, he dies
from an internal hemorrhage and his carcass
disappears in a sinister black fog."
remove troll
troll is not living
axe is not hidden
remove sword
if self is not room_scored
{
score += self.room_points
self is room_scored
}
troll_room.threat_level = 0
cellar.threat_level = 0
}
elseif object = nasty_knife
{
" and, being for the moment sated, throws it
back. Fortunately, the troll has poor control,
and the knife falls to the floor. He does
not look pleased."
self is hostile
move nasty_knife to location
}
else
{
" and not having the most discriminating
tastes, gleefully eats it."
remove object
FindLight(location) ! Just in case the player
! fed him the lamp
}
}
}
}
object axe "bloody axe"
{
noun "axe"
adjective "bloody"
article "a"
in troll
is hidden, weapon, sharp
before
{
object DoGet
{
if self in troll
{
"The troll swings it out of your reach."
}
else
{
return false
}
}
}
}
creature cyclops "cyclops"
{
noun "cyclops"
adjective "hungry"
article "a"
in cyclops_room
hit_points 4
initial_desc
{
if self is not unconscious
{
"A cyclops, who looks prepared to eat horses (much
less mere adventurers), blocks the staircase. From
his state of health, and the bloodstains on the
walls, you gather that he is not very friendly,
though he likes people."
}
else
{
"The cyclops is sleeping like a baby, albeit a very
ugly one."
}
}
long_desc
{
"A hungry cyclops is standing at the foot of the stairs."
}
knocked_out
{
self is unconscious
cyclops_room.threat_level = 0
maze15.threat_level = 0
KnockOutMessage(cyclops)
}
no_weapon
{
DazeMessage(cyclops) ! The cyclops doesn't need a weapon
}
take_damage
{
self.hit_points -= damage
if self is unconscious
{
Jump CyclopsDead
}
elseif self.hit_points <= 0
{
DeadMessage(cyclops)
:CyclopsDead
"Almost as soon as ";
print The(self);
" breathes his last breath, a cloud
of sinister black fog envelops him,
and when the fog lifts, the carcass
has disappeared."
remove self
self is not living
cyclops_room.threat_level = 0
maze15.threat_level = 0
}
elseif damage = 1
{
MinorWoundMessage(cyclops)
}
else
{
SeriousWoundMessage(cyclops)
}
}
before
{
xobject DoGive
{
if self is unconscious
{
"The cyclops is sleeping like a baby, albeit
a very ugly one."
}
elseif object = lunch
{
"The cyclops says \"Mmm Mmm. I love hot
peppers! But oh, could I use a drink. Perhaps
I could drink the blood of that thing.\"
From the gleam in his eye, it could be
surmised that you are \"that thing\"."
}
elseif object = water or object = bottle
{
if bottle is open
{
"The cyclops takes the bottle, checks
that it's open, and drinks the water.
A moment later, he lets out a yawn
that nearly blows you over, and then
falls fast asleep (what did you put
in that drink, anyway?)."
self is unconscious
}
else
{
"The cyclops apparently is not
thirsty and refuses your generous
offer."
}
}
elseif object is sharp or
object is weapon
{
"The cyclops is not so stupid as to eat
THAT!"
}
else
{
"The cyclops may be hungry, but there is a
limit."
}
}
xobject DoThrowAt
{
if self is not unconscious
{
"\"Do you think I'm as stupid as my father
was?\", he says, dodging."
}
else
{
return false
}
}
xobject DoTie
{
"You cannot tie the cyclops, though he is fit to be
tied."
}
object DoListen
{
"You can hear his stomach rumbling."
}
object DoAsk, DoTell, DoAskQuestion, DoTalk, DoHello
{
if self is not unconscious
{
"The cyclops prefers eating to making
conversation."
}
else
{
"No use talking to him. He's fast asleep."
}
}
object DoWake
{
if self is unconscious
{
"The cyclops yawns and stares at the thing
that woke him up."
self is not unconscious
cyclops_room.threat_level = 2
maze15.threat_level = 1
}
else
{
return false
}
}
object DoGet
{
if self is not unconscious
{
"The cyclops shrugs but otherwise ignores
your pitiful attempt."
}
else
{
return false
}
}
}
}
creature thief "thief"
{
nouns "thief" "robber" "man" "character" "eyes"
adjectives "slippery"
article "the"
in nothing
hit_points 4
long_desc
{
"The thief is a slippery character with beady eyes that
flit back and forth. He carries, along with an unmistakable
arrogance, a large bag over his shoulder and a vicious
stiletto, whose blade is aimed menacingly in your direction.
I'd watch out if I were you."
}
knocked_out
{
self is unconscious
treasure_room.threat_level = 0
move stiletto to location
stiletto is not hidden
self is disarmed
KnockOutMessage(thief)
}
no_weapon
{
self is disarmed
move stiletto to location
stiletto is not hidden
DisarmedMessage(thief)
}
take_damage
{
self.hit_points -= damage
if self is unconscious or
self is disarmed
{
Jump ThiefDead
}
elseif self.hit_points <= 0
{
DeadMessage(thief)
:ThiefDead
"Almost as soon as ";
print The(self);
" breathes his last breath, a cloud
of sinister black fog envelops him,
and when the fog lifts, the carcass
has disappeared."
RemoveThief(1)
}
elseif damage = 1
{
MinorWoundMessage(thief)
}
else
{
SeriousWoundMessage(thief)
}
}
before
{
object DoGet
{
"Once you got him, what would you do with him?"
}
object DoListen
{
"The thief is a strong, silent type."
}
object DoAsk, DoTell, DoAskQuestion, DoTalk, DoHello
{
if self is not unconscious
{
"The thief says nothing, as you have not
been formally introduced."
}
else
{
"The thief, being temporarily incapacitated,
is unable to acknowledge your greeting with
his usual graciousness."
}
}
object DoWake
{
if self is unconscious
{
"Your proposed victim suddenly recovers
consciousness."
}
else
{
return false
}
}
xobject DoThrowAt
{
if self is unconscious
{
return false
}
elseif object = nasty_knife
{
"You missed. The thief makes no attempt to
take the knife, though it would be a fine
addition to the collection in his bag. He
does seem angered by your attempt."
move nasty_knife to location
thief is hostile
}
else
{
"You missed."
thief is hostile
}
}
xobject DoGive
{
if self is unconscious
{
return false
}
elseif object is valuable
{
"The thief is taken aback by your unexpected
generosity, but accepts ";
print The(object);
" and stops to admire its beauty."
thief is not hostile
move object to thiefs_bag
}
else
{
"The thief places ";
print The(object);
" in his bag and thanks you politely."
thief is not hostile
move object to thiefs_bag
}
}
}
}
object stiletto "stiletto"
{
noun "stiletto"
adjectives "sharp" "viscious"
article "a"
is weapon, sharp, hidden
in thief
size 10
}
object thiefs_bag "thief's bag"
{
nouns "bag" "sack"
adjective "large"
article "the"
is container, hidden
capacity 500
in thief
before
{
object DoGet
{
if thief is unconscious
{
"Sadly for you, the robber collapsed on top
of the bag. Trying to take it would wake
him."
}
else
{
"The bag will be taken over his dead body."
}
}
object DoLookIn
{
if thief is unconscious
{
"The bag is underneath the thief, so one
can't say what, if anything, is inside."
}
else
{
"Getting close enough would be a good trick."
}
}
}
}
object canvas "useless piece of canvas"
{
noun "canvas"
adjective "useless" "piece"
article "a"
in nothing
}
!----------------------------------------------------------------------------
! ABOVE GROUND AREAS
!----------------------------------------------------------------------------
LightRoom west_of_house "West of House"
{
long_desc
{
"You are standing in an open field west of a white
house, with a boarded front door.";
if ancient_map in nothing
{
""
}
else
{
" A secret path leads southwest into the forest."
}
}
is thief_free
sw_to
{
if ancient_map in nothing
{
return false
}
else
{
return stone_barrow
}
}
n_to north_of_house
s_to south_of_house
w_to forest1
e_to
{
"The door is boarded and you can't remove the boards."
}
}
scenery house "house"
{
nouns "house" "home"
adjectives "colonial" "beautiful" "white"
article "the"
long_desc
{
"The house is a beautiful colonial house which is
painted white. It is clear that the owners must have
been extremely wealthy."
}
found_in west_of_house, north_of_house, behind_house, south_of_house
before
{
object DoFind
{
"It's right here! Are you blind or something?"
}
object DoEnter
{
if location = behind_house and
kitchen_window is not open
{
"The window is closed."
}
elseif location = behind_house and
kitchen_window is open
{
MovePlayer(kitchen)
}
else
{
"I can't see how to get in from here."
}
}
}
}
scenery boards "boards"
{
nouns "board" "boards"
adjectives "wood" "wooden" "white"
article "the"
in house
before
{
object DoGet, DoLook
{
"The boards are securely fastened."
}
}
}
scenery house1 "house"
{
nouns "house" "home"
adjectives "colonial" "beautiful" "white"
article "the"
long_desc
{
"You're not at the house."
}
found_in forest1, forest2, forest3, forest4, forest_path, up_a_tree \
clearing, clearing1
before
{
object DoFind
{
if location = clearing
{
"It seems to be to the west."
}
else
{
"It was here just a minute ago...."
}
}
object DoEnter
{
"You're not at the house."
}
}
}
object mailbox "small mailbox"
{
in west_of_house
nouns "mailbox" "box"
adjective "small"
article "a"
is static, container, openable, not open
capacity 5
long_desc
{
"The small mailbox is ";
if self is not open
"closed."
else
{
"open."
WhatsIn(object)
}
}
after
{
object DoOpen
{
WhatsIn(object)
}
}
}
object leaflet "leaflet"
{
in mailbox
noun "leaflet"
article "a"
is burnable
long_desc
{
"\"WELCOME TO HUGO ZORK!\n\n
HUGO ZORK is a game of adventure, danger, and low cunning.
In it you will explore some of the most amazing territory
ever seen by mortals. No computer should be without one!\""
}
is readable
}
LightRoom stone_barrow "Stone Barrow"
{
long_desc
{
"You are standing in front of a massive barrow of stone.
In the east face is a huge stone door which is open. You
cannot see into the dark of the tomb."
}
is thief_free
w_to inside_the_barrow
ne_to west_of_house
}
LightRoom inside_the_barrow "Inside The Barrow"
{
long_desc
{
"As you enter the barrow, the door closes inexorably
behind you. Around you it is dark, but ahead is an
enormous cavern, brightly lit. Through its center runs
a wide stream. Spanning the stream is a small wooden
footbridge, and beyond a path leads into a dark tunnel.
Above the bridge, floating in the air, is a large sign.
It reads: All ye who stand before this bridge have
completed a great and perilous adventure which has tested
your wit and courage. You have mastered the first part of
the (Hugo) ZORK trilogy. Those who pass over this bridge must
be prepared to undertake an even greater adventure that will
severely test your skill and bravery!"
"\nThe ZORK trilogy continues with \"ZORK II: The Wizard of
Frobozz\" and is completed in \"ZORK III: The Dungeon
Master.\""
"\nAuthor's note: I'm not making any promises, but maybe
someday I'll port Zork II and Zork III over to Hugo."
endflag = 3
}
is thief_free
}
LightRoom north_of_house "North of House"
{
long_desc
{
"You are facing the north side of a white house. There is
no door here, and all the windows are boarded up. To the
north a narrow path winds through the trees."
}
is thief_free
n_to forest_path
s_to
{
"The windows are all boarded."
}
w_to west_of_house
e_to behind_house
}
LightRoom south_of_house "South of House"
{
long_desc
{
"You are facing the south side of a white house. There is
no door here and all the windows are boarded."
}
is thief_free
n_to
{
"The windows are all boarded."
}
w_to west_of_house
e_to behind_house
s_to forest3
}
LightRoom behind_house "Behind House"
{
long_desc
{
"You are behind the white house. A path leads into the
forest to the east. In one corner of the house is a small
window which is ";
if kitchen_window is open
"open."
else
"slightly ajar."
}
is thief_free
n_to north_of_house
s_to south_of_house
e_to clearing
w_to
{
if kitchen_window is not open
{
print CThe(kitchen_window); " is closed."
}
else
{
return kitchen_window.door_to
}
}
in_to
{
if kitchen_window is not open
{
print CThe(kitchen_window); " is closed."
}
else
{
return kitchen_window.door_to
}
}
}
door kitchen_window "window"
{
noun "window"
adjective "small"
article "the"
between kitchen, behind_house
is static, transparent, not open
long_desc
{
"The window is ";
if self is not open
{
"slightly ajar, but not enough to allow entry."
}
else
{
"open, but I can't tell what's beyond it."
}
}
before
{
object DoOpen
{
if self is open
{
Already_done
}
else
{
return false
}
}
object DoClose
{
if self is not open
{
Already_done
}
else
{
return false
}
}
object DoLookThrough
{
if location = behind_house
{
"You can see what appears to be a kitchen."
}
else
{
"You can see a clear area leading towards
a forest."
}
}
}
after
{
object DoOpen
{
"With great effort, you open the window far
enough to allow entry."
}
object DoClose
{
"The window closes (more easily than it opened)."
}
}
}
LightRoom clearing "Clearing"
{
long_desc
{
"You are in a small clearing in a well marked forest path
that extends to the east and west."
}
is thief_free
w_to behind_house
e_to canyon_view
n_to forest2
s_to forest3
}
LightRoom canyon_view "Canyon View"
{
long_desc
{
"You are at the top of the Great Canyon on its west wall.
From here there is a marvelous view of the canyon and parts
of the Frigid River upstream. Across the canyon, the walls of
the White Cliffs join the mighty ramparts of the Flathead
Mountains to the east. Following the Canyon upstream to the
north, Aragain Falls may be seen, complete with rainbow. The
mighty Frigid River flows out from a great dark cavern. To the
west and south can be seen an immense forest, stretching for
miles around. A path leads northwest. It is possible to climb down
into the canyon from here."
}
is thief_free
nw_to clearing
d_to rocky_ledge
before
{
location DoJump
{
"Nice view, lousy place to jump."
NotDeadYet
}
}
}
LightRoom rocky_ledge "Rocky Ledge"
{
long_desc
{
"You are on a ledge about halfway up the wall of the river
canyon. You can see from here that the main flow from Aragain
Falls twists along a passage which it is impossible for you
to enter. Below you is the canyon bottom. Above you is more
cliff, which appears climbable."
}
is thief_free
u_to canyon_view
d_to canyon_bottom
}
LightRoom canyon_bottom "Canyon Bottom"
{
long_desc
{
"You are beneath the walls of the river canyon which may be
climbable here. The lesser part of the runoff of Aragain
Falls flows by below. To the north is a narrow path."
}
is thief_free
u_to rocky_ledge
n_to end_of_rainbow
}
LightRoom end_of_rainbow "End of Rainbow"
{
long_desc
{
"You are on a small, rocky beach on the continuation of the
Frigid River past the Falls. The beach is narrow due to the
presence of the White Cliffs. The river canyon opens here
and sunlight shines in from above. A rainbow crosses over
the falls to the east and a narrow path continues to the
southwest."
}
is thief_free
sw_to canyon_bottom
e_to
{
if rainbow is special
{
MovePlayer(on_the_rainbow)
}
else
{
"You can't go that way."
}
}
u_to
{
if rainbow is special
{
MovePlayer(on_the_rainbow)
}
else
{
"You can't go that way."
}
}
}
scenery rainbow "rainbow"
{
noun "rainbow"
adjective "dazzling"
article "a"
found_in end_of_rainbow, on_the_rainbow, aragain_falls
before
{
object DoLookUnder
{
"The Frigid River flows under the rainbow."
}
object DoWalkOn
{
if rainbow is not special
{
"Can you walk on water vapor?"
}
elseif location = on_the_rainbow
{
"You'll have to say which way..."
}
elseif location = end_of_rainbow
{
MovePlayer(aragain_falls)
}
else
{
MovePlayer(end_of_rainbow)
}
}
object DoClimb
{
if (location = end_of_rainbow or
location = aragain_falls)
{
if rainbow is special
{
MovePlayer(on_the_rainbow)
}
else
{
"You can't go that way."
}
}
else
{
"You can't do that."
}
}
}
}
treasure pot_of_gold "pot of gold"
{
noun "gold"
adjective "pot"
article "a"
take_points 10
deposit_points 10
in nothing
initial_desc
{
"At the end of the rainbow is a pot of gold."
}
}
LightRoom forest_path "Forest Path"
{
long_desc
{
"This is a path winding through a dimly lit forest. The path
heads north-south here. One particularly large tree with
some low branches stands at the edge of the path."
}
is thief_free
n_to clearing1
s_to north_of_house
e_to forest2
w_to forest1
u_to up_a_tree
}
scenery tree "tree"
{
noun "tree"
adjective "large"
article "a"
found_in forest_path, up_a_tree
before
{
object DoClimb
{
if location = forest_path
{
MovePlayer(up_a_tree)
}
else
{
"You cannot climb any higher."
}
}
}
}
LightRoom up_a_tree "Up a Tree"
{
long_desc
{
"You are about 10 feet above the ground nestled among
some large branches. The nearest branch above you is above
your reach."
}
is thief_free
d_to forest_path
u_to {
"You cannot climb any higher."
}
before
{
object DoClimb
{
"You cannot climb any higher."
}
}
}
object birdnest "bird's nest"
{
noun "nest"
adjective "bird's"
article "a"
is burnable
initial_desc
{
"Beside you on the branch is a small bird's nest."
}
contains_desc
{
"In the bird's nest is";
}
is container
capacity 10
in up_a_tree
before
{
object DoGet
{
if child(birdnest) = egg
{
egg is moved
}
return false
}
object DoDrop
{
if location = up_a_tree and
child(birdnest) = egg and
egg is not open
{
"The nest falls to the ground, and the egg
spills out of it, seriously damaged."
DoBreakEgg
move birdnest to forest_path
move broken_canary to egg
}
else
{
return false
}
}
}
}
treasure egg "jewel-encrusted egg"
{
noun "egg"
adjectives "jewel-encrusted", 0, 0
article "a"
take_points 5
deposit_points 5
capacity 5
in birdnest
is container, openable, not open, lockable, locked
long_desc
{
if self is not broken
{
"This is a large egg encrusted with precious jewels,
apparently scavenged by a childless songbird. The egg
is covered with fine gold inlay, and ornamented in
lapis lazuli and mother-of-pearl. Unlike most eggs,
this one is hinged and closed with a delicate looking
clasp. The egg appears extremely fragile."
}
else
{
return false
}
}
short_desc
{
if self is not broken
{
"There is a jewel-encrusted egg here."
}
else
{
"There is a somewhat ruined egg here."
}
}
contains_desc
{
"Inside the egg is";
}
before
{
object DoDrop
{
if location = up_a_tree
{
"The egg falls to the ground and springs
open, seriously damaged. There is a golden
clockwork canary nestled in the egg. It
seems to have recently had a bad experience.
The mountings for its jewel-like eyes are
empty, and its silver beak is crumpled.
Through a cracked crystal window below its
left wing you can see the remains of
intricate machinery. It is not clear what
result winding it would have, as the
mainspring seems sprung."
DoBreakEgg
move egg to forest_path
move broken_canary to egg
}
else
{
return false
}
}
object DoOpen
{
if self is not broken and
self is locked
{
"You have neither the tools nor
the expertise."
}
else
{
return false
}
}
object DoHit
{
if not xobject or
xobject = hands
{
"I doubt you could do that without damaging
it."
}
elseif object is sharp
{
"The egg is now open, but the clumsiness
of your attempt has seriously compromised
its esthetic appeal."
DoBreakEgg
move broken_canary to egg
}
else
{
return false
}
}
}
}
treasure canary "golden clockwork canary"
{
noun "canary"
adjectives "clockwork" "golden"
article "a"
take_points 6
deposit_points 4
size 5
in nothing
before
{
object DoWind
{
if self is not special and
(location = forest_path or
location = up_a_tree)
{
"The canary chirps, slightly off-key, an
aria from a forgotten opera. From out of
the greenery flies a lovely songbird. It
perches on a limb just over your head and
opens its beak to sing. As it does so a
beautiful brass bauble drops from its mouth,
bounces off the top of your head, and lands
glimmering in the grass. As the canary winds
down, the songbird flies away."
self is special
move bauble to forest_path
}
else
{
"The canary chirps blithely, if somewhat
tinnily, for a short time."
}
}
}
}
object broken_canary "broken clockwork canary"
{
noun "canary"
adjectives "clockwork" "broken"
article "a"
in nothing
size 5
initial_desc
{
"There is a golden clockwork canary nestled in the egg. It
seems to have recently had a bad experience. The mountings
for its jewel-like eyes are empty, and its silver beak is
crumpled. Through a cracked crystal window below its left
wing you can see the remains of intricate machinery. It is
not clear what result winding it would have, as the
mainspring seems sprung."
}
before
{
object DoWind
{
"There is an unpleasant grinding noise from
inside the canary."
}
}
}
treasure bauble "brass bauble"
{
noun "bauble"
adjective "brass"
article "a"
in nothing
take_points 1
deposit_points 1
}
LightRoom clearing1 "Clearing"
{
long_desc
{
"You are in a clearing, with a forest surrounding you on
all sides. A path leads south."
if grating is open
{
"There is an open grating, descending into
darkness."
}
elseif grating is not open and
pile_of_leaves is moved
{
"There is a grating securely fastened into the
ground."
}
}
is thief_free
d_to
{
if grating is not open and
pile_of_leaves is not moved
{
"You can't go that way."
}
else
{
return grating.door_to
}
}
s_to forest_path
n_to
{
"The forest becomes impenetrable to the north."
}
w_to forest1
e_to forest2
}
object pile_of_leaves "pile of leaves"
{
noun "leaves"
adjectives "pile" "of"
article "a"
in clearing1
is burnable, plural
size 10
short_desc
{
"On the ground is a pile of leaves."
}
before
{
object DoCount
{
"There are 69,105 leaves here."
return true
}
object DoMove, DoPull
{
"Done."
"In disturbing the pile of leaves, a grating is
revealed."
pile_of_leaves is moved
return true
}
object DoLookUnder
{
"Underneath the pile of leaves is a grating. As you
release the leaves, the grating is once again
concealed from view."
}
}
after
{
object DoGet
{
"In disturbing the pile of leaves, a grating is
revealed."
return false
}
}
}
door grating "grating"
{
noun "grating" "grate"
article "a"
between clearing1, grating_room
is static, not transparent, not open, lockable, locked
key_object skeleton_key
long_desc
{
if location = clearing1 and
pile_of_leaves is not moved
{
"You haven't seen anything like that."
}
else
{
"The grating is ";
if self is open
{
"open, but I can't tell what's beyond it."
}
else
"closed."
}
}
before
{
object DoLookThrough
{
if location = clearing1 and
pile_of_leaves is not moved
{
"You haven't seen anything like that."
}
elseif grating is open
{
"The grating is open, but I can't tell
what's beyond it."
}
else
{
return false
}
}
object DoOpen
{
if pile_of_leaves is not moved and
location = clearing1
{
"You can't see any grating here!"
object = pile_of_leaves
return true
}
return false
}
}
after
{
object DoOpen
{
trap_door is special
if location = grating_room
{
"The grating opens to reveal trees above
you."
}
else
{
"The grating opens."
}
if pile_of_leaves is not moved and
location = grating_room
{
"A pile of leaves falls onto your head
and to the ground."
move pile_of_leaves to grating_room
pile_of_leaves is moved
}
}
}
}
LightRoom forest1 "Forest"
{
long_desc
{
"This is a forest, with trees in all directions. To the
east, there appears to be sunlight."
}
is thief_free
s_to forest3
n_to clearing1
e_to forest_path
w_to
{
"You would need a machete to go further west."
}
}
LightRoom forest2 "Forest"
{
long_desc
{
"This is a dimly lit forest, with large trees all around."
}
is thief_free
e_to forest4
w_to forest_path
s_to clearing
}
LightRoom forest3 "Forest"
{
long_desc
{
"This is a dimly lit forest, with large trees all around."
}
is thief_free
n_to clearing
s_to
{
"Storm-tossed trees block your way."
}
e_to
{
"The rank undergrowth prevents eastward movement."
}
w_to forest1
nw_to south_of_house
}
LightRoom forest4 "Forest"
{
long_desc
{
"The forest thins out, revealing impassable mountains."
}
is thief_free
e_to
{
"The mountains are impassable."
}
w_to forest2
n_to forest2
s_to forest2
}
scenery forest "forest"
{
nouns "forest" "trees" "pines" "hemlocks"
article "a"
found_in forest1, forest2, forest3, forest4, forest_path, up_a_tree \
clearing, clearing1
long_desc
{
"You cannot see the forest for the trees."
}
before
{
object DoListen
{
"The pines and the hemlocks seem to be murmuring."
}
}
}
!----------------------------------------------------------------------------
! AREAS INSIDE HOUSE
!----------------------------------------------------------------------------
LightRoom kitchen "Kitchen"
{
long_desc
{ "You are in the kitchen of the white house. A table
seems to have been used recently for the preparation
of food. A passage leads to the west and a dark
staircase can be seen leading upward. A dark chimney
leads down and to the east is a small window which is ";
if kitchen_window is not open
"slightly ajar."
else
{
"open."
}
}
is thief_free
room_points 10
w_to living_room
u_to attic
d_to
{
"Only Santa Claus climbs down chimneys."
}
e_to
{
if kitchen_window is not open
{
"The kitchen window is closed."
}
else
{
return kitchen_window.door_to
}
}
out_to
{
if kitchen_window is not open
{
"The kitchen window is closed."
}
else
{
return kitchen_window.door_to
}
}
}
scenery table "table"
{
noun "table"
adjective "kitchen"
article "the"
in kitchen
is platform
capacity 50
contains_desc
{
"On the kitchen table you can see";
}
}
object sack "sack"
{
nouns "sack" "bag"
adjectives "elongated" "brown"
article "a"
in kitchen
is container, openable, not open, burnable
capacity 10
initial_desc
{
"On the table is an elongated brown sack, smelling of
hot peppers."
}
long_desc
{
"The sack is ";
if self is open
{
"open."
}
else
{
"closed."
}
}
before
{
object DoSmell
{
"It smells of hot peppers."
}
}
}
object lunch "lunch"
{
nouns "lunch" "sandwich"
adjectives "hot" "pepper"
article "a"
in sack
size 5
before
{
object DoEat
{
"Thank you very much. It really hit the spot."
remove lunch
}
}
after
{
object DoGet
{
lunch.name = "hot pepper sandwich"
return false
}
}
}
object garlic "clove of garlic"
{
noun "garlic"
adjective "clove"
article "a"
in sack
size 5
before
{
object DoEat
{
"What the heck! You won't make friends this way, but
nobody around here is too friendly anyhow. Gulp!"
remove garlic
}
}
}
object bottle "bottle"
{
noun "bottle"
adjective "glass"
article "a"
in kitchen
is container, transparent, openable, not open
capacity 5
initial_desc
{
"A bottle is sitting on the table."
}
long_desc
{
if child(self) > 0
{
"The bottle contains a quantity of water."
}
else
{
"The bottle is empty."
}
}
before
{
object DoFill
{
if self is not open
{
"The bottle is closed."
}
else
{
if child(bottle) ~= 0
{
"The bottle is full already."
}
elseif FindObject(river, location) or
FindObject(lake, location) or
FindObject(water_in_stream, location)
{
move water to bottle
"The bottle is now full of water."
}
else
{
"There is nothing here with which to
fill the bottle."
}
}
}
object DoOpen
{
"The bottle is now open."
self is open
return true
}
object DoPour
{
if self is not open
{
"The bottle is closed."
}
else
{
Perform(&DoPour, water)
}
}
}
}
object water "water"
{
noun "water"
article "a quantity of"
in bottle
size 5
long_desc
{
"It looks like ordinary water to me."
}
before
{
object DoGet
{
if bottle is not open
{
"It's in the bottle. Perhaps you should
take that instead."
}
else
{
"The water slips through your fingers."
}
}
object DoDrink
{
if bottle is not open
{
"You'll have to open the bottle first."
}
else
{
"Thank you very much. I was rather thirsty
(from all this talking, probably)."
remove water
}
}
object DoPour
{
if bottle is not open
{
"The bottle is closed."
}
elseif not xobject or
xobject = ground
{
"The water spills to the floor and evaporates
immediately."
remove water
}
elseif xobject = candles and
candles is light
{
remove water
Perform(&DoExtinguish, candles)
}
elseif xobject = red_hot_bell
{
"The water cools the bell and is evaporated."
remove water
remove red_hot_bell
move brass_bell to entrance_to_hades
Deactivate(HotBell)
}
elseif xobject = ivory_torch
{
"The water evaporates before it gets close."
remove water
}
elseif xobject = surrounding_wall or
xobject = granite_wall
{
"The water splashes on the walls and
evaporates immediately."
remove water
}
else
{
"The water spills over ";
print The(xobject);
", to the floor, and evaporates."
remove water
}
}
}
}
LightRoom living_room "Living Room"
{
long_desc
{
"You are in the living room. There is a doorway to the
east";
if wooden_door is special
{
". To the west is a cyclops-shaped opening in an old
wooden door, above which is some strange gothic
lettering, ";
}
else
{
", a wooden door with strange gothic lettering to the
west, which appears to be nailed shut, ";
}
"a trophy case, ";
if rug is not moved
{
"and a large oriental rug in the center of the room."
}
elseif rug is moved and
trap_door is not open
{
"and a closed trap door at your feet."
}
else
{
"and a rug lying beside an open trap door."
}
}
is thief_free
w_to
{
if wooden_door is not special
{
"The door is nailed shut."
}
else
{
return strange_passage
}
}
e_to kitchen
d_to
{
if rug is not moved
{
"You can't go that way."
}
elseif trap_door is not open
{
"The trap door is closed."
}
else
{
if trap_door is not special
{
"The trap door crashes shut, and you hear
someone barring it."
trap_door is not open
}
return cellar
}
}
}
scenery wooden_door "wooden door"
{
nouns "door" "lettering" "words"
adjectives "wooden" "strange" "gothic"
article "a"
in living_room
is openable, not open, readable
long_desc
{
"The engravings translate to \"This space intentionally
left blank.\""
}
before
{
object DoOpen
{
"The door cannot be opened."
}
}
}
scenery nails "nails"
{
nouns "nail" "nails"
article "the"
in living_room
}
scenery trophy_case "trophy case"
{
noun "case"
adjective "trophy"
article "the"
in living_room
is container, transparent, openable, not open
capacity 1000
contains_desc
{
"Your collection of treasures consists of";
}
before
{
object DoGet
{
"The trophy case is securely fastened to the wall."
return true
}
object DoLook, DoLookIn
{
if children(self) = 0
{
"The trophy case is empty."
return true
}
return false
}
xobject DoPutIn
{
if object is valuable and
object is not deposited and
self is open
{
score += object.deposit_points
object is deposited
}
return false
}
}
after
{
xobject DoPutIn
{
local c, i
for i in trophy_case
{
if i is valuable
{
c++
}
}
if c = 19 and
ancient_map in nothing
{
"An almost inaudible voice whispers in
your ear, \"Look to your treasures for the
final secret.\""
move ancient_map to trophy_case
return true
}
return false
}
}
}
object ancient_map "ancient map"
{
noun "map" "parchment"
adjective "ancient"
article "an"
in nothing
is readable
initial_desc
{
"In the trophy case is an ancient parchment which appears
to be a map."
}
long_desc
{
"The map shows a forest with three clearings. The largest
clearing contains a house. Three paths leave the large
clearing. One of these paths, leading southwest, is marked
\"To Stone Barrow\"."
}
}
scenery rug "rug"
{
nouns "carpet" "rug"
adjectives "large" "oriental"
article "a"
in living_room
before
{
object DoLift
{
if self is moved
{
"The rug is extremely heavy and cannot be
carried."
}
else
{
"The rug is extremely heavy and cannot be
carried, but in trying to take it you have
noticed an irregularity beneath it."
}
}
object DoGet
{
"The rug is extremely heavy and cannot be carried."
}
object DoEnter
{
"As you sit, you notice an irregularity underneath
it. Rather than be uncomfortable, you stand up again."
}
object DoMove, DoPull
{
if self is moved
{
"Having moved the carpet previously, you find
it impossible to move it again."
}
else
{
"With a great effort, the rug is moved to one
side of the room, revealing the dusty cover
of a closed trap door."
self is moved
trap_door.between #1 = living_room
trap_door.between #2 = cellar
}
}
object DoFly
{
"I suppose you think it's a magic carpet?"
}
object DoLookUnder
{
if self is moved
{
return false
}
else
{
"Underneath the rug is a closed trap door. As
you drop the corner of the rug, the trap door
is once again concealed from view."
}
}
}
}
door trap_door "trap door"
{
noun "door"
adjectives "dusty" "trap"
article "a"
between 0, 0
is static, not open
long_desc
{
"The trap door is ";
if self is open
{
"open."
}
else
{
"closed."
}
}
after
{
object DoOpen
{
"The door reluctantly opens to reveal a
rickety staircase descending into darkness."
}
object DoClose
{
"The door swings shut and closes."
}
}
}
object sword "sword"
{
noun "sword"
adjectives "elvish"
article "a"
is weapon, sharp
in living_room
size 10
initial_desc
{
"Above the trophy case hangs an elvish sword of great
antiquity."
}
long_desc
{
select current_threat_level
case 0
{
return false
}
case 1
{
"Your sword is glowing with a faint blue glow."
}
case 2
{
"Your sword is glowing very brightly."
}
}
}
object lamp "brass lantern"
{
nouns "lamp" "lantern" "light"
adjectives "battery-powered" "brass"
article "a"
is switchable
in living_room
misc 395
size 10
initial_desc
{
"A battery-powered brass lantern is on the trophy case."
}
long_desc
{
"The lamp ";
if self.misc = 0
{
"has burned out."
}
elseif self is switchedon
{
"is on."
}
else
{
"is off."
}
}
before
{
object DoThrowAt
{
"The lamp has smashes into the floor, and the
light goes out."
remove lamp
move broken_lantern to location
}
object DoSwitchOn
{
if self.misc = 0
{
"You can't turn that on."
return true
}
return false
}
object DoSwitchOff
{
if self.misc = 0
{
"You can't turn that off."
return true
}
return false
}
}
after
{
object DoSwitchOn
{
self is light
Activate(LampDaemon)
if self in player or
self in location
{
"The brass lantern is now on. "
FindLight(location)
if location is not visited
{
DescribePlace(location)
location is visited
}
}
}
object DoSwitchOff
{
self is not light
Deactivate(LampDaemon)
if self in player or
self in location
{
"The brass lantern is now off. "
if not FindLight(location)
{
"It is now pitch dark."
}
}
}
}
}
object broken_lantern "broken lantern"
{
nouns "lamp" "lantern"
adjectives "broken" "brass"
article "a"
in nothing
size 10
}
DarkRoom attic "Attic"
{
long_desc
{
"This is the attic. The only exit is a stairway
leading down."
}
is thief_free
d_to kitchen
}
scenery table1 "table"
{
noun "table"
article "a"
in attic
is platform
capacity 50
contains_desc
{
"On the table you can see";
}
}
attachable rope "rope"
{
noun "rope"
article "a"
in attic
initial_desc
{
"A large coil of rope is lying in the corner."
}
long_desc
{
if railing is special
{
"The rope is tied to the wooden railing."
}
else
{
return false
}
}
attach_verbs "tie", "attach"
detach_verbs "untie", "detach"
attached_to 0
attachable_to railing
attach_drop is true
before
{
object DoClimb
{
if railing is special
{
MovePlayer(torch_room)
}
else
{
return false
}
}
object DoDrop
{
if location = dome_room
{
"The rope drops gently to the floor below."
move rope to torch_room
}
else
{
return false
}
}
object DoTie
{
if xobject = railing and
railing is not special
{
"The rope drops over the side and comes
within ten feet of the floor."
railing is special
rope is hidden
}
return false
}
}
after
{
object DoUntie, DoGet
{
if railing is special
{
railing is not special
rope is not hidden
}
return false
}
}
}
object nasty_knife "nasty knife"
{
noun "knife"
adjective "nasty"
article "a"
is weapon, sharp
in attic
initial_desc
{
"On a table is a nasty-looking knife."
}
after
{
object DoGet
{
table1 is not hidden
return false
}
}
}
!---------------------------------------------------------------------------
! UNDERGROUND LOCATIONS
!---------------------------------------------------------------------------
DarkRoom cellar "Cellar"
{
long_desc
{
"You are in a dark and damp cellar with a narrow
passageway leading north, and a crawlway to the south.
On the west is the bottom of a steep metal ramp which
is unclimbable."
}
is thief_free
room_points 25
threat_level 1
u_to
{
if trap_door is not open
{
"The trap door is closed."
}
else
{
return trap_door.door_to
}
}
s_to east_of_chasm
n_to troll_room
w_to
{
"You try to ascend the ramp, but it is impossible, and
you slide back down."
}
}
DarkRoom east_of_chasm "East of Chasm"
{
long_desc
{
"You are on the east edge of a chasm, the bottom of which
cannot be seen. A narrow passage goes north, and the path
you are on continues to the east."
}
before
{
location DoJump
{
"This was not a very safe place to try jumping."
JumpMessage
NotDeadYet
}
}
is thief_free
n_to cellar
e_to gallery
}
scenery chasm_item "chasm"
{
noun "chasm"
article "the"
is container, open
found_in east_of_chasm, chasm
capacity 100
before
{
xobject DoThrowIn
{
print CThe(object);
" drops out of sight into the chasm."
remove object
}
}
}
DarkRoom gallery "Gallery"
{
long_desc
{
"This is an art gallery. Most of the paintings have been
stolen by vandals with exceptional taste. The vandals left
through either the north or west exits."
}
is thief_free
n_to studio
w_to east_of_chasm
}
treasure painting "beautiful painting"
{
nouns "painting" "picture"
adjective "beautiful"
article "a"
in gallery
is burnable
take_points 4
deposit_points 6
initial_desc
{
"Fortunately, there is still one chance for you to be a
vandal, for on the far wall is a painting of unparalleled
beauty."
}
short_desc
{
"A painting by a neglected genius is here."
}
before
{
object DoCut
{
if xobject is weapon
{
"Congratulations! Unlike the other vandals,
who merely stole the artist's masterpieces,
you have destroyed one."
remove painting
}
else
{
return false
}
}
object DoBurn
{
if xobject is heat_source
{
"Congratulations! Unlike the other vandals,
who merely stole the artist's masterpieces,
you have destroyed one."
remove painting
}
else
{
return false
}
}
}
}
DarkRoom studio "Studio"
{
long_desc
{
"This appears to have been an artist's studio. The walls and
floors are splattered with paints of 69 different colors.
Strangely enough, nothing of value is hanging here. At the
south end of the room is an open door (also covered with
paint). A dark and narrow chimney leads up from a fireplace;
although you might be able to get up it, it seems unlikely
you could get back down."
}
is thief_free
u_to
{
local x
x = children(player)
if x = 0
{
"Going up empty-handed is a bad idea."
}
elseif x > 2 or
(x <= 2 and not ObjectisLight(player))
{
"You can't get up there with what you're carrying."
}
elseif ObjectisLight(player) and
x <= 2
{
MovePlayer(kitchen)
}
}
s_to gallery
}
object piece_of_paper "ZORK owner's manual"
{
nouns "paper" "zork" "manual"
adjectives "owner's" "piece"
article "a"
is readable, burnable
in studio
initial_desc
{
"Loosely attached to a wall is a small piece of paper."
}
long_desc
{
"Congratulations!\n"
"You are the privileged owner of HUGO ZORK I: The Great
Underground Empire, a self-contained and self-maintaining
universe. If used and maintained in accordance with normal
operating practices for small universes, HUGO ZORK will
provide many months of trouble-free operation."
}
}
DarkRoom troll_room "Troll Room"
{
long_desc
{
"This is a small room with passages to the east and south
and a forbidding hole leading west. Bloodstains and deep
scratches (perhaps made by an axe) mar the walls."
}
is thief_free
threat_level 2
s_to cellar
w_to
{
if troll is not unconscious and
troll in location
{
"The troll fends you off with a menacing gesture."
}
else
{
return maze1
}
}
e_to
{
if troll is not unconscious and
troll in location
{
"The troll fends you off with a menacing gesture."
}
else
{
return east_west_passage
}
}
}
DarkRoom grating_room "Grating Room"
{
long_desc
{
"You are in a small room near the maze. There are twisty
passages in the immediate vicinity."
if grating is not open
{
"Above you is a grating with a skull and
crossbones lock."
}
else
{
"Above you is an open grating with sunlight pouring
in."
}
}
u_to grating
sw_to maze11
}
!---------------------------------------------------------------------------
! The Maze (Oh, The Horror!)
!---------------------------------------------------------------------------
MazeRoom maze1 "Maze"
{
n_to maze1
s_to maze2
e_to troll_room
w_to maze4
}
MazeRoom maze2 "Maze"
{
s_to maze1
e_to maze3
d_to {
"You won't be able to get back up to the tunnel you are
going through when it gets to the next room."
MovePlayer(maze4)
}
}
MazeRoom maze3 "Maze"
{
n_to maze4
w_to maze2
u_to maze5
}
MazeRoom maze4 "Maze"
{
n_to maze1
e_to dead_end1
w_to maze3
}
MazeRoom maze5 "Maze"
{
long_desc
{
"This is part of a maze of twisty little passages, all
alike. A skeleton, probably the remains of a luckless
adventurer, lies here."
}
n_to maze3
sw_to maze6
e_to dead_end3
}
object skeleton "skeleton"
{
nouns "skeleton" "remains" "adventurer"
adjective "luckless"
article "a"
is hidden
in maze5
before
{
object DoGet
{
! This section of code was borrowed from
! colossal.hug
local c, i, j
"A ghost appears in the room and is appalled at your
desecration of the remains of a fellow adventurer. He
casts a curse on your valuables and banishes them to
the Land of the Living Dead. The ghost leaves,
muttering obscenities."
for i in player
{
if i is valuable
{
c++
}
}
for i in location
{
if i is valuable
{
c++
}
}
if c = 0
{
return true
}
else
{
while c > 0
{
for i in player
{
if i is valuable
{
j = i
}
}
for i in location
{
if i is valuable
{
j = i
}
}
move j to land_of_the_dead
c--
}
}
}
}
}
object rusty_knife "rusty knife"
{
noun "knife"
adjective "rusty"
article "a"
is weapon, sharp
in maze5
initial_desc
{
"Beside the skeleton is a rusty knife."
}
before
{
object DoGet
{
if Contains(player, sword)
{
"As you touch the rusty knife, your sword
gives a single pulse of blinding blue light."
return false
}
else
{
return false
}
}
xobject DoHit
{
if object is living
{
"As the knife approaches its victim, your
mind is submerged by an overmastering will.
Slowly, your hand turns, until the rusty
blade is an inch from your neck. The knife
seems to sing as it savagely slits your
throat."
NotDeadYet
}
else
{
return false
}
}
}
}
object burned_out_lantern "burned-out lantern"
{
nouns "lamp" "lantern"
adjective "burned-out"
article "a"
in maze5
is switchable
size 10
initial_desc
{
"The deceased adventurer's useless lantern is here."
}
before
{
object DoSwitchOn
{
"A burned-out lamp won't light."
}
object DoSwitchOff
{
"The lamp has already burned out."
}
}
}
object skeleton_key "skeleton key"
{
noun "key"
article "a"
size 10
in maze5
}
treasure coins "bag of coins"
{
nouns "coins" "bag"
article "a"
is container, not openable, not open
in maze5
take_points 10
deposit_points 5
initial_desc
{
"An old leather bag, bulging with coins, is here."
}
long_desc
{
"There are lots of coins in there."
}
before
{
object DoOpen
{
"The coins are safely inside; there's no need to
do that."
}
}
}
MazeRoom maze6 "Maze"
{
e_to maze7
w_to maze6
u_to maze9
d_to maze5
}
MazeRoom maze7 "Maze"
{
d_to { "You won't be able to get back up to the tunnel you are
going through when it gets to the next room."
MovePlayer(dead_end1)
}
s_to maze15
e_to maze8
w_to maze6
u_to maze14
}
MazeRoom maze8 "Maze"
{
ne_to maze7
se_to dead_end4
w_to maze8
}
MazeRoom maze9 "Maze"
{
n_to maze6
nw_to maze9
w_to maze12
s_to maze13
e_to maze10
d_to maze11
}
MazeRoom maze10 "Maze"
{
e_to maze9
w_to maze13
u_to maze11
}
MazeRoom maze11 "Maze"
{
d_to maze10
sw_to maze12
nw_to maze13
ne_to grating_room
}
MazeRoom maze12 "Maze"
{
d_to
{
"You won't be able to get back up to the tunnel you are
going through when it gets to the next room."
MovePlayer(maze5)
}
u_to maze9
e_to maze13
n_to dead_end2
sw_to maze11
}
MazeRoom maze13 "Maze"
{
s_to maze10
w_to maze11
e_to maze9
d_to maze12
}
MazeRoom maze14 "Maze"
{
nw_to maze14
w_to maze15
s_to maze7
ne_to maze7
}
MazeRoom maze15 "Maze"
{
threat_level 1
w_to maze14
s_to maze7
se_to cyclops_room
}
Dead_End_Room dead_end1 "Dead End"
{
s_to maze4
}
Dead_End_Room dead_end2 "Dead End"
{
s_to maze12
}
Dead_End_Room dead_end3 "Dead End"
{
w_to maze5
}
Dead_End_Room dead_end4 "Dead End"
{
n_to maze8
}
!---------------------------------------------------------------------------
! Cyclops Room and Immediate Area
!---------------------------------------------------------------------------
DarkRoom cyclops_room "Cyclops Room"
{
long_desc
{
"This room has an exit on the northwest, and a staircase
leading up."
}
is thief_free
threat_level 2
nw_to maze15
u_to
{
if cyclops in location and
cyclops is not unconscious
{
"The cyclops doesn't look like he'll let you past."
}
elseif player is not ghost and
thief is living
{
"You hear a scream of anguish as you violate the
robber's hideaway. Using passages unknown to you,
he rushes to its defense."
"The thief gestures mysteriously, and the treasures
in the room suddenly vanish."
move silver_chalice to thiefs_bag
move thief to treasure_room
thief is hostile
return treasure_room
}
else
{
return treasure_room
}
}
e_to
{
if cyclops in location and
cyclops is not unconscious
{
"The cyclops doesn't look like he'll let you past."
}
else
{
return strange_passage
}
}
}
DarkRoom treasure_room "Treasure Room"
{
long_desc
{
"This is a large room, whose east wall is solid granite. A
number of discarded bags, which crumble at your touch, are
scattered about on the floor. There is an exit down a
staircase."
}
room_points 25
d_to cyclops_room
e_to
{
"The east wall is solid granite here."
}
}
treasure silver_chalice "silver chalice"
{
noun "chalice"
adjective "chalice"
article "a"
in treasure_room
take_points 10
deposit_points 5
initial_desc
{
"There is a silver chalice, intricately engraved, here."
}
before
{
object DoGet
{
if thief is not unconscious
{
"You'd be stabbed in the back first."
}
else
{
return false
}
}
}
}
DarkRoom strange_passage "Strange Passage"
{
long_desc
{
"This is a long passage. To the west is one entrance. On
the east there is an old wooden door, with a large opening
in it (about cyclops sized)."
}
is thief_free
w_to cyclops_room
e_to living_room
}
DarkRoom east_west_passage "East-West Passage"
{
long_desc
{
"This is a narrow east-west passageway. There is a narrow
stairway leading down at the north end of the room."
}
w_to troll_room
e_to round_room
n_to chasm
d_to chasm
}
DarkRoom round_room "Round Room"
{
long_desc
{
"This is a circular stone room with passages in all
directions. Several of them have unfortunately been blocked
by cave-ins."
}
w_to east_west_passage
e_to loud_room
n_to north_south_passage
s_to narrow_passage
se_to engravings_cave
}
DarkRoom loud_room "Loud Room"
{
long_desc
{
"This is a large room with a ceiling which cannot be
detected from the ground. There is a narrow passage from
east to west and a stone stairway leading upward. ";
if self is special
{
"The room is eerie in its quietness."
}
else
{
"The room is deafeningly loud with an undetermined
rushing sound. The sound seems to reverberate from
all of the walls, making it difficult even to think."
}
}
is thief_free ! Keeps the thief from stealing the platinum bar
before
{
location DoEcho
{
if self is not special
{
"The acoustics of the room change subtly."
self is special
DescribePlace(loud_room, 1)
}
else
{
return false
}
}
location
{
if (word[1] = "go" or
word[1] = "walk") and
word[2] ~= ""
{
word[1] = word[2]
}
if self is special or
word[1] = "e" or
word[1] = "east" or
word[1] = "w" or
word[1] = "west" or
word[1] = "u" or
word[1] = "up" or
verbroutine = &DoSave or
verbroutine = &DoRestore or
verbroutine = &DoQuit
{
return false
}
else
{
if word[1] = "bug"
{
"That's only your opinion."
}
else
{
print word[words];
" ";
print word[words];
" ..."
words = 0
word[1] = ""
}
}
}
}
after
{
location
{
if reservoir_status = 3
{
"It is unbearably loud here, with an
ear-splitting roar seeming to come from all
around you. There is a pounding in your head
which won't stop. With a tremendous effort,
you scramble out of the room."
DoTooLoud
}
return false
}
}
w_to round_room
e_to damp_cave
u_to deep_canyon
}
treasure platinum_bar "platinum bar"
{
noun "bar"
adjectives "large" "platinum"
article "a"
in loud_room
take_points 10
deposit_points 5
initial_desc
{
"On the ground is a large platinum bar."
}
}
DarkRoom damp_cave "Damp Cave"
{
long_desc
{
"This cave has exits to the west and east, and narrows to a
crack toward the south. The earth is particularly damp here."
}
w_to loud_room
e_to beach_north
}
DarkRoom beach_north "White Cliffs Beach"
{
long_desc
{
"You are on a narrow strip of beach which runs along the
base of the White Cliffs. There is a narrow path heading
south along the Cliffs and a tight passage leading west
into the cliffs themselves."
}
is thief_free
w_to damp_cave
s_to
{
if Contains(player, magic_boat)
{
"The path is too narrow."
}
else
{
return beach_south
}
}
}
DarkRoom beach_south "White Cliffs Beach"
{
long_desc
{
"You are on a rocky, narrow strip of beach beside the Cliffs.
A narrow path leads north along the shore."
}
is thief_free
n_to
{
if Contains(player, magic_boat)
{
"The path is too narrow."
}
else
{
return beach_north
}
}
}
DarkRoom river1 "Frigid River"
{
long_desc
{
"You are on the Frigid River in the vicinity of the Dam.
The river flows quietly here. There is a landing on the
west shore."
}
is water_location, thief_free
w_to dam_base
}
DarkRoom river2 "Frigid River"
{
long_desc
{
"The river turns a corner here making it impossible to see
the Dam. The White Cliffs loom on the east bank and large
rocks prevent landing on the west."
}
is water_location, thief_free
}
DarkRoom river3 "Frigid River"
{
long_desc
{
"The river descends here into a valley. There is a narrow
beach on the west shore below the cliffs. In the distance
a faint rumbling can be heard."
}
is water_location, thief_free
w_to beach_north
}
DarkRoom river4 "Frigid River"
{
long_desc
{
"The river is running faster here and the sound ahead
appears to be that of rushing water. On the east shore
is a sandy beach. A small area of beach can also be seen
below the cliffs on the west shore."
}
is water_location, thief_free
w_to beach_south
e_to sandy_beach
}
object red_buoy "red buoy"
{
noun "buoy"
adjectives "red" "warning"
article "a"
in river4
is container, openable, not open
capacity 10
initial_desc
{
"There is a red buoy here (probably a warning)."
}
before
{
object DoTouch
{
"You notice something funny about the feel of
the buoy."
}
}
}
treasure large_emerald "large emerald"
{
noun "emerald"
adjective "large"
article "a"
take_points 5
deposit_points 10
in red_buoy
}
DarkRoom river5 "Frigid River"
{
long_desc
{
"The sound of rushing water is nearly unbearable here.
On the east shore is a large landing area."
}
is water_location, thief_free
e_to shore
}
scenery river "river"
{
noun "river"
adjective "frigid"
article "the"
is container, open
found_in dam_base, river1, river2, river3, river4, river5 \
sandy_beach, shore, beach_north, beach_south
capacity 100
before
{
xobject DoThrowIn
{
print CThe(object);
" floats for a moment, then sinks."
remove object
}
}
}
DarkRoom sandy_cave "Sandy Cave"
{
long_desc
{
"This is a sand-filled cave whose exit is to the
southwest."
}
is thief_free
sw_to sandy_beach
before
{
location DoDig
{
if object = ground and
xobject = shovel
{
hole_depth++
select hole_depth
case 1
{
"You seem to be digging a hole here."
}
case 2
{
"The hole is getting deeper, but
that's about it."
}
case 3
{
"You are surrounded by a wall of
sand on all sides."
}
case 4
{
"You can see a scarab here in the
sand."
move scarab to location
}
case 5
{
"The hole collapses, smothering you."
NotDeadYet
}
}
elseif object = ground and
xobject = hands
{
"Digging with the pair of hands is slow
and tedious."
}
else
{
return false
}
}
}
}
treasure scarab "beautiful jeweled scarab"
{
noun "scarab"
adjectives "beautiful" "jeweled"
article "a"
in nothing
take_points 5
deposit_points 5
initial_desc
{
"You can see a scarab here in the sand."
}
}
DarkRoom sandy_beach "Sandy Beach"
{
long_desc
{
"You are on a large sandy beach on the east shore of the
river, which is flowing quickly by. A path runs beside the
river to the south here, and a passage is partially buried
in sand to the northeast."
}
is thief_free
ne_to sandy_cave
s_to shore
}
object shovel "shovel"
{
noun "shovel"
article "a"
in sandy_beach
}
DarkRoom shore "Shore"
{
long_desc
{
"You are on the east shore of the river. The water here
seems somewhat treacherous. A path travels from north to
south here, the south end quickly turning around a sharp
corner."
}
is thief_free
n_to sandy_beach
s_to aragain_falls
}
DarkRoom aragain_falls "Aragain Falls"
{
long_desc
{
"You are at the top of Aragain Falls, an enormous
waterfall with a drop of about 450 feet. The only
path here is on the north end."
if rainbow is special
{
"A solid rainbow spans the falls."
}
else
{
"A beautiful rainbow can be seen over the
falls and to the west."
}
}
is thief_free
n_to shore
w_to
{
if rainbow is special
{
MovePlayer(on_the_rainbow)
}
else
{
"You can't go that way."
}
}
u_to
{
if rainbow is special
{
MovePlayer(on_the_rainbow)
}
else
{
"You can't go that way."
}
}
before
{
object DoClimb
{
if rainbow is special
{
MovePlayer(on_the_rainbow)
}
else
{
"You can't go that way."
}
}
}
}
LightRoom on_the_rainbow "On The Rainbow"
{
long_desc
{
"You are on top of a rainbow (I bet you never thought you
would walk on a rainbow), with a magnificent view of the
Falls. The rainbow travels east-west here."
}
is thief_free
e_to aragain_falls
w_to end_of_rainbow
}
DarkRoom narrow_passage "Narrow Passage"
{
long_desc
{
"This is a long and narrow corridor where a long north-south
passageway briefly narrows even further."
}
n_to round_room
s_to mirror_south
}
DarkRoom mirror_south "Mirror Room"
{
long_desc
{
"You are in a large square room with tall ceilings. On
the south wall is an enormous mirror which fills the entire
wall. There are exits on the other three sides of the room."
if mirror is special
{
"Unfortunately, the mirror has been destroyed by your
recklessness."
}
}
n_to narrow_passage
w_to winding_passage
e_to cave
}
scenery mirror "mirror"
{
noun "mirror"
adjectives "enormous" "large"
article "a"
found_in mirror_south, mirror_north
before
{
object DoGet
{
"The mirror is many times your size. Give up."
}
object DoLook
{
if self is not special
{
"There is an ugly person staring back at you."
}
else
{
"The mirror is broken into many pieces."
}
}
object DoTouch
{
if self is not special
{
"There is a rumble from deep within the earth
and the room shakes."
if location = mirror_south
{
MovePlayer(mirror_north)
}
else
{
MovePlayer(mirror_south)
}
}
else
{
return false
}
}
object DoHit
{
if self is not special
{
"You have broken the mirror. I hope you have
a seven years' supply of good luck handy."
self is special
}
else
{
"Haven't you done enough damage already?"
}
}
}
}
DarkRoom winding_passage "Winding Passage"
{
long_desc
{
"This is a winding passage. It seems that there are only
exits on the east and north."
}
n_to mirror_south
e_to cave
}
DarkRoom cave "Cave"
{
long_desc
{
"This is a tiny cave with entrances west and north, and a
dark, forbidding staircase leading down."
}
after
{
location
{
if Contains(player, candles) and
candles is light
{
"A gust of wind blows out your candles!"
candles is not light
candles is not heat_source
Deactivate(Candle)
FindLight(location)
}
}
}
n_to mirror_south
w_to winding_passage
d_to entrance_to_hades
}
DarkRoom entrance_to_hades "Entrance to Hades"
{
long_desc
{
"You are outside a large gateway, on which is inscribed\n"
"\_ Abandon every hope all ye who enter here!\n"
"The gate is open; through it you can see a desolation, with
a pile of mangled bodies in one corner. Thousands of voices,
lamenting some hideous fate, can be heard."
if black_book is not special
{
"The way through the gate is barred by evil spirits,
who jeer at your attempts to pass."
}
}
u_to cave
s_to
{
if black_book is not special
{
"Some invisible force prevents you from passing
through the gate."
}
else
{
return land_of_the_dead
}
}
}
DarkRoom land_of_the_dead "Land of the Dead"
{
long_desc
{
"You have entered the Land of the Living Dead. Thousands of
lost souls can be heard weeping and moaning. In the corner
are stacked the remains of dozens of previous adventurers
less fortunate than yourself. A passage exits to the north."
}
n_to entrance_to_hades
}
treasure skull "crystal skull"
{
noun "skull"
adjective "crystal" "carved"
article "a"
in land_of_the_dead
take_points 10
deposit_points 10
initial_desc
{
"Lying in one corner of the room is a beautifully carved
crystal skull. It appears to be grinning at you rather
nastily."
}
}
scenery pile_of_bodies "pile of bodies"
{
nouns "bodies" "remains"
adjective "pile"
article "a"
is plural
in land_of_the_dead
}
DarkRoom engravings_cave "Engravings Cave"
{
long_desc
{
"You have entered a low cave with passages leading northwest
and east."
}
nw_to round_room
e_to
{
if player is ghost
{
"As you enter the dome you feel a strong pull as if
from a wind drawing you over the railing and down."
return torch_room
}
else
{
return dome_room
}
}
}
object engravings "engravings"
{
noun "engravings"
adjective "old"
article "the"
is plural, static, readable
in engravings_cave
initial_desc
{
"There are old engravings on the walls here."
}
long_desc
{
"The engravings were incised in the living rock of the cave
wall by an unknown hand. They depict, in symbolic form, the
beliefs of the ancient Zorkers. Skillfully interwoven with
the bas reliefs are excerpts illustrating the major religious
tenets of that time. Unfortunately, a later age seems to have
considered them blasphemous and just as skillfully excised
them."
}
}
DarkRoom dome_room "Dome Room"
{
long_desc
{
"You are at the periphery of a large dome, which forms
the ceiling of another room below. Protecting you from a
precipitous drop is a wooden railing which circles the dome."
if railing is special
{
"Hanging down from the railing is a rope which ends
about ten feet from the floor below."
}
}
is thief_free
w_to engravings_cave
d_to
{
if railing is not special
{
"You cannot go down without fracturing many bones."
}
else
{
MovePlayer(torch_room)
}
}
}
scenery railing "wooden railing"
{
noun "railing"
adjectives "wood" "wooden"
article "a"
in dome_room
}
DarkRoom torch_room "Torch Room"
{
long_desc
{
"This is a large room with a prominent doorway leading
to a down staircase. Above you is a large dome. Up around
the edge of the dome (20 feet up) is a wooden railing. In
the center of the room sits a white marble pedestal."
if railing is special
{
"A piece of rope descends from the railing above,
ending some five feet above your head."
}
}
is thief_free
s_to temple
d_to temple
u_to
{
if railing is special
{
"You cannot reach the rope."
}
else
{
"You can't go that way."
}
}
}
scenery pedestal "pedestal"
{
noun "pedestal"
adjectives "white" "marble"
article "a"
is platform
}
treasure ivory_torch "ivory torch"
{
noun "torch"
adjective "ivory"
article "an"
take_points 14
deposit_points 6
is light, heat_source
in torch_room
initial_desc
{
"Sitting on the pedestal is a flaming torch, made of ivory."
}
before
{
object DoExtinguish
{
"You nearly burn your hand trying to extinguish the
flame."
}
}
}
DarkRoom temple "Temple"
{
long_desc
{
"This is the north end of a large temple. On the east wall
is an ancient inscription, probably a prayer in a
long-forgotten language. Below the prayer is a staircase
leading down. The west wall is solid granite. The exit to the
north end of the room is through huge marble pillars."
}
is thief_free
n_to torch_room
u_to torch_room
s_to altar_room
w_to
{
"The west wall is solid granite here."
}
e_to egyptian_room
d_to egyptian_room
}
scenery granite_wall "granite wall"
{
noun "wall"
adjective "granite"
article "the"
found_in treasure_room, temple
}
scenery inscriptions "inscriptions"
{
noun "inscriptions" "prayer" "language"
adjective "long-forgotten"
article "the"
is readable
long_desc
{
"The prayer is inscribed in an ancient script, rarely used
today. It seems to be a philippic against small insects,
absent-mindedness, and the picking up and dropping of small
objects. The final verse consigns trespassers to the land of
the dead. All evidence indicates that the beliefs of the
ancient Zorkers were obscure."
}
}
object brass_bell "brass bell"
{
noun "bell"
adjective "brass"
article "a"
in temple
before
{
object DoRing
{
if location = entrance_to_hades and
Contains(player, brass_bell)
{
"The bell suddenly becomes red hot and falls
to the ground. The wraiths, as if paralyzed,
stop their jeering and slowly turn to face
you. On their ashen faces, the expression of
a long-forgotten terror takes shape."
remove brass_bell
move red_hot_bell to location
ceremony_1 = 1
Activate(HotBell, 20)
Activate(Ceremony, 5)
if Contains(player, candles)
{
"In your confusion, the candles drop
to the ground (and they are out)."
move candles to location
candles is not light
candles is not heat_source
Deactivate(Candle)
FindLight(location)
}
}
else
{
"Ding, dong."
}
}
}
}
object red_hot_bell "red hot brass bell"
{
noun "bell"
adjectives "brass" "red" "hot"
article "a"
in nothing
long_desc
{
"On the ground is a red hot bell."
}
before
{
object DoGet
{
"The bell is very hot and cannot be taken."
}
object DoTouch
{
"The bell is too hot to touch."
}
object DoRing
{
"The bell is too hot to reach."
}
}
}
DarkRoom altar_room "Altar"
{
long_desc
{
"This is the south end of a large temple. In front of you is
what appears to be an altar. In one corner is a small hole in
the floor which leads into darkness. You probably could not
get back up it."
}
is thief_free
n_to temple
d_to
{
if Contains(player, coffin)
{
"You haven't a prayer of getting the coffin down
there."
}
else
{
MovePlayer(cave)
}
}
before
{
location
{
! Starts the candle burn-down timer when the
! player first enter the room
if self is not special
{
Activate(Candle)
self is special
}
return false
}
}
}
scenery altar "altar"
{
noun "altar"
article "an"
is platform
capacity 10
in altar_room
}
object black_book "black book"
{
nouns "book" "prayer"
adjectives "large" "black" "page" "pages" "569"
article "a"
is readable, container, openable, open
size 10
in altar_room
initial_desc
{
"On the altar is a large black book, open to page 569."
}
long_desc
{
if Ceremony_1 and
Ceremony_2
{
"Each word of the prayer reverberates through the
hall in a deafening confusion. As the last word
fades, a voice, loud and commanding, speaks:
\"Begone, fiends!\" A heart-stopping scream fills the
cavern, and the spirits, sensing a greater power,
flee through the walls."
Deactivate(Ceremony)
self is special
}
else
{
"Commandment #12592\n"
"Oh ye who go about saying unto each: \"Hello sailor\":"
"Dost thou know the magnitude of thy sin before the gods?"
"Yea, verily, thou shalt be ground between two stones."
"Shall the angry gods cast thy body into the whirlpool?"
"Surely, thy eye shall be put out with a sharp stick!"
"Even unto the ends of the earth shalt thou wander and"
"Unto the land of the dead shalt thou be sent at last."
"Surely thou shalt repent of thy cunning."
}
}
before
{
object DoClose
{
"As hard as you try, the book cannot be closed."
}
object DoOpen
{
"The book is already open to page 569."
}
object DoTurn
{
"Beside page 569, there is only one other page with
any legible printing on it. Most of it is unreadable,
but the subject seems to be the banishment of evil.
Apparently, certain noises, lights, and prayers are
efficacious in this regard."
}
object DoBurn
{
if xobject is heat_source
{
"A booming voice says \"Wrong, cretin!\" and
you notice that you have turned into a pile
of dust. How, I can't imagine."
NotDeadYet
}
else
{
return false
}
}
}
}
object candles "pair of candles"
{
nouns "candles" "candle"
adjectives "pair"
article "a"
is plural, light, heat_source
in altar_room
initial_desc
{
if candles is light
{
"On the two ends of the altar are burning candles."
}
else
{
"On the two ends of the altar are a pair of
candles."
}
}
long_desc
{
"The candles are ";
if self is light
{
"burning."
}
else
{
"out."
}
}
before
{
object DoExtinguish
{
"The flame is extinguished."
candles is not light
candles is not heat_source
Deactivate(Candle)
FindLight(location)
}
object DoCount
{
"Let's see, how many objects in a pair? Don't
tell me, I'll get it."
}
object DoBurn
{
if xobject = ivory_torch and
candles is not light
{
"The heat from the torch is so intense that
the candles are vaporized."
remove candles
}
elseif xobject = ivory_torch and
candles is light
{
"You realize, just in time, that the candles
are already lighted."
}
elseif xobject = matchbook and
matchbook is light and
candles is not light and
location = entrance_to_hades and
Ceremony_1 = 1 and
Contains(player, candles) and
candle_life > 0
{
"The flames flicker wildly and appear
to dance. The earth beneath your feet
trembles, and your legs nearly buckle
beneath you. The spirits cower at your
unearthly power."
candles is light
candles is heat_source
Activate(Candle)
Ceremony_2 = 1
}
elseif xobject = matchbook and
matchbook is light and
candles is not light and
candle_life > 0
{
"The candles are lit."
candles is light
Activate(Candle)
}
elseif xobject = matchbook and
matchbook is light and
candles is light
{
"The candles are already lit."
}
elseif xobject = matchbook and
matchbook is light and
candle_life = 0
{
"Alas, there's not much left of the candles.
Certainly not enough to burn."
}
else
{
return false
}
}
}
after
{
object DoGet
{
if candles is light and
location = entrance_to_hades and
Ceremony_1 = 1
{
"The flames flicker wildly and appear
to dance. The earth beneath your feet
trembles, and your legs nearly buckle
beneath you. The spirits cower at your
unearthly power."
candles is light
Ceremony_2 = 1
}
return false
}
}
}
DarkRoom egyptian_room "Egyptian Room"
{
long_desc
{
"This is a room which looks like an Egyptian tomb. There is
an ascending staircase to the west."
}
is thief_free
w_to temple
u_to temple
}
treasure coffin "gold coffin"
{
noun "coffin"
adjectives "gold" "solid-gold"
article "a"
is container, openable
capacity 50
size 60
in egyptian_room
take_points 10
deposit_points 15
initial_desc
{
"The solid-gold coffin used for the burial of Ramses II
is here."
}
contains_desc
{
"Inside the coffin is";
}
}
treasure sceptre "sceptre"
{
nouns "sceptre" "scepter" "enamel"
adjectives "sharp" "colored"
article "a"
is sharp
in coffin
take_points 4
deposit_points 6
initial_desc
{
"A sceptre, possibly that of ancient Egypt itself, is in
the coffin. The sceptre is ornamented with colored enamel,
and tapers to a sharp point."
}
short_desc
{
"An ornamented sceptre, tapering to a sharp point, is here."
}
before
{
object DoWave
{
if (location = aragain_falls or
location = end_of_rainbow) and
rainbow is not special
{
"Suddenly, the rainbow appears to become
solid and, I venture, walkable (I think
the giveaway was the stairs and bannister)."
rainbow is special
if pot_of_gold in nothing and
location = end_of_rainbow
{
"A shimmering pot of gold appears at
the end of the rainbow."
move pot_of_gold to end_of_rainbow
}
}
elseif (location = aragain_falls or
location = end_of_rainbow) and
rainbow is special
{
"The rainbow seems to have become somewhat
run-of-the-mill."
rainbow is not special
}
elseif location = on_the_rainbow
{
"The structural integrity of the rainbow is
severely compromised, leaving you hanging in
mid-air, supported only by water vapor. Bye."
rainbow is not special
NotDeadYet
}
else
{
"A dazzling display of color briefly
emanates from the sceptre."
}
}
}
}
DarkRoom north_south_passage "North-South Passage"
{
long_desc
{
"This is a high north-south passage, which forks to the
northeast."
}
n_to chasm
s_to round_room
ne_to deep_canyon
}
DarkRoom chasm "Chasm"
{
long_desc
{
"A chasm runs southwest to northeast and the path follows it.
You are on the south side of the chasm, where a crack opens
into a passage."
}
before
{
location DoJump
{
"This was not a very safe place to try jumping."
JumpMessage
NotDeadYet
}
}
s_to north_south_passage
sw_to east_west_passage
u_to east_west_passage
ne_to reservoir_south
}
DarkRoom deep_canyon "Deep Canyon"
{
long_desc
{
"You are on the south edge of a deep canyon. Passages
lead off to the east, northwest and southwest. A stairway
leads down.";
if reservoir_status = 3
{
" You can hear a loud roaring sound, like that of
rushing water, from below."
}
else
{
""
}
}
e_to dam
sw_to north_south_passage
d_to loud_room
nw_to reservoir_south
}
LightRoom dam "Dam"
{
long_desc
{
"You are standing on the top of the Flood Control Dam
#3, which was quite a tourist attraction in times far
distant. There are paths to the north, south, and west,
and a scramble down."
! 1 = reservoir full
! 2 = reservoir drained
! 3 = reservoir draining
! 4 = reservoir filling
select reservoir_status
case 1
{
"The sluice gates on the dam are closed. Behind the
dam, there can be seen a wide reservoir. Water is
pouring over the top of the now abandoned dam."
}
case 2
{
"The water level behind the dam is low: The sluice
gates have been opened. Water rushes through the dam
and downstream."
}
case 3
{
"The sluice gates are open, and water rushes through
the dam. The water level behind the dam is still high."
}
case 4
{
"The sluice gates are closed. The water level in the
reservoir is quite low, but the level is rising
quickly."
}
}
n_to dam_lobby
s_to deep_canyon
e_to dam_base
d_to dam_base
w_to reservoir_south
}
scenery sluice_gate "sluice gate"
{
nouns "dam" "gate" "gates"
adjective "sluice"
article "the"
in dam
}
object control_panel "control panel"
{
nouns "panel" "box"
adjective "control"
article "a"
is static
in dam
initial_desc
{
"There is a control panel here, on which a large metal
bolt is mounted. Directly above the bolt is a small green
plastic bubble";
if yellow_button is special
{
" which is glowing serenely";
}
"."
}
}
scenery bolt "bolt"
{
noun "bolt"
adjectives "large" "metal"
article "a"
in control_panel
before
{
object DoTurn
{
if not xobject
{
return false
}
elseif xobject ~= wrench
{
"The bolt won't turn using ";
print The(xobject);
"."
return true
}
elseif xobject = wrench and
yellow_button is not special
{
"The bolt won't turn with your best effort."
return true
}
elseif xobject = wrench and
sluice_gate is special and ! special = open
yellow_button is special
{
"The sluice gates close and water
starts to collect behind the dam."
reservoir_status = 4
sluice_gate is not special
Deactivate(EmptyDam)
Activate(FillDam)
return true
}
elseif xobject = wrench and
sluice_gate is not special and
yellow_button is special
{
"The sluice gates open and water
pours through the dam."
Deactivate(FillDam)
Activate(EmptyDam)
reservoir_status = 3
sluice_gate is special
return true
}
else
{
return false
}
}
}
}
object wrench "wrench"
{
noun "wrench"
adjective "large"
article "a"
in maintenance_room
long_desc
{
"Wrench."
}
}
LightRoom dam_base "Dam Base"
{
long_desc
{
"You are at the base of Flood Control Dam #3, which looms
above you and to the north. The river Frigid is flowing by
here. Along the river are the White Cliffs which seem to
form giant walls stretching from north to south along the
shores of the river as it winds its way downstream."
}
is thief_free
n_to dam
u_to dam
}
object pile_of_plastic "pile of plastic"
{
nouns "plastic" "valve" "boat"
adjective "pile"
article "a"
is burnable
in dam_base
short_desc
{
"There is a folded pile of plastic here which has a small
valve attached."
}
before
{
object DoPump
{
if Contains(player, pile_of_plastic)
{
"The boat must be on the ground to be
inflated."
}
elseif xobject = air_pump
{
"The boat inflates and appears seaworthy."
remove pile_of_plastic
move magic_boat to location
move tan_label to magic_boat
WhatsIn(magic_boat)
}
else
{
return false
}
}
object DoCut
{
if xobject is not weapon
{
return false
}
else
{
"You skillfully slice ";
print The(object);
" into innumerable slivers which
blow away."
remove pile_of_plastic
}
}
}
}
object punctured_boat "punctured boat"
{
noun "boat"
adjective "punctured"
article "a"
is burnable
in nothing
before
{
object DoPump
{
if xobject = air_pump
{
"No chance. Some moron punctured it."
}
else
{
return false
}
}
object DoPatch
{
if xobject = viscous_material
{
"Well done. The boat is repaired."
viscous_material is special
}
}
object DoCut
{
if xobject is not weapon
{
return false
}
else
{
"You skillfully slice ";
print The(object);
" into innumerable slivers which
blow away."
remove punctured_boat
}
}
}
}
boat magic_boat "magic boat"
{
noun "boat"
adjective "magic" "seaworthy"
article "a"
in nothing
capacity 100
reach magic_boat, river4 ! so player can reach the buoy
before
{
parent(player) DoGo
{
if location is not water_location
{
"You'll have to get out of the magic boat
first."
return true
}
if word[1] = "go" and
word[2] ~= ""
{
word[1] = word[2]
}
if (word[1] = "e" or
word[1] = "east")
{
if location = stream
{
move magic_boat to reservoir
location = reservoir
DescribePlace(location, 1)
}
elseif location = river2
{
"The White Cliffs prevent your
landing here."
return true
}
elseif location = river4
{
move magic_boat to sandy_beach
location = sandy_beach
DescribePlace(location, 1)
Deactivate(RiverCurrent)
}
elseif location = river5
{
move magic_boat to shore
location = shore
DescribePlace(location, 1)
Deactivate(RiverCurrent)
}
else
{
return false
}
}
elseif (word[1] = "w" or
word[1] = "west")
{
if location = stream
{
"The channel is too narrow."
return true
}
elseif location = reservoir
{
if reservoir_status ~= 1
{
return false
}
else
{
move magic_boat to stream
location = stream
DescribePlace(location, 1)
}
}
elseif location = river1
{
move magic_boat to dam_base
location = dam_base
DescribePlace(location, 1)
Deactivate(RiverCurrent)
}
elseif location = river2
{
"Just in time you steer away from
the rocks."
return true
}
elseif location = river3
{
move magic_boat to beach_north
location = beach_north
DescribePlace(location, 1)
Deactivate(RiverCurrent)
}
elseif location = river4
{
move magic_boat to beach_south
location = beach_south
DescribePlace(location, 1)
Deactivate(RiverCurrent)
}
else
{
return false
}
}
elseif (word[1] = "n" or
word[1] = "north")
{
if location = reservoir
{
move magic_boat to reservoir_north
location = reservoir_north
DescribePlace(location, 1)
}
else
{
"Read the label for the boat's
instructions."
return true
}
}
elseif (word[1] = "s" or
word[1] = "south")
{
if location = reservoir
{
move magic_boat to reservoir_south
location = reservoir_south
DescribePlace(location, 1)
}
elseif location = stream
{
move magic_boat to stream_view
location = stream_view
DescribePlace(location, 1)
}
else
{
"Read the label for the boat's
instructions."
return true
}
}
elseif verbroutine = &DoGo
{
"Read the label for the boat's
instructions."
return true
}
}
object DoPump
{
if xobject = air_pump
{
"Inflating it further would probably
burst it."
}
else
{
return false
}
}
object DoDeflate
{
if parent(player) = self
{
"You can't deflate the boat while you're
in it."
}
elseif Contains(player, magic_boat)
{
"The boat must be on the ground to be
deflated."
}
else
{
"The boat deflates."
remove magic_boat
move pile_of_plastic to location
remove tan_label
}
}
object DoCut
{
if xobject is not weapon
{
return false
}
else
{
if parent(player) = self
{
"Not a bright idea, especially since
you're in it."
}
else
{
"You skillfully slice ";
print The(object);
" into innumerable slivers which
blow away."
remove magic_boat
}
}
}
object DoClimb
{
Perform(&DoEnter, self)
}
object DoEnter
{
local c, i
for i in player
{
if i is sharp
{
c++
}
}
if Contains(player, magic_boat)
{
"You'll have to put it down first."
return true
}
elseif c > 0
{
"Oops! Something sharp seems to have slipped
and punctured the boat. The boat deflates to
the sounds of hissing, sputtering, and
cursing."
remove magic_boat
move punctured_boat to location
}
else
{
return false
}
}
object DoPoke
{
if xobject is sharp
{
DoDrown
}
else
{
return false
}
}
}
}
object tan_label "tan label"
{
noun "label"
adjective "tan"
article "a"
in nothing
is readable
long_desc
{
"\_ !!!! FROBOZZ MAGIC BOAT COMPANY !!!!\n"
"Hello, Sailor!\n"
"Instructions for use:\n"
"\_ To get into a body of water, say \"Launch\"."
"\_ To get to shore, say \"Land\" or the direction in
which you want to maneuver the boat.\n"
"Warranty:\n"
"\_ This boat is guaranteed against all defects for a period
of 76 milliseconds from date of purchase or until first
used, whichever comes first.\n"
"Warning:"
"\_ This boat is made of thin plastic."
"\_ Good Luck!"
}
}
LightRoom dam_lobby "Dam Lobby"
{
long_desc
{
"This room appears to have been the waiting room for groups
touring the dam. There are open doorways here to the north
and east marked \"Private\", and there is a path leading south
over the top of the dam."
}
is thief_free
s_to dam
n_to
{
if maint_room_level = 14
{
"The room is full of water and cannot be entered."
}
else
{
MovePlayer(maintenance_room)
}
}
e_to
{
if maint_room_level = 14
{
"The room is full of water and cannot be entered."
}
else
{
MovePlayer(maintenance_room)
}
}
}
object guidebook "guidebook"
{
noun "guidebook" "guidebooks" "book" "books"
adjective "guide"
article "a"
is plural, readable, burnable
in dam_lobby
initial_desc
{
"Some guidebooks entitled \"Flood Control Dam #3\" are on
the reception desk."
}
long_desc
{
"\"\_ Flood Control Dam #3\n"
"FCD#3 was constructed in year 783 of the Great Underground
Empire to harness the mighty Frigid River. This work was
supported by a grant of 37 million zorkmids from your
omnipotent local tyrant Lord Dimwit Flathead the Excessive.
This impressive structure is composed of 370,000 cubic feet
of concrete, is 256 feet tall at the center, and 193 feet
wide at the top. The lake created behind the dam has a volume
of 1.7 billion cubic feet, an area of 12 million square feet,
and a shore line of 36 thousand feet.\n"
"We will now point out some of the more interesting features
of FCD#3 as we conduct you on a guided tour of the
facilities:\n"
"\_ 1) You start your tour here in the Dam Lobby. You
will notice on your right that....\""
}
}
object matchbook "matchbook"
{
nouns "matchbook" "matches" "match"
article "a"
in dam_lobby
is readable, container, openable, not open
initial_desc
{
"There is a matchbook whose cover says \"Visit Beautiful
FCD#3\" here."
}
long_desc
{
"The matchbook isn't very interesting, except for what's
written on it."
}
before
{
object DoOpen
{
if match_count > 0
{
"You have ";
print number match_count;
if match_count = 1
" match."
else
" matches."
}
else
{
"You have no matches."
}
}
object DoBurn
{
if match_count > 0 and
location = timber_room
{
"This room is drafty, and the match goes
out instantly."
match_count--
}
elseif match_count > 0 and
location = gas_room
{
"How sad for an aspiring adventurer to light
a match in a room which reeks of gas.
Fortunately, there is justice in the
world.\n"
"\_ ** BOOOOOOOOOOOM **"
match_count--
NotDeadYet
}
elseif match_count > 0
{
"One of the matches starts to burn."
match_count--
self is light
self is heat_source
Activate(Match, 2)
}
else
{
"I'm afraid that you have run out of
matches."
}
}
object DoRead
{
"(Close cover before striking)\n"
"YOU too can make BIG MONEY in the exciting field of
PAPER SHUFFLING!\n"
"Mr. Anderson of Muddle, Mass. says: \"Before I took
this course I was a lowly bit twiddler. Now with what
I learned at GUE Tech I feel really important and can
obfuscate and confuse with the best.\"\n"
"Dr. Blank had this to say: \"Ten short days ago all
I could look forward to was a dead-end job as a
doctor. Now I have a promising future and make really
big Zorkmids.\"\n"
"GUE Tech can't promise these fantastic results to
everyone. But when you earn your degree from GUE
Tech, your future will be brighter."
}
}
}
DarkRoom maintenance_room "Maintenance Room"
{
long_desc
{
"This is what appears to have been the maintenance room for
Flood Control Dam #3. Apparently, this room has been
ransacked recently, for most of the valuable equipment is
gone. On the wall in front of you is a group of buttons
colored blue, yellow, brown, and red. There are doorways to
the west and south."
}
is thief_free
s_to dam_lobby
w_to dam_lobby
}
scenery blue_button "blue button"
{
noun "button"
adjective "blue"
article "a"
in maintenance_room
before
{
object DoPush
{
if self is not special
{
"There is a rumbling sound and a stream of
water appears to burst from the east wall of
the room (apparently, a leak has occurred in
a pipe)."
self is special
move leak to maintenance_room
Activate(FillMaintRoom)
}
else
{
"The blue button appears to be jammed."
}
}
object DoPatch
{
if xobject = viscous_material
{
"By some miracle of Zorkian technology, you
have managed to stop the leak in the dam."
viscous_material is special
Deactivate(FillMaintRoom)
return true
}
return false
}
}
}
scenery leak "leak"
{
nouns "pipe" "leak"
adjective "water"
article "the"
in nothing
}
scenery yellow_button "yellow button"
{
noun "button"
adjective "yellow"
article "a"
in maintenance_room
before
{
object DoPush
{
"Click."
self is special ! Turns on control panel
}
}
}
scenery brown_button "brown button"
{
noun "button"
adjective "brown"
article "a"
in maintenance_room
before
{
object DoPush
{
"Click."
yellow_button is not special ! Turns off control panel
}
}
}
scenery red_button "red button"
{
noun "button"
adjective "red"
article "a"
in maintenance_room
before
{
object DoPush
{
"Click."
"The lights within the room ";
if self is light
{
"shut off."
self is not light
}
else
{
"come on."
self is light
}
FindLight(location)
}
}
}
object screwdriver "screwdriver"
{
noun "screwdriver"
article "a"
in maintenance_room
}
object tube "tube"
{
noun "tube"
article "a"
in maintenance_room
is readable, container, openable, not open
initial_desc
{
"There is an object which looks like a tube of
toothpaste here."
}
long_desc
{
"---> Frobozz Magic Gunk Company <---"
"\_ All-Purpose Gunk"
}
before
{
object DoSqueeze
{
if tube is open and
children(tube) = 1
{
"The viscous material oozes into your hand."
move viscous_material to you
}
elseif tube is not open
{
"The tube is closed."
}
elseif children(tube) = 0
{
"The tube is apparently empty."
}
}
xobject DoPutIn
{
{
"The tube refuses to accept anything."
}
}
}
}
object viscous_material "viscous material"
{
nouns "material" "gunk"
adjectives "viscous" "all-purpose"
article "the"
in tube
before
{
xobject DoOil
{
if self is special ! special = player knows it is glue
{
"The all-purpose gunk isn't a lubricant."
}
else
{
"Hmm. It appears the tube contained glue,
not oil. Turning the bolt won't get any
easier...."
}
}
}
}
object toolchests "group of tool chests"
{
nouns "chest" "chests"
adjectives "tool" "group"
article "a"
is plural, container, not open
in maintenance_room
capacity 10
long_desc
{
"The chests are all empty."
}
before
{
object DoOpen, DoPutIn, DoGet, DoTouch
{
"The chests are so rusty and corroded that
they crumble when you touch them."
remove toolchests
}
}
}
DarkRoom reservoir_south "Reservoir South"
{
long_desc
{
! 1 = reservoir full
! 2 = reservoir drained
! 3 = reservoir draining
! 4 = reservoir filling
select reservoir_status
case 1
{
"You are in a long room on the south shore of a large
lake, far too deep and wide for crossing."
}
case 2
{
"You are in a long room, to the north of which was
formerly a lake. However, with the water level
lowered, there is merely a wide stream running
through the center of the room."
}
case 3
{
"You are in a long room. To the north is a large lake,
too deep to cross. You notice, however, that the water
level appears to be dropping at a rapid rate. Before
long, it might be possible to cross to the other side from
here."
}
case 4
{
"You are in a long room, to the north of which is a
wide area which was formerly a reservoir, but now is
merely a stream. You notice, however, that the level
of the stream is rising quickly and that before long
it will be impossible to cross here."
}
"There is a path along the stream to the east or west, a
steep pathway climbing southwest along the edge of a chasm,
and a path leading into a canyon to the southeast."
}
e_to dam
w_to stream_view
n_to
{
if reservoir_status = 1 or
reservoir_status = 3
{
"You'd drown."
}
else
{
MovePlayer(reservoir)
}
}
sw_to chasm
se_to deep_canyon
}
DarkRoom stream_view "Stream View"
{
long_desc
{
"You are standing on a path beside a gently flowing stream.
The path follows the stream, which flows from west to east."
}
e_to reservoir_south
}
DarkRoom stream "Stream"
{
long_desc
{
"You are on the gently flowing stream. The upstream route is
too narrow to navigate, and the downstream route is invisible
due to twisting walls. There is a narrow beach to land on."
}
is water_location, thief_free
s_to stream_view
e_to reservoir
}
scenery water_in_stream "stream"
{
nouns "stream"
article "the"
found_in stream, stream_view
}
DarkRoom reservoir "Reservoir"
{
long_desc
{
if reservoir_status = 1 or
reservoir_status = 3
{
"You are on the lake. Beaches can be seen north and
south. Upstream a small stream enters the lake
through a narrow cleft in the rocks. The dam can
be seen downstream."
}
else
{
"You are on what used to be a large lake, but which
is now a large mud pile. There are \"shores\" to the
north and south."
}
}
is water_location, thief_free
w_to
{
"You can't go there without a vehicle."
}
s_to reservoir_south
n_to reservoir_north
}
scenery lake "lake"
{
nouns "lake" "reservoir"
article "the"
found_in reservoir_south, reservoir_north, reservoir
long_desc
{
if reservoir_status = 2 ! Drained
{
"There's not much lake left...."
}
else
{
return false
}
}
}
treasure trunk_of_jewels "trunk of jewels"
{
nouns "trunk" "jewels" "chest"
article "a"
take_points 15
deposit_points 5
in nothing
is container, not openable, not open
initial_desc
{
"Lying half buried in the mud is an old trunk, bulging with
jewels."
}
short_desc
{
"There is an old trunk here, bulging with assorted jewels."
}
before
{
object DoOpen
{
"The jewels are safely inside; there's no need to
do that."
}
object DoLook, DoLookIn
{
"There are lots of jewels in there."
}
}
}
DarkRoom reservoir_north "Reservoir North"
{
long_desc
{
! 1 = reservoir full
! 2 = reservoir drained
! 3 = reservoir draining
! 4 = reservoir filling
select reservoir_status
case 1
{
"You are in a large cavernous room, north of a large
lake."
}
case 2
{
"You are in a large cavernous room, the south of
which was formerly a lake. However, with the water
level lowered, there is merely a wide stream running
through there."
}
case 3
{
"You are in a large cavernous area. To the south is
a wide lake, whose water level appears to be falling
rapidly."
}
case 4
{
"You are in a cavernous area, to the south of which
is a very wide stream. The level of the stream is
rising rapidly, and it appears that before long it
will be impossible to cross to the other side."
}
"There is a slimy stairway leaving the room to the north."
}
n_to atlantis_room
s_to
{
if reservoir_status = 1 or
reservoir_status = 3
{
"You'd drown."
}
else
{
MovePlayer(reservoir)
}
}
}
object air_pump "hand-held air pump"
{
noun "pump"
adjectives "hand-held" "air"
article "a"
in reservoir_north
}
DarkRoom atlantis_room "Atlantis Room"
{
long_desc
{
"This is an ancient room, long under water. There is an exit
to the south and a staircase leading up."
}
u_to cave2
s_to reservoir_north
}
treasure trident "crystal trident"
{
noun "trident"
adjective "crystal"
article "a"
in atlantis_room
take_points 4
deposit_points 11
initial_desc
{
"On the shore lies Poseidon's own crystal trident."
}
}
DarkRoom cave2 "Cave"
{
long_desc
{
"This is a tiny cave with entrances west and north, and a
staircase leading down."
}
s_to atlantis_room
d_to atlantis_room
n_to mirror_north
w_to twisting_passage
}
DarkRoom twisting_passage "Twisting Passage"
{
long_desc
{
"This is a winding passage. It seems that there are only
exits on the east and north."
}
n_to mirror_north
e_to cave2
}
DarkRoom mirror_north "Mirror Room"
{
long_desc
{
"You are in a large square room with tall ceilings. On
the south wall is an enormous mirror which fills the entire
wall. There are exits on the other three sides of the room."
if mirror is special
{
"Unfortunately, the mirror has been destroyed by your
recklessness."
}
}
n_to cold_passage
w_to twisting_passage
e_to cave2
}
DarkRoom cold_passage "Cold Passage"
{
long_desc
{
"This is a cold and damp corridor where a long east-west
passageway turns into a southward path."
}
s_to mirror_north
w_to slide_room
}
DarkRoom slide_room "Slide Room"
{
long_desc
{
"This is a small chamber, which appears to have been part of
a coal mine. On the south wall of the chamber the letters
\"Granite Wall\" are etched in the rock. To the east is a
long passage, and there is a steep metal slide twisting
downward. To the north is a small opening."
}
n_to mine_entrance
e_to cold_passage
d_to cellar
}
scenery slide "slide"
{
nouns "slide" "chute"
adjectives "metal" "steep"
article "the"
is container, open
door_to cellar
found_in slide_room
capacity 100
before
{
xobject DoThrowIn, DoPutIn
{
print CThe(object);
" falls into the slide and is gone."
move object to cellar
}
}
}
scenery fake_granite "granite wall"
{
noun "wall"
adjective "granite"
article "the"
in slide_room
long_desc
{
local a
a = random(2)
select a
case 1
{
"It only SAYS \"Granite Wall\"."
}
case 2
{
"The wall isn't granite."
}
}
}
DarkRoom mine_entrance "Mine Entrance"
{
long_desc
{
"You are standing at the entrance of what might have been a
coal mine. The shaft enters the west wall, and there is
another exit on the south end of the room."
}
s_to slide_room
w_to squeaky_room
}
DarkRoom squeaky_room "Squeaky Room"
{
long_desc
{
"You are in a small room. Strange squeaky sounds may be heard
coming from the passage at the north end. You may also escape
to the east."
}
threat_level 1
n_to bat_room
e_to mine_entrance
}
DarkRoom bat_room "Bat Room"
{
long_desc
{
"You are in a small room which has doors only to the east
and south."
}
is thief_free
threat_level 2
s_to squeaky_room
e_to shaft_room
after
{
location
{
if bat is not special
{
local i, f
for (i=0; i<3; i++)
{
"\_ Fweep!"
}
"\n\nThe bat grabs you by the scruff of your
neck and lifts you away...."
f = random(7)
select f
case 1
{
MovePlayer(mine_entrance)
}
case 2
{
MovePlayer(shaft_room)
}
case 3
{
MovePlayer(coal_mine1)
}
case 4
{
MovePlayer(coal_mine2)
}
case 5
{
MovePlayer(coal_mine3)
}
case 6
{
MovePlayer(coal_mine4)
}
case 7
{
MovePlayer(ladder_top)
}
}
if f = 2
{
current_threat_level = 1
old_threat_level = 0
}
else
{
current_threat_level = 0
}
return false
}
}
}
object bat "bat"
{
noun "bat"
adjective "vampire"
article "a"
in bat_room
is living
short_desc
{
if garlic in player or
garlic in bat_room
{
"In the corner of the room on the ceiling
is a large vampire bat who is obviously
deranged and holding his nose."
self is special
}
else
{
"A large vampire bat, hanging from the
ceiling, swoops down at you!"
self is not special
}
}
before
{
object DoGet, DoHit
{
"You can't reach him; he's on the ceiling."
}
object DoTalk
{
local i
for (i=0; i<5; i++)
{
"\_ Fweep!"
}
"\n\nThe bat pauses for a moment, perhaps thinking
that you should re-read the manual."
}
}
}
treasure jade_figurine "exquisite jade figurine"
{
nouns "figurine" "figure" "statue"
adjectives "jade" "exquisite"
article "an"
in bat_room
take_points 5
deposit_points 5
initial_desc
{
"There is an exquisite jade figurine here."
}
}
DarkRoom shaft_room "Shaft Room"
{
long_desc
{
"This is a large room, in the middle of which is a small
shaft descending through the floor into darkness below. To
the west and the north are exits from this room. Constructed
over the top of the shaft is a metal framework to which a
heavy iron chain is attached."
}
is thief_free
threat_level 1
w_to bat_room
n_to smelly_room
}
scenery chain "iron chain"
{
noun "chain"
adjective "iron"
article "the"
found_in shaft_room, drafty_room
long_desc
{
"The chain secures a basket within the shaft."
}
before
{
object DoGet, DoPull
{
"The chain is secure."
}
object DoRaise, DoLower
{
"Perhaps you should do that to the basket."
}
}
}
object real_cage "basket"
{
nouns "cage" "basket"
adjective "iron"
article "the"
in shaft_room
is static, container
capacity 40
initial_desc
{
"At the end of the chain is a basket."
}
long_desc
{
if children(real_cage) = 0
{
"The cage is empty."
}
else
{
WhatsIn(real_cage)
}
}
before
{
object DoGet
{
"The cage is securely fastened to the iron chain."
}
object DoRaise
{
Already_done
}
object DoLower
{
if self is not special
{
"The basket is lowered to the bottom of the
shaft."
move real_cage to drafty_room
move dummy_cage to shaft_room
FindLight(location)
}
}
}
}
scenery dummy_cage "basket"
{
nouns "cage" "basket"
adjective "iron"
article "the"
in nothing
is container
long_desc
{
"The basket is at the other end of the chain."
}
before
{
xobject DoPutIn
{
"The basket is at the other end of the chain."
}
object DoGet
{
"The basket is at the other end of the chain."
}
object DoRaise
{
"The basket is raised to the top of the shaft."
move real_cage to shaft_room
remove dummy_cage
FindLight(location)
}
object DoLower
{
Already_done
}
}
}
DarkRoom smelly_room "Smelly Room"
{
long_desc
{
"This is a small non-descript room. However, from the
direction of a small descending staircase a foul odor can
be detected. To the south is a narrow tunnel."
}
is thief_free
s_to shaft_room
d_to gas_room
}
DarkRoom gas_room "Gas Room"
{
long_desc
{
"This is a small room which smells strongly of coal gas.
There is a short climb up some stairs and a narrow tunnel
leading east."
}
is thief_free
u_to smelly_room
e_to coal_mine1
after
{
location
{
local c, i
for i in player
{
if i is heat_source
{
c++
}
}
if c > 0
{
"Oh dear. It appears that the smell coming
from this room was coal gas. I would have
thought twice about carrying flaming objects
in here.\n"
"\_ ** BOOOOOOOOOOOM **"
NotDeadYet
}
else
{
return false
}
}
}
}
treasure bracelet "sapphire-encrusted bracelet"
{
noun "bracelet"
adjectives "sapphire" "sapphire-encrusted"
article "a"
in gas_room
take_points 5
deposit_points 5
initial_desc
{
"There is a sapphire-encrusted bracelet here."
}
}
CoalRoom coal_mine1 "Coal Mine"
{
n_to gas_room
ne_to coal_mine2
e_to coal_mine1
}
CoalRoom coal_mine2 "Coal Mine"
{
n_to coal_mine2
s_to coal_mine1
se_to coal_mine3
}
CoalRoom coal_mine3 "Coal Mine"
{
s_to coal_mine3
e_to coal_mine2
sw_to coal_mine4
}
CoalRoom coal_mine4 "Coal Mine"
{
n_to coal_mine3
d_to ladder_top
w_to coal_mine4
}
DarkRoom ladder_top "Ladder Top"
{
long_desc
{
"This is a very small room. In the corner is a rickety wooden
ladder, leading downward. It might be safe to descend. There
is also a staircase leading upward."
}
u_to coal_mine4
d_to ladder_bottom
}
DarkRoom ladder_bottom "Ladder Bottom"
{
long_desc
{
"This is a rather wide room. On one side is the bottom of a
narrow wooden ladder. To the west and the south are passages
leaving the room."
}
u_to ladder_top
w_to timber_room
s_to mine_dead_end
}
DarkRoom mine_dead_end "Dead End"
{
long_desc
{
"You have come to a dead end in the mine."
}
n_to ladder_bottom
}
object coal "small pile of coal"
{
noun "coal"
adjectives "small" "pile"
article "a"
in mine_dead_end
is burnable
initial_desc
{
"There is a small pile of coal here."
}
}
DarkRoom timber_room "Timber Room"
{
long_desc
{
"This is a long and narrow passage, which is cluttered with
broken timbers. A wide passage comes from the east and turns
at the west end of the room into a very narrow passageway.
From the west comes a strong draft."
}
is thief_free
e_to ladder_bottom
w_to
{
if children(player) > 0
{
"You cannot fit through this passage with that
load."
}
else
{
MovePlayer(drafty_room)
}
}
}
object timber "broken timber"
{
noun "timber"
adjective "broken"
article "a"
in timber_room
initial_desc
{
"There is a broken timber here."
}
}
DarkRoom drafty_room "Drafty Room"
{
long_desc
{
"This is a small drafty room in which is the bottom of a long
shaft. To the south is a passageway and to the east a very
narrow passage. In the shaft can be seen a heavy iron chain."
}
is thief_free
room_points 13
e_to
{
if children(player) > 0
{
"You cannot fit through this passage with that
load."
}
else
{
MovePlayer(timber_room)
}
}
s_to machine_room
}
DarkRoom machine_room "Machine Room"
{
long_desc
{
"This is a large, cold room whose sole exit is to the
north. In one corner there is a machine which is reminiscent
of a clothes dryer. On its face is a switch which is labelled
\"START\". The switch does not appear to be manipulable by
any human hand (unless the fingers are about 1/16 by 1/4
inch). On the front of the machine is a large lid, which is ";
if machine is open
{
"open."
}
else
{
"closed."
}
}
is thief_free
n_to drafty_room
}
scenery machine "machine"
{
nouns "machine" "lid"
adjective "large"
article "a"
is container, openable, not open
capacity 10
in machine_room
}
scenery start_switch "switch"
{
nouns "button" "switch"
adjective "start"
article "a"
in machine_room
before
{
object DoPush, DoPushWith
{
"Pushing the switch doesn't seem to work."
}
object DoTurn
{
if not xobject
{
return false
}
elseif xobject = screwdriver and
(children(machine) = 0 or
machine is open)
{
"The machine doesn't seem to want to do
anything."
}
elseif xobject = screwdriver and
children(machine) > 0
{
"The machine comes to life (figuratively)
with a dazzling display of colored lights
and bizarre noises. After a few moments, the
excitement abates."
if Contains(machine, coal)
{
remove coal
move diamond to machine
}
else
{
remove child(machine)
move slag to machine
}
}
elseif xobject = hands
{
"You can't turn it with your hands..."
}
elseif xobject ~= screwdriver
{
"It seems that ";
print The(xobject);
" won't do."
}
else
{
return false
}
}
}
after
{
object DoOpen
{
"The lid opens";
if children(machine) = 1
{
", revealing ";
print The(child(machine));
}
"."
}
object DoClose
{
"The lid closes."
}
}
}
treasure diamond "huge diamond"
{
noun "diamond"
adjective "huge"
article "a"
take_points 10
deposit_points 10
in nothing
}
object slag "small piece of vitreous slag"
{
noun "slag"
adjectives "small" "piece" "vitreous"
article "a"
in nothing
before
{
object DoGet, DoTouch
{
"The slag was rather insubstantial, and crumbles
into dust at your touch."
remove slag
}
}
}
!---------------------------------------------------------------------------
! HELP SYSTEM
!---------------------------------------------------------------------------
replace DoHelp
{
local m
while true
{
menuitem[0] = "Hugo Zork Help System"
menuitem[1] = "Introduction"
menuitem[2] = "Instructions For Playing"
menuitem[3] = "About This Hugo Adaptation"
menuitem[4] = "Credits"
menuitem[5] = "For Your Amusement/Words To Try"
menuitem[6] = "Step-by-Step Walkthru"
m = Menu(6)
select m
case 1: help_intro
case 2: help_instructions
case 3: help_about
case 4: help_credits
case 5: help_amuse
case 6: help_walkthru
case 0
{
window 0 ! by KT
cls !
PrintStatusline
DescribePlace(location, true)
return
}
}
}
routine help_intro
{
CenterTitle("Introduction")
"\"Hugo Zork\" was written as a programming exercise. I love text
adventures and computer programming, but lack the imagination to
write a completely original game. So, I took Infocom's \BZork I\b
and rewrote it using Hugo - mainly to see if I could do it. The
result is the game you are playing now.\n"
"If you find any bugs or errors, please send e-mail to John
Menichelli (menichel@pixi.com)\n"
"Zork I is copyright by Activision. This work does not in any way
challenge that copyright status.\n"
pause
}
routine help_instructions
{
CenterTitle("Communicating With Hugo Zork")
"\nAside from the standard Interactive Fiction commands (such as
BRIEF, VERBOSE, LOOK (or L), EXAMINE (or X), TAKE, DROP and
so on), Hugo Zork also understands the word DIAGNOSE. This will
give you a report of the player's condition."
pause
}
routine help_about
{
CenterTitle("About Hugo Zork")
"The source code for this game was developed by playing the original
Zork I, seeing what certain actions did, then coding the effect in
Hugo.\n"
"If that sounds painful, it was! It was a great learning experience
though. The most difficult object to code was the magic boat,
followed closely by the Loud Room.\n"
"As you examine the source code, you will probably notice that it is
not the most efficient thing you've ever read. I'm working on
tightening it up, but my first effort was aimed at getting something
that worked out the door.\n"
pause
}
routine help_credits
{
CenterTitle("Credits")
"Hugo Zork owes its existence to, of course, Infocom's Zork I
and Kent Tessman's Hugo Text Adventure programnming language.\n"
"The source code for Hugo Zork is freeware. Since it uses the
actual text from Zork I, those parts are copyright by Activision
and are used without their permission.\n"
"The Hugo Compiler and Engine are copyright (c) 1995-1996 by
Kent Tessman.\n"
"I would like to thank Kent Tessman for his assistance and patience
answering all my questions. Without him I would never have finished
this project.\n"
"When I was approximately 75% complete, I discovered the source
code to the TADS port of Dungeon, the precursor to Zork. While
reading the source code I discovered many things I had not thought
of (such as what objects fit where, how some objects interact
with others, and so on.) Many thanks to Darin Johnson
(tdjohnson@cs.ucsd.edu) for the work he did on the TADS version
of Dungeon.\n"
"Some sections of code were taken from the Colossal Cave
Adventure (colossal.hug) and are copyright by Kent Tessman.\n"
"The text for Hugo Zork came from Zork I, Revision 88, Serial
Number 840726, which is available on The Lost Treasures of
Infocom, Volume I and also on The Classic Text Adventure
Masterpieces of Infocom.\n"
"Even though I built upon the work of others, any errors or
omissions are my fault. Please direct all bug reports to
menichel@pixi.com."
pause
}
routine help_amuse
{
CenterTitle("For Your Amusement")
"Have you ever:\n"
"\_ ...opened the grating from beneath while the leaves were still
on it?"
"\_ ...tried swearing at ZORK I?"
"\_ ...waved the sceptre while standing on the rainbow?"
"\_ ...tried anything nasty with the bodies in Hades?"
"\_ ...burned the black book?"
"\_ ...damaged the painting?"
"\_ ...lit the candles with the torch?"
"\_ ...read the matchbook?"
"\_ ...tried to take yourself (or the Thief, Troll, or Cyclops)?"
"\_ ...tried cutting things with the knife or sword?"
"\_ ...poured water on something burning?"
"\_ ...said WAIT or SCORE while dead (as a spirit)?"
"\nPress any key for more..."
pause
CenterTitle("Words To Try")
"Words you may not have tried:\n"
"\_ HELLO (to Troll, Thief, Cyclops)"
"\_ ZORK"
"\_ OIL (lubricate)"
"\_ XYZZY"
"\_ WALK AROUND (in forest or outside house)"
"\_ PLUGH"
"\_ FIND (especially with house, hands, teeth, me)"
"\_ CHOMP (or BARF)"
"\_ COUNT (candles, leaves, matches, blessings)"
"\_ WIN"
"\_ MUMBLE (or SIGH)"
"\_ LISTEN (especially to the Troll, Thief, or Cyclops)"
"\_ REPENT"
"\_ WHAT IS (grue, zorkmid, ...)"
"\_ YELL (or SCREAM)"
"\_ SMELL"
pause
}
routine help_walkthru
{
local m
while true
{
menuitem[0] = "Hugo Zork Walkthru"
menuitem[1] = "Warning! Warning!"
menuitem[2] = "Part 1"
menuitem[3] = "Part 2"
menuitem[4] = "Part 3"
menuitem[5] = "Part 4"
menuitem[6] = "Part 5"
menuitem[7] = "Part 6"
menuitem[8] = "Part 7"
menuitem[9] = "Part 8"
m = Menu(9)
select m
case 1: help_warning
case 2: help_part1
case 3: help_part2
case 4: help_part3
case 5: help_part4
case 6: help_part5
case 7: help_part6
case 8: help_part7
case 9: help_part8
case 0: return
}
}
routine help_warning
{
CenterTitle("Warning! Warning!")
"There has been much talk on rec.games.int-fiction lately about
whether or not hints and/or walkthrus should be included with a
game. I am of the opinion that hints at the very least should come
with a game."
"\nAnyway, throwing caution to the wind, I've included this complete
walkthru for Hugo Zork. It is divided into eight parts to make it
easier to follow and so that less of the game is revealed at any one
time."
"\nThis walkthru may not work exactly as shown, because the thief
may take some of your items."
"\nRemember, when in doubt, save!"
pause
}
routine help_part1
{
CenterTitle("Walkthru - Part 1")
"South, East\n
Open window\n
Enter house\n
West\n
Get lamp\n
Move rug\n
Open trap door\n
Turn on the lamp\n
Down, South, East\n
Get painting\n
North, Up, Up\n
Get knife and rope\n
Down, West\n
Open case\n
Put painting in case\n
Drop knife\n
Get sword\n
Open trap door\n
Down."
"\nNow would be a good time to save."
pause
}
routine help_part2
{
CenterTitle("Walkthru - Part 2")
"North\n
Kill troll with sword (repeat as necessary)\n
Drop sword\n
East, East, Southeast, East\n
Tie rope to railing\n
Climb down rope\n
South, East\n
Get coffin\n
West, South\n
Pray\n
Turn off the lamp\n
South, North, East, Down, Down, North\n
Open coffin\n
Get sceptre\n
Wave scepter\n
Get gold and coffin\n
Southwest, Up, Up, Northwest, West\n
Enter house\n
Open bag\n
Get garlic\n
West\n
Put coffin, scepter, and gold in case"
pause
}
routine help_part3
{
CenterTitle("Walkthru - Part 3")
"Open trap door\n
Turn on lamp\n
Down, North, East, North, Northeast, East, North\n
Get matches\n
North\n
Get wrench and screwdriver\n
Push yellow button\n
South, South\n
Turn the bolt with the wrench\n
West, Southwest, South, South, Southeast, East\n
Climb down rope\n
Get the torch\n
Turn off lamp\n
South\n
Get the bell\n
South\n
Get book and candles\n
Down, Down\n
Ring bell\n
Light match\n
Light the candles with the match\n
Get candles\n
Read the book\n
Drop candles\n
South\n
Get skull\n
North, Up, North\n
Rub mirror\n
North, West, North, West, North, East\n
Put torch in basket\n
Turn on lamp\n
North, Down"
pause
}
routine help_part4
{
CenterTitle("Walkthru - Part 4")
"Be careful - this maze is tricky!\n"
"East, Northeast, Southeast, Southwest, Down, Down, South\n
Get coal\n
North, Up, Up, North, East, South, North, Up, South\n
Put coal and screwdriver in basket\n
Lower basket\n
North, Down, East, Northeast, Southeast, Southwest, Down, Down, West\n
Drop all\n
West\n
Get coal, torch and screwdriver\n
South\n
Open lid\n
Put coal into machine\n
Close the lid\n
Turn switch with screwdriver\n
Opem the lid\n
Get diamond\n
Drop screwdriver\n
North\n
Put torch and diamond in the basket\n
East\n
Get skull, lamp and garlic\n
East, Up, Up, North, East, South, North\n
Get bracelet\n
Up, South\n
Raise basket\n
Get torch and diamond\n
Turn off lamp\n
West\n
Get figurine\n
South, East, South, Down, Up\n
Put skull, diamond, figurine, bracelet and torch in case\n
Drop garlic"
pause
}
routine help_part5
{
CenterTitle("Walkthru - Part 5")
"Turn on lamp\n
North, East, North, Northeast, North\n
Get trunk\n
North\n
Get air pump\n
North\n
Get trident\n
South, South, South, East, East\n
Inflate boat with pump\n
Drop pump\n
Get in boat\n
Launch\n
\"Wait\" until you see a buoy\n
Get buoy\n
East\n
Get out of boat\n
Get shovel\n
Northeast"
pause
}
routine help_part6
{
CenterTitle("Walkthru - Part 6")
"\"Dig sand with shovel\" until the scarab appears.\n
Drop the shovel\n
Get scarab\n
Southwest\n
Drop buoy\n
Open buoy\n
Get emerald\n
South, South, West, West\n
Turn off lamp\n
Southwest, Up, Up, Northwest, West\n
Enter house\n
West\n
Put scarab, emerald, chest and trident in case\n
East, East, North, North\n
Climb up tree\n
Get egg\n
Down, South, East, West, West\n
Turn on lamp\n
Down, North"
pause
}
routine help_part7
{
CenterTitle("Walkthru - Part 7")
"West, South, East, Up\n
Take coins and key\n
Southwest, East, South, Southeast\n
Ulysses (or Odysseus)\n
Up\n
Give egg to thief\n
Down, East, East\n
Put coins in case\n
Get knife\n
West, West\n"
pause
}
routine help_part8
{
CenterTitle("Walkthru - Part 8")
"Up\n
\"Kill thief with knife\" until he's dead\n
Get all\n
Down, Northwest, South, West, Up, Down, Northeast\n
Unlock grate\n
Open grate\n
Up, South\n
Wind canary\n
Get bauble\n
South, East, West, West\n
Get canary\n
Put egg, canary and bauble in case\n
Down, North, East, East, East\n
Echo\n
Get bar\n
West, West, West, South, Up\n
Put bar in case\n
Get map\n
East, East, North, West\n
Look\n
Southwest, West\n"
"Congratulations! You completed Hugo Zork!"
pause
}
!-------------------------------------------------------------------------
! REPLACEMENT MESSAGES
!-------------------------------------------------------------------------
replace NewOMessages(obj, num, a, b)
{
select obj
case vehicle
{
select num
case 1
{
"To walk, you'll have to get ";
print self.prep #2;
" of ";
print The(self);
"."
return true
}
}
}
replace NewMessages(r, num, a, b)
{
select r
case &DoSuperBrief:
{
print "Super-brief descriptions."
return true
}
case &DoVerbose:
{
print "Maximum verbosity."
return true
}
case &DescribePlace
{
select num
case 1
{
print "It is pitch black. You are likely to
be eaten by a grue."
return true
}
case 2
{
print "There"; IsorAre(a, true); " "; Art(a); \
" here."
return true
}
}
case &DoLook
{
select num
case 1
{
print "It is pitch black. You are likely to
be eaten by a grue."
return true
}
case 2
{
print CThe(object); " look"; MatchSubject(object); \
" just like you'd expect."
return true
}
}
case &DoLookUnder
{
"There is nothing but dust there."
return true
}
case &DoHello
{
local d
d = random(4)
select d
case 1
{
"Hello."
return true
}
case 2
{
"Good day."
return true
}
case 3
{
"Nice weather we've been having lately."
return true
}
case 4
{
"Goodbye."
return true
}
}
case &DoGet
{
select num
case 1
{
print "You already have that."
return true
}
case 2
{
print "This is not progress you are making."
return true
}
case 3
{
print CThe(object); " probably wouldn't be too big
on that idea."
return true
}
case 4
{
print CThe(parent(object));
if parent(object) is plural
print " don't";
else
print " doesn't";
print " want to give "; The(object); " to you."
return true
}
case 5
{
print CThe(parent(object)); \
IsOrAre(parent(object), true); " closed."
return true
}
case 6
{
print "You can't take "; The(object); " while
you're ";
if object.prep: print object.prep;
elseif object is platform: print "in";
else: print "on";
if object is plural: print " them."
else: print " it."
return true
}
case 7
{
local c
c = random(4)
select c
case 1
{
"A valiant attempt."
}
case 2
{
"You can't be serious."
}
case 3
{
"An interesting idea..."
}
case 4
{
"What a concept!"
}
return true
}
case 8
{
print "Taken."
return true
}
case 9
{
print "You're carrying too much to take that."
return true
}
}
case &DoGo
{
select num
case 1
{
print CThe(obstacle); " stop"; \
MatchSubject(obstacle); " you from going anywhere."
return true
}
case 2
{
print "You can't go that way."
return true
}
case 3
{
print "You'll have to get ";
if parent(player).prep #2
{
print parent(player).prep #2; " ";
}
else
{
print "out ";
}
print "of "; The(parent(player)); " first."
return true
}
}
}
replace DarkWarning
{
if player is ghost
{
DescribePlace(location)
location is visited
return false
}
"You have moved into a dark place."
if (dark_warning = 0)
{
dark_warning = 1
NewMessages(&DescribePlace, 1)
}
elseif random(3) = 1
{
"Oh, no! You have walked into the slavering fangs of
a lurking grue!"
NotDeadYet
}
}
!-------------------------------------------------------------------------
! NEW ROUTINES
!-------------------------------------------------------------------------
routine DoCount
{
"You have lost your mind."
}
routine DoFly
{
"You'll have to explain that one to me."
}
routine Already_done
{
local a
a = random(3)
select a
case 1
{
"Too late for that."
return true
}
case 2
{
"Have your eyes checked."
return true
}
case 3
{
"Look around."
return true
}
}
routine DoSailor
{
if Contains(location, cyclops)
{
"The cyclops, hearing the name of his father's
deadly nemesis, flees the room by knocking down
the wall on the east of the room."
remove cyclops
wooden_door is special
trap_door is special
cyclops_room.threat_level = 0
maze15.threat_level = 0
}
else
{
"Wasn't he a sailor?"
return true
}
}
routine DoLift
{
"Playing in this way with ";
print the(object);
" has no effect."
}
routine DoEcho
{
"echo echo ..."
return true
}
routine JumpMessage
{
local a
a = random(3)
select a
case 1
{
"You should have looked before you leaped."
}
case 2
{
"In the movies, your life would be passing before your eyes."
}
case 3
{
"Geronimo..."
}
}
routine DoTurn
{
if not xobject
{
"What do you want to turn ";
print The(object);
" with?"
}
else
{
"You can't turn that!"
}
}
routine DoTreasure
{
if location = temple
{
MovePlayer(treasure_room)
}
elseif location = treasure_room
{
MovePlayer(temple)
}
else
{
"Nothing happens."
}
}
routine DoTemple
{
if location = temple
{
MovePlayer(treasure_room)
}
elseif location = treasure_room
{
MovePlayer(temple)
}
else
{
"Nothing happens."
}
}
routine DoPray
{
if location = altar_room
{
trap_door is special
MovePlayer(forest1)
}
else
{
"If you pray enough, your prayers may be answered."
}
}
routine DoZork
{
"At your service!"
}
routine DoFool
{
"A hollow voice says \"Fool.\""
}
routine DoChomp
{
"Preposterous!"
}
routine DoWin
{
"Naturally!"
}
routine DoRepent
{
"It could very well be too late!"
}
routine CalculateRank
{
if score = 350
rank = 7
elseif score > 330
rank = 6
elseif score > 300
rank = 5
elseif score > 200
rank = 4
elseif score > 100
rank = 3
elseif score > 50
rank = 2
elseif score > 25
rank = 1
else
rank = 0
return true
}
routine DoBug
{
"Bug? Not in a flawless program like this! (Cough, cough)."
}
routine DoFind
{
"You don't see any ";
print object.noun;
" here!"
}
routine DoMumble
{
"You'll have to speak up if you expect me to hear you!"
}
routine DoRaise
{
"Playing in this way with ";
print The(object);
" isn't notably helpful."
}
routine DoLower
{
"Playing in this way with ";
print The(object);
" isn't notably helpful."
}
routine DoRing
{
"Playing in this way with ";
print The(object);
" isn't notably helpful."
}
routine DoPushWith
{
"You can't push the ";
print The(object);
" with ";
print The(xobject)
}
routine DoExtinguish
{
"You can't extinguish ";
print The(object);
"."
}
routine DoPump
{
if not xobject
{
"What do you want to inflate ";
print The(object);
" with?"
}
else
{
"How can you inflate that?"
}
}
routine DoDeflate
{
"Come on, now!"
}
routine DoPoke
{
if not xobject
{
"What do you want to puncture ";
print The(object);
"with?"
}
else
{
"Trying to destroy ";
print The(object);
" with ";
print Art(xobject);
" is futile."
}
}
routine DoPatch
{
if not xobject
{
"What do you want to patch ";
print The(object);
"with?"
}
else
{
"With ";
print Art(xobject);
"?"
}
}
routine DoTooLoud
{
! Hack alert: if word[1] is "d" or "down" (such as when you move from
! the Deep Canyon to the Loud Room), the routine which moves the player
! to a random room will not work. If anyone has any idea why this is,
! *please* let me know. It's probably something stupid I overlooked,
! but it did take me 6 hours to discover this "solution".
! P.S. I also found that when word[1] is "l" or "look", the same problem
! occurs. I changed the routine to change word[1] to "e" if it wasn't
! already.
! #BeginHack
if (word[1] = "go" or
word[1] = "walk") and
word[2] ~= ""
{
word[1] = word[2]
}
if word[1] ~= "e" or
word[1] ~= "east"
{
word[1] = "e"
}
! #EndHack
local a
a = random(3)
select a
case 1
{
MovePlayer(round_room)
}
case 2
{
MovePlayer(damp_cave)
}
case 3
{
MovePlayer(deep_canyon)
}
return true
}
routine DoWind
{
"You cannot wind up ";
print Art(object);
"."
}
routine DoBreakEgg
{
egg is broken
egg is open
egg is moved
egg.adjective #1 = "jewel-encrusted"
egg.adjective #2 = "broken"
egg.adjective #3 = "ruined"
egg.name = "broken jewel-encrusted egg"
}
routine DoWalkOn
{
"You can't walk on ";
print The(object);
"."
}
routine DoCurse
{
if not object
{
"Such language in a high-class establishment like this!"
}
elseif object = you
{
"Insults of this nature won't help you."
}
else
{
"What a loony!"
}
}
routine DoFrobozz
{
"The FROBOZZ Corporation created, owns, and operates this
dungeon."
}
routine DoThrowIn
{
if not xobject
{
"You'll have to be a little more specific about what
you'd like to throw ";
print The(object); " in."
}
elseif xobject is not living
{
"What exactly are you hoping for?"
}
else
{
"You ultimately decide that throwing ";
print The(object);
" at ";
print The(xobject);
" isn't such a great idea."
}
return true
}
routine DoDiagnose
{
wound_level = max_hit_points - current_hit_points
if wound_level > 4
{
wound_level = 4
}
"You ";
select wound_level
case 0
{
"are in perfect health."
}
case 1
{
"have a light wound, ";
}
case 2
{
"have a serious wound, ";
}
case 3
{
"have several wounds, ";
}
case 4
{
"have several serious wounds, ";
}
if turns_to_heal > 0
{
"which will be cured after ";
print number turns_to_heal;
if turns_to_heal = 1
{
" move."
}
else
{
" moves."
}
}
select current_hit_points
case 1
{
"You can be killed by one more light wound."
}
case 2
{
"You can be killed by a serious wound."
}
case 3
{
"You can survive one serious wound."
}
case 4, 5
{
"You are strong enough to take several wounds."
}
if lives_used > 0
{
"You have been killed ";
if lives_used = 1
{
"once."
}
else
{
"twice."
}
}
return true
}
routine ResolveAttack(diff)
{
local chance, roll
select diff ! chance * 10 = % chance to hit
case 3, 4, 5
chance = 9
case 0, 1, 2
chance = 5
case -1, -2, -3
chance = 3
case -3, -4, -5, -6
chance = 1
roll = random(10)
if roll <= chance ! OK, now that the target is hit, what happened?
{
combat_result = random(6)
if combat_result = 4
{
damage = 1
}
elseif combat_result = 5
{
damage = 2
}
elseif combat_result = 6
{
damage = 10
}
! 1 = Stun
! 2 = Disarm
! 3 = KO
! 4 = Light Wound
! 5 = Serious Wound
! 6 = Kill
}
else
{
combat_result = 0 ! Miss
}
}
routine DoRead
{
Perform(&DoLook, object)
}
routine DoLaunch
{
local v, moveto
if player in location
{
OMessage(vehicle, 2) ! "You aren't in anything."
return false
}
v = parent(player) ! the vehicle
if v.before: return true
select location
case dam_base
{
moveto = river1
Activate (RiverCurrent, 5)
}
case beach_north
{
moveto = river3
Activate (RiverCurrent, 3)
}
case beach_south
{
moveto = river4
Activate (RiverCurrent, 2)
}
case sandy_beach
{
moveto = river4
Activate (RiverCurrent, 2)
}
case shore
{
moveto = river5
Activate (RiverCurrent, 1)
}
case river1, river2, river3, river4, river5
{
"You are on the river, or have you forgotten?"
return true
}
case reservoir
{
"You are on the lake, or have you forgotten?"
return true
}
case stream_view
{
moveto = stream
}
case reservoir_north
{
moveto = reservoir
}
case reservoir_south
{
moveto = reservoir
}
case else
{
"You can't do that here."
return true
}
if ObjectisAttached(v, location, moveto)
return false
! Finally, the vehicle can move
move v to moveto
v is moved
old_location = location
location = moveto
MoveAllAttachables(v, old_location, location)
if not FindLight(location)
{
DarkWarning
}
else
{
DescribePlace(location)
location is visited
}
run parent(player).after
return true
}
routine DoLand
{
local v, moveto
if player in location
{
OMessage(vehicle, 2) ! "You aren't in anything."
return false
}
v = parent(player) ! the vehicle
if v.before: return true
if word[1] = "land"
{
select location
case river1
{
"The magic boat comes to rest on the shore."
moveto = dam_base
}
case river2
{
"There is no safe landing spot here."
return true
}
case river3
{
"The magic boat comes to rest on the shore."
moveto = beach_north
}
case river4
{
"You need to specify a direction."
return true
}
case river5
{
"The magic boat comes to rest on the shore."
moveto = shore
}
case stream
{
"The magic boat comes to rest on the shore."
moveto = stream_view
}
case else
{
"You can't go that way."
return true
}
Deactivate(RiverCurrent)
}
if ObjectisAttached(v, location, moveto)
return false
! Finally, the vehicle can move
move v to moveto
v is moved
old_location = location
location = moveto
MoveAllAttachables(v, old_location, location)
if not FindLight(location)
{
DarkWarning
}
else
{
DescribePlace(location)
location is visited
}
run parent(player).after
return true
}
routine NotDeadYet
{
"\n\_ **** You have died ****"
score -= 10
lives_used++
current_hit_points = max_hit_points
turns_to_heal = 0
if lives_used < 3 and
altar_room is not visited
{
"\nNow, let's take a look here... Well, you probably
deserve another chance. I can't quite fix you up
completely, but you can't have everything."
ScatterPossessions
MovePlayer(forest1)
}
elseif lives_used < 3 and
altar_room is visited
{
"\nAs you take your last breath, you feel relieved of your
burdens. The feeling passes as you find yourself before
the gates of Hell, where the spirits jeer at you and deny
you entry. Your senses are disturbed. The objects in the
dungeon appear indistinct, bleached of color, even unreal."
player is ghost
player is light
Deactivate(ThiefDaemon)
remove thief
ScatterPossessions
MovePlayer(entrance_to_hades)
}
else
{
"\nYou clearly are a suicidal maniac. We don't allow
psychotics in the cave, since they may harm other
adventurers. Your remains will be installed in the
Land of the Living Dead, where your fellow adventurers
may gloat over them."
endflag = 3
}
}
routine ScatterPossessions
{
! If the player is carrying valuable items, move them to random
! maze locations. Non-valuable items are scattered above ground,
! near the house.
if Contains(player, lamp)
{
move lamp to living_room
Perform(&DoSwitchOff, lamp)
}
if Contains(player, coffin)
{
move coffin to egyptian_room
coffin is not open
}
local a, c, i, j, dest
c = children(player)
while c > 0
{
for i in player
{
if i is valuable
{
a = random(7)
select a
case 1
{
dest = maze1
}
case 2
{
dest = maze2
}
case 3
{
dest = maze3
}
case 4
{
dest = maze4
}
case 5
{
dest = maze5
}
case 6
{
dest = dead_end1
}
case 7
{
dest = dead_end3
}
}
else
{
a = random(6)
select a
case 1
{
dest = south_of_house
}
case 2
{
dest = behind_house
}
case 3
{
dest = kitchen
}
case 4
{
dest = forest_path
}
case 5
{
dest = forest2
}
case 6
{
dest = clearing
}
}
j = i
move j to dest
c--
}
}
}
routine DoSqueeze
{
if object is living
{
print CThe(object);
" does not understand this."
}
else
{
"How singularly useless."
}
}
routine DoDrown
{
"It seems that ";
print The(object);
" didn't agree with the boat, as evidenced by the loud hissing
noise issuing therefrom. With a pathetic sputter, the boat deflates,
leaving you without."
select location
case river1, river2, river3, river4, river5
{
"\nIn other words, fighting the fierce currents of the Frigid
River. You manage to hold your own for a bit, but then you
are carried over a waterfall and into some nasty rocks.
Ouch!"
NotDeadYet
}
case reservoir, stream
{
"\nAnother pathetic sputter, this time from you, heralds
your drowning."
NotDeadYet
}
}
routine DoMolest
{
"What a (ahem!) strange idea."
}
routine DoFill
{
"There's nothing to fill ";
print The(object);
" with."
}
routine DoPour
{
Perform(&DoDrop, object)
}
routine DoWalkAround
{
if not object
{
"What do you want to walk around?"
}
elseif object = house
{
select location
case west_of_house
{
MovePlayer(north_of_house)
}
case north_of_house
{
MovePlayer(behind_house)
}
case behind_house
{
MovePlayer(south_of_house)
}
case south_of_house
{
MovePlayer(west_of_house)
}
}
elseif object = forest
{
select location
case forest1
{
MovePlayer(forest_path)
}
case forest_path
{
MovePlayer(forest2)
}
case forest2
{
MovePlayer(clearing1)
}
case clearing1
{
MovePlayer(forest1)
}
}
else
{
"Use compass directions for movement."
}
}
routine DoShake
{
if object is container and
children(object) > 0
{
"It sounds like there is something inside ";
print The(object);
"."
}
elseif object is container and
children(object) = 0
{
print CThe(object);
" sounds empty."
}
else
{
"Shaken."
}
}
routine RemoveThief(flag)
{
local a, i, j
self = thief
remove self
Deactivate(ThiefDaemon)
self is not living
self is unconscious
treasure_room.threat_level = 0
if not Contains(player, stiletto)
{
move stiletto to location
stiletto is not hidden
}
if location = treasure_room and
flag = 1
{
"As the thief dies, the power of his magic decreases, and
his treasure reappears."
}
move silver_chalice to location
for i in thiefs_bag
{
a++
}
if a > 0
{
"\nHis booty remains."
while a > 0
{
for i in thiefs_bag
{
j = i
if j = egg and
egg is not broken
{
egg is not lockable
egg is open
move egg to location
move canary to egg
}
else
{
move j to location
}
}
a--
}
}
remove thiefs_bag
move canvas to location
if Contains(player, sword)
{
"Your sword is no longer glowing."
}
}
routine MissMessage(enemy)
{
local a, b
if enemy = cyclops
{
a = 5
}
else
{
a = 6
}
b = random(a)
select b
case 1
{
print "You miss "; The(enemy); " by an inch."
}
case 2
{
print "A good slash, but it misses "; The(enemy);
" by a mile."
}
case 3
{
print "You charge, but "; The(enemy); " jumps nimbly aside."
}
case 4
{
print "A quick stroke, but "; The(enemy); " is on guard."
}
case 5
{
print "A good stroke, but it's too slow; "; The(enemy);
" dodges."
}
case 6
{
print "Clang! Crash! "; CThe(enemy); " parries."
}
return true
}
routine DazeMessage(enemy)
{
local a
a = random(5)
select a
case 1
{
print CThe(enemy);
" is staggered, and drops to his knees."
}
case 2
{
print CThe(enemy);
" is momentarily disoriented and can't fight back."
}
case 3
{
"The force of your blow knocks ";
print The(enemy);
" back, stunned."
}
case 4
{
print CThe(enemy);
" is confused and can't fight back."
}
case 5
{
"A savage blow on the thigh! "
print CThe(enemy);
" is stunned but can still fight!"
}
}
routine KnockOutMessage(enemy)
{
local a
a = random(3)
select a
case 1
{
print CThe(enemy);
" is battered into unconsciousness."
}
case 2
{
"A furious exchange, and ";
print The(enemy);
" is knocked out!"
}
case 3
{
"The haft of your weapon knocks out ";
print The(enemy);
"."
}
}
routine DisarmedMessage(enemy)
{
local a
a = random(2)
select a
case 1
{
"The quickness of your thrust knocks ";
print The(enemy);
"'s weapon to the floor, leaving him unarmed."
}
case 2
{
print CThe(enemy);
" is disarmed by a subtle feint past his guard."
}
}
routine MinorWoundMessage(enemy)
{
local a
a = random(4)
select a
case 1
{
print CThe(enemy);
" is struck on the arm; blood begins to
trickle down."
}
case 2
{
"Your weapon pinks ";
print The(enemy);
" on the wrist, but it's not serious."
}
case 3
{
"Your stroke lands, but it was only the flat of the blade."
}
case 4
{
"The blow lands, making a shallow gash in ";
print The(enemy);
"'s arm!"
}
}
routine SeriousWoundMessage(enemy)
{
local a
a = random(3)
select a
case 1
{
print CThe(enemy);
" receives a deep gash in his side."
}
case 2
{
"Slash! Your blow lands! That one hit an artery, it could
be serious!"
}
case 3
{
"Slash! Your stroke connects! This could be serious!"
}
}
routine DeadMessage(enemy)
{
local a
a = random(3)
select a
case 1
{
"It's curtains for ";
print The(enemy);
" as you remove his head."
}
case 2
{
"The fatal blow strikes ";
print The(enemy);
" square in the heart: He dies."
}
case 3
{
print CThe(enemy);
" takes a fatal blow and slumps to the floor dead."
}
}
routine DoOil
{
if not xobject
{
"What do you want to oil ";
print The(object);
" with?"
}
else
{
"You probably put spinach in your gas tank, too."
}
}
!-------------------------------------------------------------------------
! REPLACEMENT ROUTINES
!-------------------------------------------------------------------------
replace DoBurn
{
if not xobject
{
"What do you want to burn ";
print The(object);
" with?"
return true
}
elseif xobject is heat_source
{
if object is not burnable
{
"You can't burn ";
print Art(object);
"."
}
elseif Contains(player, object)
{
print CThe(object);
" catches fire. Unfortunately, you were ";
if parent(player) = magic_boat
{
"in";
}
else
{
"holding";
}
if object is plural
{
" them";
}
else
{
" it";
}
" at the time."
remove object
object is moved
NotDeadYet
}
else
{
print CThe(object);
" catches fire and is consumed."
remove object
object is moved
}
}
else
{
"With ";
print Art(xobject);
"??!?"
}
return true
}
replace DoYell
{
"Aaaarrrrgggghhhh!"
return true
}
replace DoJump
{
local a
a = random(4)
select a
case 1
{
"Very good. Now you can go to the second grade."
}
case 2
{
"Are you enjoying yourself?"
}
case 3
{
"Wheeeeeeeeee!!!!!"
}
case 4
{
"Do you expect me to applaud?"
}
return true
}
replace PrintScore(end_of_game)
{
if end_of_game: print ""
"Your score is ";
print number score;
" (total of ";
print number MAX_SCORE;
" points), in ";
print number counter;
if counter = 1
{
" move."
}
else
{
" moves."
}
CalculateRank
"This gives you the rank of ";
print ranking[rank];
"."
}
replace DoDig
{
if not xobject
{
"What do you want to dig ";
print The(object);
" with?"
}
else
{
"You can't dig ";
print The(object);
" with ";
print The(xobject);
"."
}
}
replace DoSmell
{
"It smells like ";
print Art(object);
"."
}
replace DoHit
{
if player is stunned
{
player is not stunned
"You are still recovering from that last blow, so your
attack is ineffective."
return true
}
elseif xobject and
xobject ~= hands and
not Contains(player, xobject)
{
"You aren't even holding ";
print The(xobject);
"."
return true
}
if object is not living
{
"I've known strange people, but fighting ";
print Art(object);
"?"
}
else
{
if children(player) = 0 or
xobject = hands
{
"Trying to attack ";
print Art(object);
" with your bare hands is suicidal."
}
elseif not xobject
{
"What do you want to fight ";
print The(object);
" with?"
}
elseif xobject is not weapon
{
"Trying to attack ";
print The(object);
" with ";
print Art(xobject);
" is suicidal."
}
elseif xobject is weapon
{
local a, diff, target
CalculateRank
select object
case troll
{
a = 0
target = troll
}
case cyclops
{
a = 6
target = cyclops
}
case thief
{
a = 6
target = thief
}
if target is unconscious
{
"The unconscious ";
print target.name;
" cannot defend himself: He dies."
damage = 10
run target.take_damage
return true
}
elseif target is disarmed
{
"The unarmed ";
print target.name;
" cannot defend himself: He dies."
damage = 10
run target.take_damage
return true
}
else
{
target is hostile
if xobject = nasty_knife
{
rank++
}
elseif xobject = stiletto
{
rank += 2
}
diff = rank - a
ResolveAttack(diff)
select combat_result
case 0
{
MissMessage(target)
}
case 1
{
target is stunned
DazeMessage(target)
}
case 2
{
run target.no_weapon
}
case 3
{
run target.knocked_out
}
case else
{
run target.take_damage
}
}
}
}
return true
}
replace DoCut
{
if not xobject
{
"What do you want cut ";
print The(object);
" with?"
}
else
{
if xobject is weapon
{
"Strange concept, cutting ";
print The(object);
"."
}
else
{
"The \"cutting edge\" of ";
print Art(xobject);
" is hardly adequate."
}
}
}
!----------------------------------------------------------------------------
!
! PrintStatusline
! Replaces the old StatusLine routine - this one prints out the words
! "Score:" and "Moves:" on the status line
!
! v2.4 revision by KT
!
!----------------------------------------------------------------------------
replace PrintStatusline
{
local temp_it_obj
temp_it_obj = it_obj
if display.linelength < 80
display.statusline_height = 2
Font(BOLD_OFF | ITALIC_OFF | UNDERLINE_OFF | PROP_OFF)
window display.statusline_height
{
color SL_TEXTCOLOR, SL_BGCOLOR
cls
locate 1, 1
if not light_source
print "In the dark";
else
{
print "\_";
print capital location.name;
if player not in location
{
if parent(player).prep
print ", "; parent(player).prep; " ";
else
print ", "; IN_WORD; " ";
print Art(parent(player));
}
}
if display.statusline_height = 1
print to 50;
else
{
locate 2, 2
}
print "Score: "; number score;
! Print to 65 or 15
print to ((display.statusline_height = 1)*50 + 15);
print "Moves: "; number counter;
}
color TEXTCOLOR, BGCOLOR
Font(DEFAULT_FONT)
it_obj = temp_it_obj
}
replace ParseError(errornumber, obj)
{
if location = loud_room and
loud_room is not special and
errornumber = 1
{
print parse$;
" ";
print parse$;
" ..."
words = 0
word[1] = ""
return true
}
if location = loud_room and
loud_room is not special and
errornumber = 6
{
". . ..."
words = 0
word[1] = ""
return true
}
if errornumber >= 100
{
CustomError(errornumber, obj)
word[1] = "" ! force ParseError(0)
words = 0
customerror_flag = true
return true
}
if customerror_flag
{
customerror_flag = 0 ! CustomError already printed error
return true
}
select errornumber
case 6
print "That doesn't make any sense."
case 9
{
print "Nothing to ";
if verbroutine
print parse$; "."
else: print "do."
}
case 10
{
print "You haven't seen ";
if obj is living
print "anybody";
else: print "anything";
print " like that."
}
case 11
{
if not ObjectisKnown(obj)
ParseError(10, obj)
elseif obj is living
{
CThe(obj)
if obj is plural
print " aren't";
else: print " isn't";
print " here."
}
else
{
print "You don't see ";
if obj is plural
print "those."
else: print "that."
}
}
case 12
print "You can't do that with "; The(obj) ; "."
case 14
{
if xobject is living
print CThe(xobject); \
" doesn't have "; The(obj); "."
else
print "You don't see "; The(obj); " there."
}
case 15
{
print "You aren't holding ";
if obj is plural
print "those."
else: print "that."
}
case else: return false ! print the default message
return true ! message already printed
}
replace DoExit
{
local p
if not object and
parent(player) = magic_boat and
location is water_location
{
"You realize that getting out here would be fatal."
return true
}
if object = nothing or object = location
{
if player in location
{word[1] = "out"
word[2] = ""
return Perform(&DoGo)}
}
p = parent(player)
if object and player not in object
Message(&DoExit, 1) ! "You aren't in that."
elseif p is openable, not open
Message(&DoLookIn, 1) ! "X is closed."
else
{
if object = nothing
object = p
move player to location
if not object.after
Message(&DoExit, 2) ! "You get out.."
}
return true
}
replace DoTouch
{
"Fiddling with ";
The(object)
" probably isn't the best use of your time at the moment."
return true
}
replace DoSwim
{
if FindObject(river, location) or
FindObject(lake, location) or
FindObject(water_in_stream, location)
{
"Swimming isn't usually allowed in the dungeon."
}
else
{
"Go jump in a lake!"
}
}
! This routine replaces "~all" with "grue" - if "~all" is passed through
! while in a dark location or while the player is a ghost, multiple
! "It's too dark to see!" or "Your hand passes through the object." messages
! will be printed; one for each object in the location. I replaced it with
! "grue" because the grue is a scenery item that is always in the player's
! location and thus can always be referred to.
replace PreParse
{
if (not FindLight(location) or
player is ghost) and
word[1] ~= "drop"
{
if word[2] = "~all"
{
word[2] = "grue"
}
elseif word[3] = "~all"
{
word[3] = "grue"
}
}
return false
}
!----------------------------------------------------------------------------
! DescribePlace(location, [optional parameter])
! prints the location name, followed by the location description, if
! required
!
! DescribePlace(location, true)
! forces a location description
!
! This routine changes the standard Hugo routine so that the name of
! each location is not printed in bold print.
!
!----------------------------------------------------------------------------
replace DescribePlace(place, long)
{
local obj, count, notlisted, tempformat
! Since, for example, a room description following entering via
! DoGo does not trigger before/after properties tied to looking
! around:
!
if verbroutine ~= &DoLookAround
{
if place is not visited and verbosity ~= 1
return Perform(&DoLookAround)
elseif long = true or verbosity = 2
return Perform(&DoLookAround)
}
if not light_source
{Message(&DescribePlace, 1) ! "It's too dark to see..."
return}
place is known
! Print the name of the location as a heading
! Font(BOLD_ON)
print "\n"; capital place.name;
! Print ", in <something>" if necessary
if location = place and player not in place
{
if parent(player).prep
print ", "; parent(player).prep; " ";
else
print ", "; IN_WORD; " ";
print Art(parent(player))
}
print newline
! Font(BOLD_OFF)
override_indent = false
if place is not visited and verbosity ~= 1
{
if &place.initial_desc or &place.long_desc
Indent
if not place.initial_desc
run place.long_desc
}
elseif long = true or verbosity = 2
{
if &place.long_desc
Indent
run place.long_desc
}
if &place.list_contents and FORMAT & DESCFORM_F
print "" ! for double-space-after-heading formatting
! A location may contain an overriding listing routine, as may any
! parent, in the list_contents property
!
if not place.list_contents
{
list_nest = 0
! For double-space-after-heading formatting:
if FORMAT & DESCFORM_F:
{
for obj in place
{
if obj is not hidden and
(player not in obj or children(obj) > 1):
{
print ""
break
}
}
}
! List contents of chair, vehicle, etc. player is in
if player not in location
WhatsIn(Parent(player))
! List all characters, if any
count = 0
for obj in place
{
if obj is hidden or obj is not living or
player in obj:
obj is already_listed
else
{
obj is not already_listed
ShortDescribe(obj)
if obj is not already_listed
count++
}
}
list_count = count
count = 0
if list_count ! if characters are to be listed
{
tempformat = FORMAT
FORMAT = FORMAT | FIRSTCAPITAL_F | ISORAREHERE_F
FORMAT = FORMAT | USECHARNAMES_F
if FORMAT & LIST_F
{
FORMAT = FORMAT & ~LIST_F ! clear it
FORMAT = FORMAT | TEMPLIST_F
}
Indent
list_nest = 0
ListObjects(place)
FORMAT = tempformat
}
for obj in place
{
#ifset USE_ATTACHABLES
! Exclude all attachables for now (and characters)
if obj is living or obj.type = attachable or
player in obj
#else
if obj is living or player in obj
#endif
obj is already_listed
else
obj is not already_listed
}
for obj in place
{
#ifset USE_PLURAL_OBJECTS
! ...And don't list identical objects yet, either
if (obj.identical_to).type = identical_class
{
if obj is not hidden
count++
}
elseif player not in obj
#else
if player not in obj
#endif
{
if obj is not already_listed and
obj is not hidden:
{
ShortDescribe(obj)
if obj is not already_listed
notlisted++
}
}
}
if notlisted or count
{
list_count = notlisted + count
tempformat = FORMAT
FORMAT = FORMAT | FIRSTCAPITAL_F | ISORAREHERE_F
if FORMAT & LIST_F
{
FORMAT = FORMAT & ~LIST_F ! clear it
FORMAT = FORMAT | TEMPLIST_F
}
Indent
list_nest = 0
ListObjects(place)
FORMAT = tempformat
}
#ifclear NO_OBJLIB
#ifset USE_ATTACHABLES
for obj in place
{
! Print attachables last
if obj.type = attachable and obj is not hidden
{
ShortDescribe(obj)
if obj is not already_listed
Message(&DescribePlace, obj, 2)
}
}
#endif
print newline
override_indent = false
! Finally, list contents of scenery objects (unless we've
! already done so as the parent of the player
!
for obj in place
{
if obj.type = scenery and player not in obj
WhatsIn(obj)
}
#endif ! ifclear NO_OBJLIB
}
}

Xet Storage Details

Size:
354 kB
·
Xet hash:
f2594a3b8cfa71aecbcf5ffb29563daf40f4f753b8b4b564e5a1db05deb5b1e3

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.