#import "lib.ih" #import "doors.ih" #import "pushable.ih" LibraryMessage 1 "
~Ruins~
An Interactive Worked Example
Copyright(c)1999 by Angela M. Horns." ! ---------------------------------------------------------------------------- ! ! This version created by R.Rawson-Tetley in October 2001, from ! Roger Firth's Inform recreation of this game, quoted in Edition 4/1 ! of the Inform Designer's Manual. ! ! PLAYER ! lamp,dictionary,map ! GREAT PLAZA ! | mushroom,packing-case,camera,newspaper,steps ! | ! | ! SQUARE CHAMBER -------------------- WORMCAST ! | inscriptions,sunlight,(key) eggsac ! | ! | ! STOOPED CORRIDOR ! | statuette,door ! | ! | ! UPPER CANYON SHRINE ! | ball / \ paintings,altar,mask,(priest) ! | ---------- ---------- ! | / \ ! XIBALBÁ ANTECHAMBER ! | stela | cage,skeletons,(warthog) ! | | ! | | ! LOWER CANYON BURIAL SHAFT ! | chasm honeycomb ! | ! | ! PUMICE LEDGE ! bone ! ! ---------------------------------------------------------------------------- ! ! Intro LibraryMessage 200 "
  RUINS


~But Alligator was not digging the bottom of the hole
Which was to be his grave,
But rather he was digging his own hole
As a shelter for himself~

-- from the Popol Vuh


[ Please press SPACE to begin.]

