#import "lib.ih" #import "doors.ih" #import "debug.ih" #import "switches.ih" ! Mini-Zork IAGE Implementation ! Ported by R.Rawson-Tetley November 2001 (for what seems like the millionth time) LibraryMessage 1 "
MINI-ZORK I: The Great Underground Empire
Copyright (c) 1988 Infocom, Inc.
All rights reserved.
ZORK is a registered trademark of Infocom, Inc.
Release 34 / Serial number 871124

IAGE Multiplayer Port by R.Rawson-Tetley
For questions and help, mail: iage@btinternet.com

IAGE Release 011116" GameCode { Name "Mini-Zork I" MaxItemsCanCarry 10 MaxWeightCanCarry 10 MaxSizeCanCarry 10 StartingLocation westofhouse Verbose yes ShowAvailableExits no AllowPersist yes SinglePlayerGame no MaxUsers 128 OverrideSecondaryNouns "66 68 69" UsingIAGECombat yes UsingIAGEMoney no WideInventoryDisplay no RealTimeNPCs no PlayersStayDead no NPCsStayDead no AfterInput: CodeExtend [ call Zork.customafterinput ] Initialise: CodeExtend [ call Zork.initzork ] AfterInputImmediate: CodeExtend [ call Zork.inthedark ] } Item treasure "Treasure Class" { OnAction: [ end proc after_insert ' If player has inserted treasure item into ' trophy case and they have not received ' points for it, give them. if ( input.noun2 = trophycase.nounid ) then if ( this.getuserboolean(hadpoints) = false ) then this.adduserboolean(hadpoints) call StandardLib.AddScore this.getvalue(points) end endif endif end proc before_get ' Points for finding treasure if ( this.getuserboolean(hadpickuppoints) = false ) then this.adduserboolean(hadpickuppoints) call StandardLib.AddScore this.getvalue(pickuppoints) end endif end ' The initialise routine should be overridden in your subclass ' if you want to change the point value of a treasure item (just ' redefine the section below and change the 5 to something else). proc initialise this.setvalue(points) = 5 this.setvalue(pickuppoints) = 2 end ] } !======================================================= ! WEST OF HOUSE !======================================================= Location westofhouse "West Of House" { Nouns "white" "house" "field" Examine "The house is a beautiful white colonial. The owners must have been extremely wealthy." Description "You are standing in an open field west of a white house, with a boarded front door. You could circle the house to the north or south." N_to northofhouse S_to southofhouse SE_to southofhouse NE_to northofhouse OnInput: [ ;go #east currentplayer.print "The door is boarded and you can't remove the boards." end endif endif ] } Item mailbox "a small mailbox" Nouns "small" "mailbox" "mail" "box" StartsIn westofhouse Size 2 StaticMessage "The small mailbox is securely fastened to the ground." has container openable static } Item leaflet "a leaflet" Nouns "leaflet" StartsIn mailbox ReadableText "~WELCOME TO ZORK, a game of adventure, danger, and low cunning. No computer should be without one!~

Note: this ~mini-zork~ contains only a sub-set of the locations, puzzles, and descriptions found in the larger, disk-based version of Zork I.