Days of searching, days of thirsty hacking through the briars of the forest, but at last your patience was rewarded. A discovery!" GameCode { Name "Ruins" MaxItemsCanCarry 7 Verbose yes WideInventoryDisplay yes SinglePlayerGame yes OverrideSecondaryNouns "66 68 69" ShowAvailableExits no StartingLocation forest AllowPersist yes Initialise: CodeExtend [ addverb 201 photo addverb 201 photograph ] Start: Override [ ' Show the intro screen message(200).show ' Give starting objects to the player map.currentlocation = currentplayer.containerlocation dictionary.currentlocation = currentplayer.containerlocation sodiumlamp.currentlocation = currentplayer.containerlocation ' Show the game version, the library version ' and output the start location to the player game.displayversion call StandardLib.DisplayLibraryVersion game.displaycurrentlocation ' default male/female pronouns call NPCPronouns.init ] Score: Override [ var outs = |"You have scored " & currentplayer.score & " (out of a possible 25) in " & currentplayer.turns & " turns, earning you the rank of "| if ( currentplayer.score = 25 ) then outs = |outs & "Director of the Carnegie Institution."| currentplayer.print outs end endif if ( currentplayer.score >= 20 ) then outs = |outs & "Archaeologist."| currentplayer.print outs end endif if ( currentplayer.score >= 10 ) then outs = |outs & "Curiosity-seeker."| currentplayer.print outs end endif if ( currentplayer.score >= 5 ) then outs = |outs & "Explorer."| currentplayer.print outs end endif outs = |outs & "Tourist."| currentplayer.print outs ] AfterInputImmediate: CodeExtend [ call DarkDaemon.inthedark if ( currentplayer.getvalue(warthog) = 1 ) then ;go,look,examine,smell,search,jump end endif #n,s,e,w,u,d,ne,nw,se,sw end endif ;eat currentplayer.print "You haven't the knack of snuffling up to food yet." end endif ;inventory currentplayer.print "You are empty-handed." end endif currentplayer.print "Warthogs can't do anything so involved. If it weren't for the nocturnal eyesight and the lost weight, they'd be worse off all round than people." end endif ;photo if ( camera.currentlocation <> currentplayer.containerlocation ) then currentplayer.print |"Not without the use of your camera" & "."| end endif if ( input.noun = 4 ) or ( input.noun = |1000000 + currentplayer.index| ) then currentplayer.print "Best not. You haven't shaved since Mexico." end endif if ( currentplayer.itemscarried > 1 ) then currentplayer.print "Photography is a cumbersome business, needing the use of both hands. You'll have to put everything else down." end endif if ( currentplayer.currentlocation = forest.id ) then currentplayer.print "In this rain-soaked forest, best not." end endif if ( currentplayer.cansee = false ) then currentplayer.print "It is far too dark." end endif endif ] } ! ----------------------------------------------------------------------------- ! Treasure class definition ! Item treasure "Treasure Class" { OnAction: [ ;photo if ( this.movedfromoriginallocation = true ) then currentplayer.print "What, and fake the archaeological record?" end endif if ( this.getuserboolean(photoinsitu) = true ) then currentplayer.print "Not again." end endif currentplayer.print |"You set up the elephantine, large-format, wet-plate camera, adjust the sodium lamp and make a patient exposure of the " & this.thename & "."| this.adduserboolean(photoinsitu) endif end proc before_insert if ( input.noun2 = packingcase.nounid ) then call StandardLib.AddScore this.getvalue(culturalvalue) if ( currentplayer.score = 25 ) then currentplayer.print |"As you carefully pack away the " & this.thename & ", a red-tailed macaw flutters down from the tree-tops, feathers heavy in the recent rain, the sound of its beating wings almost deafening, stone falling against stone... As the skies clear, a crescent moon rises above a peaceful jungle. It is the end of March, 1938, and it is time to go home."| call StandardLib.Won end else returnvalue = "Safely packed away." end endif endif end proc initialise this.setvalue(culturalvalue) = 5 end end proc before_get if ( this.currentlocation = packingcase.containerlocation ) then returnvalue = "Unpacking such a priceless artifact had best wait until the Carnegie Intitution can do it." cancelevent end endif if ( this.getuserboolean(photoinsitu) = false ) then returnvalue = "This is the 1930s, not the bad old days. Taking an artifact without recording its context is simply looting." cancelevent end endif end proc before_remove if ( this.currentlocation = packingcase.containerlocation ) then returnvalue = "Unpacking such a priceless artifact had best wait until the Carnegie Intitution can do it." cancelevent end endif if ( this.getuserboolean(photoinsitu) = false ) then returnvalue = "This is the 1930s, not the bad old days. Taking an artifact without recording its context is simply looting." cancelevent end endif end ] } ! ---------------------------------------------------------------------------- ! ! The game begins in the GRAND PLAZA. ! Location forest "~Great Plaza~" { Description "Or so your notes call this low escarpment of limestone, but the rainforest has claimed it back. Dark olive trees crowd in on all sides, the air steams with the mist of a warm recent rain, midges hang in the air. ~Structure 10~ is a shambles of masonry which might once have been a burial pyramid, and little survives except stone-cut steps leading down into darkness below." OnInput: [ ;go #u currentplayer.print "The trees are spiny and you'd cut your hands to ribbons trying to climb them." end endif #in currentplayer.currentlocation = steps.id game.displaycurrentlocation end endif #d if ( steps.getuserboolean(rubblefilled) = true ) then currentplayer.print |"Rubble blocks the way after only a few steps" & "."| end else currentplayer.currentlocation = squarechamber.id game.displaycurrentlocation end endif endif #n,s,e,w,ne,nw,se,sw currentplayer.print "The rainforest is dense, and you haven't hacked through it for days to abandon your discovery now. Really, you need a good few artifacts to take back to civilization before you can justify giving up the expedition." end endif endif ;listen currentplayer.print "Howler monkeys, bats, parrots, macaw." end endif ] } Item mushroom "a speckled mushroom" { StartsIn forest Nouns "speckled" "mushroom" "fungus" "toadstool" Initial "A speckled mushroom grows out of the sodden earth, on a long stalk." Description "The mushroom is capped with blotches, and you aren't at all sure it's not a toadstool." has edible OnAction: [ ;eat steps.removeuserboolean(rubblefilled) currentplayer.print "You nibble at one corner, unable to trace the source of an acrid taste, distracted by the flight of a macaw overhead which seems to burst out of the sun, the sound of the beating of its wings almost deafening, stone falling against stone." end endif end proc before_get if ( this.getuserboolean(picked) = true ) then returnvalue = "You pick up the slowly-disintegrating mushroom." else this.adduserboolean(picked) returnvalue = "You pick the mushroom, neatly cleaving its thin stalk." endif end proc before_drop returnvalue = "The mushroom drops to the ground, battered slightly." end endif ] } Item packingcase "a packing case" { Nouns "packing" "case" "box" "strongbox" StartsIn forest Size 2 Initial "Your packing case rests here, ready to hold any important cultural finds you might make, for shipping back to civilisation." StaticMessage "The case is too heavy to bother moving, as long as your expedition is still incomplete." has static container open openable } Item camera "a wet-plate camera" StartsIn packingcase Nouns "wet-plate" "plate" "wet" "camera" Description "A cumbersome, sturdy, stubborn wooden-framed wet plate model: like all archaeologists, you have a love-hate relationship with your camera." } Item newspaper "a month-old newspaper" StartsIn packingcase Nouns "times" "newspaper" "paper" "month-old" "old" Description "~The Times~ for 26 February, 1938, at once damp and brittle after a month's exposure to the climate, which is much the way you feel yourself. Perhaps there is fog in London. Perhaps there are bombs." ReadableText "~The Times~ for 26 February, 1938, at once damp and brittle after a month's exposure to the climate, which is much the way you feel yourself. Perhaps there is fog in London. Perhaps there are bombs." has readable } Item steps "stone-cut steps" Nouns "steps" "stone" "stairs" "stone-cut" "pyramid" "burial" "structure" "ten" "10" StartsIn forest OnAction: [ ;examine if ( this.getuserboolean(rubblefilled) = true ) then currentplayer.print |"Rubble blocks the way after only a few steps" & "."| end endif if ( this.getuserboolean(visitedsquare) = true ) then currentplayer.print "The cracked and worn steps descend into a dim chamber. Yours might have been the first feet to have trodden them for five hundred years. On the top step is inscribed the glyph Q1." end else currentplayer.print "The cracked and worn steps descend into a dim chamber. Yours might be the first feet to have trodden them for five hundred years. On the top step is inscribed the glyph Q1." end endif endif end proc initialise this.adduserboolean(rubblefilled) end ] has scenery } Item forestmist "a low mist" StartsIn forest Nouns "low" "swirling" "mist" Description "The mist has an aroma reminiscent of tortilla.", has scenery OnAction: [ ;smell currentplayer.print this.defaultexamine end endif currentplayer.print "The mist is too insubstantial." ] } ! ---------------------------------------------------------------------------- ! ! The SQUARE CHAMBER. ! Location squarechamber "Square Chamber" { Nouns "lintelled" "lintel" "lintels" "doorways" Description "A sunken, gloomy stone chamber, ten yards across. A shaft of sunlight cuts in from the steps above, giving the chamber a diffuse light, but in the shadows low lintelled doorways to east and south lead into the deeper darkness of the Temple." U_to forest E_to wormcast S_to corridor has light OnInput: [ #u if ( eggsac.currentlocation = currentplayer.containerlocation ) then currentplayer.print "The moment that natural light falls upon the eggsac, it bubbles obscenely and distends. Before you can throw it away, it bursts into a hundred tiny, birth-hungry insects..." call StandardLib.Dead end endif endif ;put if ( input.noun = eggsac.nounid ) and ( input.noun2 = sunlight.nounid ) then currentplayer.print "You drop the eggsac into the glare of the shaft of sunlight. It bubbles obscenely, distends and then bursts into a hundred tiny insects which run in all directions into the darkness. Only spatters of slime and a curious yellow-stone key remain on the chamber floor." stonekey.currentlocation = currentplayer.currentlocation eggsac.currentlocation = 0 end endif endif ] OnDisplay: [ if ( steps.getuserboolean(beendown) = false ) then steps.adduserboolean(beendown) endif ] } Item carvedinscriptions "carved inscriptions" { StartsIn squarechamber Nouns "carved" "inscriptions" "carvings" "marks" "markings" "symbols" "moving" "scuttling" "crowd" Initial "Carved inscriptions crowd the walls, floor and ceiling." Description "Each time you look at the carvings closely, they seem to be still. But you have the uneasy feeling when you look away that they're scuttling, moving about. Two glyphs are prominent: Arrow and Circle." StaticMessage "Don't be ridiculous." has static } Item sunlight "a shaft of sunlight" { StartsIn squarechamber Nouns "shaft" "of" "sunlight" "sun" "light" "beam" "sunbeam" "ray" "rays" "sun's" "sunlit" "air" "motes" "dust" Description "Motes of dust glimmer in the shaft of sunlit air, so that it seems almost solid." StaticMessage "It's only an insubstantial shaft of sunlight." has static scenery } Item chambermist "a low mist" StartsIn squarechamber Nouns "low" "swirling" "mist" Description "The mist has an aroma reminiscent of tortilla.", has scenery OnAction: [ ;smell currentplayer.print this.defaultexamine end endif currentplayer.print "The mist is too insubstantial." ] } ! ---------------------------------------------------------------------------- ! ! The STOOPED CORRIDOR. ! Location corridor "Stooped Corridor" { Description "A low, square-cut corridor, running north to south, stooping you over." N_to squarechamber S_to shrine has darkness OnDisplay: [ ' Display the door call LockableTwoWayDoors.displaydoor stonedoorcorr.id ] OnInput: [ ' Block player if the door is closed ;go,push #s if ( stonedoorcorr.openclosestate = false ) then currentplayer.print "The door is in the way." endif endif endif ] } Item statuette "a pygmy statuette" extends treasure { StartsIn corridor Nouns "snake" "mayan" "pygmy" "spirit" "precious" "statuette" "statue" Initial "A precious Mayan statuette rests here!" Description "A menacing, almost cartoon-like statuette of a pygmy spirit with a snake around its neck." } Item stonedoorcorr "a stone door" { StartsIn corridor Nouns "door" "massive" "big" "stone" "yellow" Description "It's just a big stone door." ReadableText "The passage is barred by a massive door of yellow stone." Initial "The great yellow stone door is open." HasUDB locked has static openable invisible OnAction: [ call LockableTwoWayDoors.doorhandler stonedoorcorr.id stonedoorshrine.id stonekey.id ] } ! ---------------------------------------------------------------------------- ! ! The SHRINE. ! Location shrine "Shrine" { Description "This magnificent Shrine shows signs of being hollowed out from already-existing limestone caves, especially in the western of the two long eaves to the south." N_to corridor SE_to antechamber has darkness OnDisplay: [ call LockableTwoWayDoors.displaydoor stonedoorshrine.id ] OnInput: [ ;go #sw if ( this.SW <> junction.id ) then currentplayer.print "The eaves taper out into a crevice which would wind further if it weren't jammed tight with icicles. The glyph of the Crescent is not quite obscured by ice." end endif endif #n if ( stonedoorshrine.openclosestate = false ) then currentplayer.print "The door is in the way." endif endif endif ] } Item paintings "the paintings" { StartsIn shrine Nouns "painting" "paintings" "lord" "captive" Initial "Vividly busy paintings, of the armoured Lord trampling on a captive, are almost too bright to look at, the graffiti of an organised mob." Description "The flesh on the bodies is blood-red. The markers of the Long Count date the event to 10 baktun 4 katun 0 tun 0 uinal 0 kin, the sort of anniversary when one Lord would finally decapitate a captured rival who had been ritually tortured over a period of some years, in the Balkanised insanity of the Maya city states." StaticMessage "That's hardly portable." has static } Item stonetable "a slab altar" { StartsIn shrine Nouns "stone" "table" "slab" "altar" "great" Initial "A great stone slab of a table, or altar, dominates the Shrine." StaticMessage "That's hardly portable." has supporter static sit stand lay } Item mask "a jade mosaic face-mask" extends treasure { StartsIn stonetable Nouns "jade" "mosaic" "face-mask" "mask" "face" Initial "Resting on the altar is a jade mosaic face-mask." Description "How exquisite it would look in the Museum." has wearable OnAction: [ ;wear if ( this.currentlocation <> currentplayer.containerlocation ) then currentplayer.print "(taking the jade mosaic face-mask first)" this.currentlocation = currentplayer.containerlocation currentplayer.outputtoplayer = false endif priest.currentlocation = shrine.id if ( currentplayer.currentlocation = shrine.id ) then currentplayer.print "Looking through the obsidian eyeslits of the mosaic mask, a ghostly presence reveals itself: a mummified calendrical priest, attending your word." currentplayer.outputtoplayer = false end endif endif ;disrobe,remove priest.currentlocation = 0 endif ] } Item stonedoorshrine "a stone door" { StartsIn shrine Nouns "door" "massive" "big" "stone" "yellow" Description "It's just a big stone door." ReadableText "The passage is barred by a massive door of yellow stone." Initial "The great yellow stone door is open." HasUDB locked has static openable invisible OnAction: [ call LockableTwoWayDoors.doorhandler stonedoorcorr.id stonedoorshrine.id stonekey.id ] } ! ---------------------------------------------------------------------------- ! ! The WORMCAST. ! Location wormcast "Wormcast" { Description "A disturbed place of hollows carved like a spider's web, strands of empty space hanging in stone. The only burrows wide enough to crawl through begin by running northeast, south and upwards." W_to squarechamber OnInput: [ ;go #s,ne,u currentplayer.print "The wormcast becomes slippery around you, as though your body-heat is melting long hardened resins, and you shut your eyes tightly as you burrow through darkness.
" if ( eggsac.currentlocation = currentplayer.containerlocation ) then currentplayer.currentlocation = squarechamber.id game.displaycurrentlocation end else ' Choose randomly from the corridor, forest and square chamber var rnum = |3 * random + 1 + makeinteger| if ( rnum = 1 ) then currentplayer.currentlocation = corridor.id game.displaycurrentlocation end endif if ( rnum = 2 ) then currentplayer.currentlocation = forest.id game.displaycurrentlocation end endif if ( rnum = 3 ) then currentplayer.currentlocation = squarechamber.id game.displaycurrentlocation end endif endif endif #n,se,sw,e,w,d,nw if ( currentplayer.getvalue(warthog) = 0 ) then currentplayer.print "Though you begin to feel certain that something lies behind and through the wormcast, this way must be an animal-run at best: it's far too narrow for your armchair-archaeologist's paunch." end else currentplayer.print "The wormcast becomes slippery around your warthog body, and you squeal involuntarily as you burrow through the darkness, falling finally southwards to...
" currentplayer.currentlocation = burialshaft.id game.displaycurrentlocation endif endif endif ' If player drops something take it to the square chamber ;drop var imid = getitemfromnoun input.noun if ( imid <> 0 ) then currentplayer.print |"The " & item(imid).thename & " slips through one of the burrows and is quickly lost from sight."| item(imid).currentlocation = squarechamber.id end endif endif ] } Item eggsac "a glistening white eggsac" { Nouns "egg" "sac" "eggs" "eggsac" StartsIn wormcast Initial "A glistening white eggsac, like a clump of frogspawn the size of a beach ball, has adhered itself to something in a crevice in one wall." OnAction: [ end proc before_get returnvalue = "Oh my." end ] } ! ---------------------------------------------------------------------------- ! ! The ANTECHAMBER. ! Location antechamber "Antechamber" { Description "The southeastern eaves of the Shrine make a curious antechamber." NW_to shrine has darkness } Item cage "an iron cage" { StartsIn antechamber Initial "override me" Nouns "iron" "cage" "bars" "barred" "frame" "glyphs" Description "The glyphs read: Bird Arrow Warthog." has enterable transparent container open openable static OnAction: [ ;get,go #in currentplayer.print "The skeletons inhabiting the cage come alive, locking bony hands about you, crushing and pummelling. You lose consciousness, and when you recover something grotesque and impossible has occurred...
" currentplayer.setvalue(warthog) = 1 skeletons.currentlocation = 0 warthoglight.currentlocation = currentplayer.containerlocation game.displaycurrentlocation endif endif ;go #d if ( this.getvalue(flooropen) = 1 ) then currentplayer.currentlocation = burialshaft.id game.displaycurrentlocation end endif endif endif end proc before_displayinitial ' IAGE handles sublocations in a different way to Inform ' - we just override the display description for the object ' in the main location according to where we are. The normal ' library will take care of the rest. ' Show inner desc if we are inside the cage if ( currentplayer.stateitem = cage.id ) then if ( this.getvalue(flooropen) = 1 ) then returnvalue = "From the floor of the cage, an open earthen pit cuts down into the burial chamber." cancelevent end else returnvalue = "The bars of the cage surround you." cancelevent end endif endif ' Otherwise, show the outer description. if ( this.openclosestate = true ) then returnvalue = "An iron-barred cage, large enough to stoop over inside, looms ominously here, its door open. There are some glyphs on the frame." cancelevent end else returnvalue = "The iron cage is closed." cancelevent end endif end ] } Item skeletons "deranged skeletons" { Nouns "skeletons" "skeleton" "bone" "skull" "bones" "skulls" StartsIn cage } ! ---------------------------------------------------------------------------- ! ! The BURIAL SHAFT. ! Location burialshaft "Burial Shaft" { Description "In your eventual field notes, this will read: ~A corbel-vaulted crypt with an impacted earthen plug as seal above, and painted figures conjecturally representing the Nine Lords of the Night. Dispersed bones appear to be those of one elderly man and several child sacrifices, while other funerary remains include jaguar paws.~ (In field notes, it is essential not to give any sense of when you are scared witless.)" N_to wormcast OnInput: [ ;go #u if ( cage.getvalue(flooropen) = 0 ) then cage.setvalue(flooropen) = 1 currentplayer.setvalue(warthog) = 0 currentplayer.print "Making a mighty warthog-leap, you butt at the earthen-plug seal above the chamber, collapsing your world in ashes and earth. Something lifeless and terribly heavy falls on top of you: you lose consciousness, and when you recover, something impossible and grotesque has happened...
" warthog.currentlocation = this.id warthoglight.currentlocation = 0 game.displaycurrentlocation end else ' If the floor is already open, take the player up to the cage currentplayer.currentlocation = antechamber.id currentplayer.stateitem = cage.id currentplayer.state = 5 game.displaycurrentlocation end endif endif #d,s,e,w,ne,nw,se,sw currentplayer.print "The architects of this chamber were less than generous in providing exits. Some warthog seems to have burrowed in from the north, though." end endif endif ;jump if ( cage.getvalue(flooropen) = 0 ) then cage.setvalue(flooropen) = 1 currentplayer.setvalue(warthog) = 0 currentplayer.print "Making a mighty warthog-leap, you butt at the earthen-plug seal above the chamber, collapsing your world in ashes and earth. Something lifeless and terribly heavy falls on top of you: you lose consciousness, and when you recover, something impossible and grotesque has happened..." warthog.currentlocation = this.id warthoglight.currentlocation = 0 game.displaycurrentlocation end endif endif ] } Item honeycomb "an ancient honeycomb" extends treasure { StartsIn burialshaft Nouns "ancient" "old" "honey" "honeycomb" Initial "An exquisitely preserved, ancient honeycomb rests here!" Description "Perhaps some kind of funerary votive offering." has edible OnAction: [ ;eat currentplayer.print "Perhaps the most expensive meal of your life. The honey tastes odd, perhaps because it was used to store the entrails of the Lord buried here, but still like honey." end endif ] } ! ---------------------------------------------------------------------------- ! ! The UPPER/NORTH CANYON. ! Location canyonn "Upper End of Canyon" { Description "The higher, broader northern end of the canyon rises only to an uneven wall of volcanic karst." S_to junction d_to junction has light } Item hugeball "a huge pumice-stone ball" { StartsIn canyonn Nouns "huge" "pumice" "pumice-stone" "stone" "ball" Initial "A huge pumice-stone ball rests here, eight feet wide." Description "A good eight feet across, though fairly lightweight." StaticMessage "There's a lot of stone in an eight-foot sphere." has static OnAction: [ ;pull,turn currentplayer.print "It wouldn't be so very hard to get rolling." end endif ;push #ne if ( currentplayer.currentlocation = junction.id ) then currentplayer.print "The Shrine entrance is far less than eight feet wide." end endif endif if ( input.adverb = 0 ) then currentplayer.print "It wouldn't be so very hard to get rolling." end endif #n,u currentplayer.print "You strain to push the ball uphill." endif #s,d currentplayer.print "The ball is hard to stop once underway." endif call PushableItems.before_push this.id end endif ] } ! ---------------------------------------------------------------------------- ! ! The XIBALBÁ/JUNCTION. ! Location junction "Xibalba" { Description "Fifty metres beneath rainforest, and the sound of water is everywhere: these deep, eroded limestone caves extend like taproots. A slither northeast by a broad collapsed column of ice-covered rock leads back to the Shrine, while a kind of canyon floor extends uphill to the north and downwards to south, pale white like shark's teeth in the diffused light from the sodium lamp above." NE_to shrine N_to canyonn U_to canyonn S_to canyons D_to canyons has light } Item stela "a stela" extends treasure { StartsIn junction Nouns "stela" "boundary" "stone" "marker" Initial "A modest-sized stela, or boundary stone, rests on a ledge at head height." Description "The carvings appear to warn that the boundary of Xibalba, Place of Fright, is near. The Bird glyph is prominent." } ! ---------------------------------------------------------------------------- ! ! The LOWER/SOUTH CANYON. ! Location canyons "Lower End of Canyon" { Description "At the lower, and narrower, southern end, the canyon stops dead at a chasm of vertiginous blackness. Nothing can be seen or heard from below." N_to junction U_to junction OnDisplay: [ if ( hugeball.getuserboolean(plugginggap) = false ) and ( hugeball.currentlocation = this.id ) then hugeball.currentlocation = 0 this.S = onball.id this.description = "The southern end of the canyon now continues onto the pumice-stone ball, wedged into the chasm." currentplayer.print "The pumice-stone ball rolls out of control down the last few feet of the canyon before shuddering into the jaws of the chasm, bouncing back a little and catching you a blow on the side of the forehead. You slump forward, bleeding, and... the pumice-stone shrinks, or else your hand grows, because you seem now to be holding it, staring at Alligator, son of seven-Macaw, across the ball-court of the Plaza, the heads of his last opponents impaled on spikes, a congregation baying for your blood, and there is nothing to do but to throw anyway, and... but this is all nonsense, and you have a splitting headache." end endif ] OnInput: [ #s,d if ( this.S <> onball.id ) then currentplayer.print "Into the chasm?" end endif endif ] has light } Item chasm "a horrifying chasm" { StartsIn canyons Nouns "blackness" "chasm" "pit" "horrifying" "bottomless" has scenery OnAction: [ ;jump #in currentplayer.print "You plummet through the silent void of darkness, cracking your skull against an outcrop of rock. Amidst the pain and redness you dimly make out the God with the Owl-Headdress..." call StandardLib.CustomDeath "You have been captured" end endif #over currentplayer.print "It's far too wide." end endif endif ;search currentplayer.print "The chasm is deep and murky" end endif ;put,drop,throw #in if ( input.noun2 = this.nounid ) then var imid = getitemfromnoun input.noun if ( imid <> 0 ) then currentplayer.print |"The " & item(imid).thename & " tumbles silently into the darkness of the chasm."| item(imid).currentlocation = 0 end endif endif endif endif end ] } ! ---------------------------------------------------------------------------- ! ! The PUMICE LEDGE. ! Location onball "Pumice-Stone Ledge" { Description "An impromptu ledge formed by the pumice-stone ball, wedged into place in the chasm. The canyon nevertheless ends here." N_to canyons D_to canyons U_to canyons has light } Item incisedbone "an incised bone" extends treasure { StartsIn onball Nouns "incised" "carved" "bone" Initial "Of all the sacrificial goods thrown into the chasm, perhaps nothing will be reclaimed: nothing but an incised bone, lighter than it looks, which projects from a pocket of wet silt in the canyon wall." Description "A hand holding a brush pen appears from the jaws of Itzamna, inventor of writing, in his serpent form." } ! ---------------------------------------------------------------------------- ! ! Objects which are moved into position as the game proceeds ! Item sodiumlamp "a sodium lamp" { Nouns "sodium" "lamp" "heavy" Initial "must have initial description to override" has lightsource OnAction: [ ;examine var oput = "It is a heavy-duty archaeologist's lamp, " if ( this.islit = false ) then oput = |oput & "currently off."| else if ( this.getvalue(batterypower) < 10 ) then oput = |oput & "glowing a dim yellow."| else oput = |oput & "blazing with brilliant yellow light."| endif endif currentplayer.print oput endif ;switch #on if ( this.getvalue(batterypower) = 0 ) then currentplayer.print "Unfortunately, the battery seems to be dead." end endif endif endif ;light if ( this.getvalue(batterypower) = 0 ) then currentplayer.print "Unfortunately, the battery seems to be dead." end endif endif ;push #sw if ( currentplayer.currentlocation = shrine.id ) then currentplayer.print "The nearest you can do is to push the sodium lamp to the very lip of the Shrine, where the cave floor falls away." end endif endif call PushableItems.before_push this.id end endif end proc initialise this.setvalue(batterypower) = 100 end proc before_get if ( this.islit = true ) then returnvalue = "The bulb's too delicate and the metal handle's too hot to lift the lamp while it's switched on." cancelevent endif end proc before_displayinitial if ( this.islit = true ) then returnvalue = "The sodium lamp squats on the ground, burning away." cancelevent end else returnvalue = "The sodium lamp squats heavily on the ground." cancelevent end endif end proc each_turn ' This means that our custom description will always be used this.movedfromoriginallocation = false ' Battery daemon if ( this.islit = true ) then var batp = this.getvalue(batterypower) batp = |batp - 1| this.setvalue(batterypower) = batp if ( batp = 10 ) then currentplayer.print "The sodium lamp is getting dimmer!" end endif if ( batp = 5 ) then currentplayer.print "The sodium lamp can't last much longer." end endif if ( batp = 0 ) then currentplayer.print "The sodium lamp fades and suddenly dies." this.islit = false game.displaycurrentlocation end endif endif end ] } Item dictionary "Waldeck's Mayan dictionary" { Nouns "dictionary" "local" "guide" "book" "mayan" "waldeck" "waldeck's" Description "Compiled from the unreliable lithographs of the legendary raconteur and explorer ~Count~ Jean Frederic Maximilien Waldeck (1766??-1875), this guide contains what little is known of the glyphs used in the local ancient dialect." OnAction: [ ;consult if ( input.noun2 = 0 ) then currentplayer.print "Try ~consult dictionary about -name of glyph-~." end endif var lookupnoun = input.snoun2 if ( lookupnoun = "q1" ) then currentplayer.print "(This is one glyph you have memorised!)