This IAGE version was ported by R.Rawson-Tetley. The last update was made on 8th November, 2001.
Some notes about this version follow:
1. The two mazes were deliberately left out since they are now a highly unfashionable (and indeed irritating!) puzzle.
2. This release is only about 50% complete." has readable } !======================================================= ! NORTH OF HOUSE !======================================================= Location northofhouse "North Of House" { Nouns "white" "house" "field" Examine "The house is a beautiful white colonial. The owners must have been extremely wealthy." Description "You are facing the north side of a white house. There is no door here, and all the windows are boarded up. A narrow path winds north through the trees." N_to forestpath SE_to behindhouse SW_to westofhouse OnInput: [ ;go #south currentplayer.print "The windows are all boarded." end endif endif ] } !======================================================= ! SOUTH OF HOUSE !======================================================= Location southofhouse "South Of House" { Nouns "white" "house" "field" Examine "The house is a beautiful white colonial. The owners must have been extremely wealthy." Description "You are facing the south side of a white house. There is no door here, and all the windows are boarded." NE_to behindhouse NW_to westofhouse OnInput: [ ;go #north currentplayer.print "The windows are all boarded." end endif endif ] } !======================================================= ! FOREST PATH !======================================================= Location forestpath "Forest Path" { Description "This is a path through a dimly lit forest, curving from south to east. A large tree with low branches stands by the edge of the path." S_to northofhouse E_to forest U_to upatree OnInput: [ ;climb currentplayer.currentlocation = upatree.ID game.displaycurrentlocation endif ] } Item pileofleaves "a pile of leaves" Nouns "pile" "leaves" "leaf" StartsIn forestpath Initial "On the ground is a pile of leaves." OnAction: [ ;move,push,pull if ( this.getuserboolean(moved) = false ) then currentplayer.print "In disturbing the leaves, a grating is revealed." printallinexcept forestpath.id currentplayer.index |currentplayer.name & " moves the pile of leaves, revealing " & grating.name & "."| this.adduserboolean(moved) grating.currentlocation = forestpath.id endif endif end proc before_get if ( this.getuserboolean(moved) = false ) then returnvalue = "(Taken) In disturbing the leaves, a grating is revealed." printallinexcept forestpath.id currentplayer.index |currentplayer.name & " moves the pile of leaves, revealing " & grating.name & "."| this.adduserboolean(moved) grating.currentlocation = forestpath.id endif end ] } Item grating "an iron grating" { StartsIn limbo Nouns "iron" "grating" "grate" Initial "There is an iron grating securely fastened into the ground." StaticMessage "The iron grating is securely fastened into the ground." has static openable OnAction: [ ;open currentplayer.print "The grating is locked." printallinexcept grating.currentlocation currentplayer.index |currentplayer.name & " attempts to open the grating, but it is locked."| end endif ] } !======================================================= ! UP A TREE !======================================================= Location upatree "Up a Tree" { Description "You are ten feet above the ground, nestled among large branches." D_to forestpath } Item birdsnest "a bird's nest" { StartsIn upatree Nouns "bird" "bird's" "nest" Initial "Beside you on the branch is a small bird's nest." } Item jeweledegg "a jeweled egg" extends treasure { StartsIn upatree Nouns "jeweled" "jewel" "egg" Initial "In the bird's nest is a large egg encrusted with precious jewels, apparently scavenged by a childless songbird." HasUDB treasure } !======================================================= ! FOREST !======================================================= Location forest "Forest" { Description "This is a dimly lit forest, with large trees all around." E_to forestedge W_to forestpath } !======================================================= ! FOREST EDGE !======================================================= Location forestedge "Forest Edge" { Description "Paths lead into the forest to the west and northwest. Also, a well-marked path extends east." E_to canyonview W_to forest } !======================================================= ! CANYON VIEW !======================================================= Location canyonview "Canyon View" { Description "You are atop the west wall of a great canyon, offering a marvelous view of the mighty Frigid River below. Across the canyon, the walls of the White Cliffs join the mighty ramparts of the Flathead Mountains. To the north, Aragain Falls may be seen, complete with rainbow. Even further upstream, the river flows out of a great dark cavern. To the west is an immense forest, stretching for miles. It seems possible to climb down into the canyon from here." W_to forestedge D_to canyonbottom } !======================================================= ! CANYON BOTTOM !======================================================= Location canyonbottom "Canyon Bottom" { Description "The walls of the river canyon may be climbable here. To the northeast is a narrow path." NE_to endofrainbow U_to canyonview } !======================================================= ! END OF RAINBOW !======================================================= Location endofrainbow "End Of Rainbow" { Description "You are on a small, rocky beach by the Frigid River, below the falls. A rainbow crosses over the falls to the east and a narrow path continues to the southwest." SW_to canyonbottom OnInput: [ ;go #east currentplayer.print "Can you walk on water vapour?" end endif endif ] } !======================================================= ! BEHIND HOUSE !======================================================= Location behindhouse "Behind House" Nouns "white" "house" "field" Examine "The house is a beautiful white colonial. The owners must have been extremely wealthy." Description "You are behind the white house. Paths lead into the forest to the east and northeast." N_to northofhouse S_to southofhouse E_to forest W_to kitchen NE_to forest NW_to northofhouse SW_to southofhouse OnInput: [ ;go #w,in if ( kitchenouterwindow.openclosestate = false ) then currentplayer.print "The window is closed." end endif endif #in currentplayer.currentlocation = kitchen.ID printallinexcept currentplayer.currentlocation currentplayer.index |currentplayer.name & " climbs into the house through the window."| game.displaycurrentlocation endif endif ] OnDisplay: [ call LockableTwoWayDoors.displaydoor kitchenouterwindow.ID ] } Item kitchenouterwindow "a small window" { StartsIn behindhouse Nouns "small" "window" ReadableText "In one corner of the house is a small window which is closed." Initial "In one corner of the house is a small window which is open." has openable scenery OnAction: [ call LockableTwoWayDoors.doorhandler kitcheninnerwindow.ID kitchenouterwindow.ID 0 ] } !======================================================= ! KITCHEN !======================================================= Location kitchen "Kitchen" { Description "You are in the kitchen of the white house. A table has been used recently for the preparation of food. A passage leads west, a dark staircase leads upward and a chimney leads down." E_to behindhouse W_to livingroom U_to attic OnInput: [ ;go #e,out if ( kitcheninnerwindow.openclosestate = false ) then currentplayer.print "The window is closed." end endif endif #out currentplayer.currentlocation = behindhouse.ID printallinexcept currentplayer.currentlocation currentplayer.index |currentplayer.name & " climbs out of the window."| game.displaycurrentlocation endif #d currentplayer.print "Only Santa Claus climbs down chimneys." endif endif ] OnDisplay: [ call LockableTwoWayDoors.displaydoor kitcheninnerwindow.ID ] } Item kitcheninnerwindow "a small window" { StartsIn kitchen Nouns "small" "window" ReadableText "To the east is a small window which is closed." Initial "To the east is a small window which is open." has openable scenery OnAction: [ call LockableTwoWayDoors.doorhandler kitcheninnerwindow.ID kitchenouterwindow.ID 0 ] } Item glassbottle "a glass bottle" { Nouns "glass" "bottle" StartsIn kitchen Initial "A glass bottle is sitting on the table." has transparent container } Item quantitywater "a quantity of water" { Nouns "quantity" "water" StartsIn glassbottle has edible OnAction: [ ;drink,eat currentplayer.print "That hit the spot." printallinexcept currentplayer.currentlocation currentplayer.index |currentplayer.name & " drinks a quantity of water."| this.currentlocation = limbo currentplayer.hitpoints = |currentplayer.hitpoints + 5| end endif end proc before_get returnvalue = "It slips through your fingers." printallinexcept currentplayer.currentlocation currentplayer.index |currentplayer.name & " empties away a quantity of water."| this.currentlocation = limbo cancelevent end end ] } Item brownsack "a brown sack" { Nouns "brown" "sack" StartsIn kitchen Size 2 Initial "On the table is an elongated brown sack, smelling of hot peppers." has container openable } Item clovegarlic "a clove of garlic" { Nouns "clove" "garlic" StartsIn brownsack has edible OnAction: [ ;eat currentplayer.print "You won't make friends this way, but nobody around here is too friendly anyhow. Gulp!" printallinexcept currentplayer.currentlocation currentplayer.index |currentplayer.name & " eats a clove of garlic."| currentplayer.hitpoints = |currentplayer.hitpoints + 5| this.currentlocation = limbo end endif ] } Item lunch "a lunch" { Nouns "lunch" "food" StartsIn brownsack has edible OnAction: [ ;eat currentplayer.print "That hit the spot." printallinexcept currentplayer.currentlocation currentplayer.index |currentplayer.name & " eats " & this.name & "."| currentplayer.hitpoints = |currentplayer.hitpoints + 10| this.currentlocation = limbo end endif ] } !======================================================= ! ATTIC !======================================================= Location attic "Attic" { Description "This is the attic. The only exit is the stairway down." D_to kitchen has darkness } Item coilrope "a coil of rope" { Nouns "coil" "large" "rope" StartsIn attic Initial "A large coil of rope is lying in the corner." } Item knife "a nasty knife" { StartsIn attic Nouns "nasty" "knife" DamageIndicator 30 has weapon } !======================================================= ! LIVING ROOM !======================================================= Location livingroom "Living Room" { Description "The living room opens to the east. To the west is a wooden door, above which is strange gothic lettering. The door is nailed shut." E_to kitchen D_to cellar OnInput: [ ;go #down if ( rug.getuserboolean(moved) = false ) then currentplayer.print "You can't go that way." end endif if ( trapdoor.openclosestate = false ) then currentplayer.print "The trapdoor is in the way." else currentplayer.currentlocation = cellar.id currentplayer.print "The trap door crashes shut, and you hear someone barring it." trapdoor.openclosestate = false game.displaycurrentlocation endif endif #west currentplayer.print "The door is nailed shut." endif endif ] } Item woodendoor "a wooden door" { StartsIn livingroom Nouns "wooden" "door" Description "The engravings translate to ~This space intentionally left blank.~" ReadableText "The engravings translate to ~This space intentionally left blank.~" has readable scenery OnAction: [ ;open currentplayer.print "It won't open." printallinexcept currentplayer.currentlocation currentplayer.index |currentplayer.name & "attempts to open the wooden door."| end endif ] } Item trophycase "a glass trophy case" { StartsIn livingroom Nouns "glass" "trophy" "case" Size 2 StaticMessage "The trophy case is fixed to the wall." has transparent openable container static } Item rug "an oriental rug" { Nouns "oriental" "rug" StartsIn livingroom Initial "There is a large oriental rug in the center of the room." StaticMessage "The rug is too heavy to lift, but you noticed an irregularity beneath it." has static OnAction: [ ;move,push,pull if ( this.getuserboolean(moved) = false ) then currentplayer.print "You drag the rug to one side of the room, revealing a closed trap door." printallinexcept currentplayer.currentlocation currentplayer.index |currentplayer.name & " drags the rug to one side of the room, revealing a closed trap door."| this.description = "A large oriental rug has been dragged to one side of the room." this.adduserboolean(moved) trapdoor.currentlocation = this.currentlocation endif endif ] } Item trapdoor "a trap door" { Nouns "trap" "door" StartsIn limbo StaticMessage "A valiant attempt." has openable static OnAction: [ ;open if ( this.openclosestate = false ) then currentplayer.print "The door reluctantly opens to reveal a rickety staircase descending into darkness." printallinexcept currentplayer.currentlocation currentplayer.index |currentplayer.name & " opens the trapdoor, revealing a rickety staircase descending into darkness."| this.openclosestate = true endif endif ] } Item brasslantern "a brass lantern" { Nouns "brass" "lantern" "lamp" StartsIn livingroom Initial "A battery-powered brass lantern is on the trophy case." has lightsource } Item sword "a sword" { Initial "Above the trophy case hangs an elvish sword of great antiquity." Nouns "sword" StartsIn livingroom DamageIndicator 40 has weapon } !======================================================= ! CELLAR !======================================================= Location cellar "Cellar" { Description "You are in a dark, damp cellar with narrow passageways to the north and east. On the west is the bottom of a steep metal ramp which is unclimbable." N_to trollroom E_to studio has darkness OnInput: [ ;go #west currentplayer.print "You try to ascend the ramp, but slide back down." end endif endif ] } !======================================================= ! TROLL ROOM !======================================================= Location trollroom "Troll Room" { Description "This is a small room with passages to the east, northeast and south, and a forbidding hole leading west. Bloodstains and deep scratches (perhaps made by an axe) mar the walls." S_to cellar has darkness OnInput: [ #east,northeast if ( troll.currentlocation = trollroom.id ) then currentplayer.print "The troll fends you off with a menacing gesture!" endif endif ] } Character troll "The Troll" StartsIn trollroom Initial "A troll, brandishing a bloody axe, blocks all passages out of the room." Nouns "troll" TimerInterval 5000 DamageIndicator 5 HitPoints 50 has autoattack attackwhenattacked OnTalk: [ currentplayer.print "The troll does not have much to say." ] OnAction: [ call NPCPronouns.male this.id ] } Item bloodyaxe "a bloody axe" { Nouns "bloody" "axe" StartsIn limbo DamageIndicator 35 has weapon OnAction: [ end proc initialise this.currentlocation = troll.containerlocation end ] } !======================================================= ! STUDIO !======================================================= Location studio "Studio" { Description "This was once an artist's studio. The walls are splattered with paints of 69 different colors. To the west is a doorway (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." W_to cellar has darkness OnInput: [ ;go #up if ( currentplayer.itemscarried > 7 ) then currentplayer.print "You are carrying too much to fit up the chimney." end endif currentplayer.currentlocation = kitchen.id game.displaycurrentlocation end endif endif ] } Item painting "a painting" extends treasure { Initial "On the far wall is a painting of unparalleled beauty." HasUDB treasure StartsIn studio Nouns "painting" "paint" OnAction: [ ;smash,break,burn currentplayer.print "Don't be a vandal!" endif ] } Character thief "The Gentleman Thief" Nouns "thief" "gentleman" Initial "Someone carrying a large bag is casually leaning against the wall. It is clear that the bag will be taken only over his dead body." Description "The thief carries a large bag and a vicious stiletto, whose blade is aimed menacingly in your direction." HitPoints 40 TimerInterval 4000 has attackwhenattacked OnTimer: [ var i = 1 var cbi while ( i < |currentplayer.count + 1| ) then cbi = playerarray(i).getfirstboolitem(treasure) if ( cbi > 0 ) and ( playerarray(i).currentlocation = thief.currentlocation ) then playerarray(i).print "The thief pauses to relieve you of some valuables." printallinexcept playerarray(i).currentlocation playerarray(i).index |"The thief relieves" & playerarray(i).name & " of some valuables."| item(cbi).currentlocation = |300000 + thief.id| endif i = |i + 1| endwhile ] OnTalk: [ currentplayer.print "The Gentleman Thief ignores you." ] OnAction: [ call NPCPronouns.male this.id ] } !========================================================== ! Zork specific code !========================================================== Module Zork { ' Module containing code specific to this game proc customafterinput ' Special "what is a grue" message ;what #is if ( input.noun = 999 ) then currentplayer.print "The grue is a sinister, lurking presence in the dark places of the earth. Its favourite diet is adventurers, but its insatiable appetite is tempered by its fear of light." end endif endif endif end proc initzork ' Add noun for our grue addnoun 999 grue ' Set thief to wandering around and start him in the studio thief.AIMode = 2 thief.currentlocation = studio.id end ' Daemon that runs when players are in the dark proc inthedark if ( currentplayer.cansee = false ) then currentplayer.setvalue(darkdaemon) = currentplayer.getvalue(darkdaemon)_+_1 if ( currentplayer.getvalue(darkdaemon) = 4 ) then currentplayer.print "Oh no! A lurking grue slithered into the room and devoured you!" call StandardLib.Dead end endif else currentplayer.setvalue(darkdaemon) = 0 endif end }