Q1: ~sacred site~." end endif if ( lookupnoun = "crescent" ) then currentplayer.print "Crescent: believed pronounced ~xibalba~, though its meaning is unknown." end endif if ( lookupnoun = "arrow" ) then currentplayer.print "Arrow: ~journey; becoming~." end endif if ( lookupnoun = "skull" ) then currentplayer.print "Skull: ~death, doom; fate (not nec. bad)~." end endif if ( lookupnoun = "circle" ) then currentplayer.print "Circle: ~the Sun; also life, lifetime~." end endif if ( lookupnoun = "jaguar" ) then currentplayer.print "Jaguar: ~lord~." end endif if ( lookupnoun = "monkey" ) then currentplayer.print "Monkey: ~priest?~." end endif if ( lookupnoun = "bird" ) then if ( this.getvalue(correct) = 0 ) then currentplayer.print "Bird: ~rich, affluent?~." end else currentplayer.print "Bird: ~dead as a stone~." end endif endif currentplayer.print "That glyph is so far unrecorded." endif ] } ! This may seem a little odd - I am using an item here that represents the available ! glyphs for looking up in the dictionary. This way we have a fast test to see ! what is understood and what is not without resorting to using input.contains or ! an ask statement and parsing it ourselves. This is a useful trick. Item glyphs "the dictionary glyphs" { StartsIn limbo Nouns "q1" "crescent" "arrow" "skull" "circle" "jaguar" "monkey" "bird" } Item map "a sketch-map of Quintana Roo" { Nouns "map" "sketch" "sketch-map" "quintana" "roo" Description "This map marks little more than the creek which brought you here, off the south-east edge of Mexico and into deepest rainforest, broken only by this raised plateau." } Item stonekey "a stone key" { StartsIn limbo Nouns "stone" "key" } Character priest "a mummified priest" { StartsIn limbo Nouns "mummified" "priest" Initial "Behind the slab, a mummified priest stands waiting, barely alive at best, impossibly venerable." Description "He is desiccated and hangs together only by will-power. Though his first language is presumably local Mayan, you have the curious instinct that he will understand your speech." OnAction: [ ;ask var seln = input.snoun2 if ( seln = "dictionary" ) or ( seln = "book" ) then if ( dictionary.getvalue(correct) = 0 ) then currentplayer.print "~The ~bird~ glyph... very funny.~" end else currentplayer.print "~A dictionary? Really?~" end endif endif if ( seln = "glyph" ) or ( seln = "glyphs" ) or ( seln = "mayan" ) or ( seln = "dialect" ) then currentplayer.print "~In our culture, the Priests are ever literate.~" end endif if ( seln = "lord" ) or ( seln = "tomb" ) or ( seln = "shrine" ) or ( seln = "temple" ) then currentplayer.print "~This is a private matter.~" end endif if ( seln = "paintings" ) then currentplayer.print "The calendrical priest frowns. ~10 baktun, 4 katun, that makes 1,468,800 days since the beginning of time: in your calendar 19 January 909.~" end endif if ( seln = "ruins" ) then currentplayer.print "~The ruins will ever defeat thieves. In the underworld, looters are tortured through eternity.~ A pause. ~As are archaeologists.~" end endif if ( seln = "web" ) or ( seln = "wormcast" ) then currentplayer.print "~No man can pass the Wormcast.~" end endif if ( seln = "xibalba" ) then if ( shrine.SW = junction.id ) then currentplayer.print "The priest shakes his bony finger." end else currentplayer.print "The priest extends one bony finger southwest toward the icicles, which vanish like frost as he speaks. ~Xibalba, the Underworld.~" shrine.SW = junction.id end endif endif currentplayer.print "You must find your own answer." endif ;tell currentplayer.print "The priest has no interest in your sordid life." end endif ;attack,kiss this.currentlocation = 0 currentplayer.print "The priest desiccates away into dust until nothing remains, not a breeze nor a bone." end endif ;show,give if ( input.noun = dictionary.nounid ) and ( dictionary.getvalue(correct) = 0 ) then currentplayer.print "The priest reads a little of the book, laughing in a hollow, whispering way. Unable to restrain his mirth, he scratches in a correction somewhere before returning the book." dictionary.setvalue(correct) = 1 end endif if ( input.noun = newspaper.nounid ) then currentplayer.print "He looks at the date. ~12 baktun 16 katun 4 tun 1 uinal 12 kin~, he declares before browsing the front page. ~Ah. Progress, I see.~" end endif currentplayer.print "The priest is not interested in earthly things." end endif ] OnTalk: [ ;go currentplayer.print "~I must not leave the Shrine.~" end endif currentplayer.print "~It is not your orders I serve.~" ] } ! Same trick again - I am using a dummy object for the priests range ! of understandings. Item priestwords "the priest's words" { StartsIn limbo Nouns "dictionary" "book" "glyph" "glyphs" "mayan" "dialect" "lord" "tomb" "shrine" "temple" "paintings" "ruins" "web" "wormcast" "xibalba" } Character warthog "Warthog" { Nouns "wart" "hog" "warthog" Initial "A warthog snuffles and grunts about in the ashes." Description "Muddy and grunting." } Item warthoglight "warthog light" { has light lightsource } ! ----------------------------------------------------------------------------- ! Stuff for dealing with the dark ! Item soundoftinyclaws "a sound of tiny claws" { StartsIn limbo Nouns "tiny" "claws" "sound" "scuttling" "scuttle" "things" "creatures" "monsters" "insects" StaticMessage "The creatures evade you, chittering." has static OnAction: [ ;listen currentplayer.print "How intelligent they sound, for mere insects." end endif ;touch,taste currentplayer.print "You wouldn't want to. Really." end endif ;smell currentplayer.print "You can only smell your own fear." end endif ;attack currentplayer.print "They easily evade your flailing about." end endif currentplayer.print "The creatures evade you, chittering." ] } Module DarkDaemon { proc inthedark if ( currentplayer.cansee = false ) then soundoftinyclaws.currentlocation = currentplayer.currentlocation currentplayer.setvalue(darkturns) = |currentplayer.getvalue(darkturns) + 1| var dtur = currentplayer.getvalue(darkturns) if ( dtur = 1 ) then currentplayer.print "Somewhere, tiny claws are scuttling." currentplayer.outputtoplayer = false end endif if ( dtur = 2 ) then currentplayer.print "The scuttling draws a little nearer, and your breathing grows loud and hoarse." currentplayer.outputtoplayer = false end endif if ( dtur = 3 ) then currentplayer.print "The perspiration of terror runs off your brow. The creatures are almost here!" currentplayer.outputtoplayer = false end endif if ( dtur = 4 ) then currentplayer.print "You feel a tickling at your extremities and kick outward, shaking something chitinous off. Their sound alone is a menacing rasp." currentplayer.outputtoplayer = false end endif if ( dtur = 5 ) then currentplayer.print "Suddenly there is a tiny pain, of a hypodermic-sharp fang at your calf. Almost at once your limbs go into spasm your shoulders and knee-joints lock, your tongue swells..." call StandardLib.Dead end endif else currentplayer.setvalue(darkturns) = 0 soundoftinyclaws.currentlocation = 0 endif end }