WallObject cavewalls with name 'cave' 'limestone' 'flowstone' 'stone', short_name "cave walls", found_in CavePassage CentralCave NearShore FarShore RiverCrawl ConfusingPassage ConfusingEnd, description "The walls are scalloped, folded veils of milky stone.", before [; Touch, Rub: "Faint moisture glistens on the chilly stone."; Climb: "You cannot climb the walls."; ], has pluralname; Object stalas "stone formations" with name 'stone' 'stalactite' 'stalagmit' 'column' 'columns' 'formation' 'pinnacle' 'pinnacles', found_in CentralCave ConfusingPassage, description "Stalactites are the ones on the ceiling. Stalagmites are the ones on the floor. You don't know how you know this.", before [; Examine: rfalse; Climb, ClimbUp, ClimbDown: "Climbing the stone formations is impossible."; default: "You can't do much with the stone formations -- not even the ones you can reach."; ], has scenery pluralname; ! ---- Object CavePassage "Natural Passage" with initial [; if (UnreachableInDark(torch)) { move torch to self; give torch ~moved; } if (UnreachableInDark(warmberries)) remove warmberries; if (UnreachableInDark(coolberries)) remove coolberries; ], description [; print "This is a narrow passageway, which winds between irregular stone walls into the world's underdarkness. The passage was clearly not carved by human hands. Creamy limestone laps and drips in ancient, water-worn folds"; if (self hasnt general && (Hall4 has visited || Lighthouse has visited)) { give self general; print ". For the first time, you have the sense of being far, far underground"; } if (torch has light && IndirectlyContains(self, torch)) print ". Your torch, and the archway to the south, are the only sources"; else print ". The archway to the south is the only source"; " of light; the passage vanishes into cave-blackness, somewhere to the north."; ], s_to Hall2, n_to [; if (~~(torch has light && IndirectlyContains(player, torch))) { print "You venture into the lightless passage...^"; GuideWalkedIntoDarkMessage.invoke(); ToDarkness(CentralCave); rtrue; } return CentralCave; ], cant_go "The passage begins at the south archway, and runs roughly northward.", hinto HintoOutsideDark, coredir s_obj, coredirmod DIRMOD_FAR, has ~general; Object HintoOutsideDark with count 0, description [ subhelp ix jx; if (CentralCave has visited || ConfusingPassage has visited) rfalse; if (subhelp == 0 && self.count & $100 == 0) { self.count = self.count | $100; if (location == CavePassage) print "The area to the north"; else print "This area"; print " is completely dark. You'll need a light source to explore it."; return 2; } if (warmberries has general && (self.count & $1 == 0)) { self.count = self.count | $1; print "The orange berries emit sparks, but they don't last long enough to illuminate a room by themselves."; return 2; } if (HarpRoom hasnt visited) { print "There are many light sources in the game, but you have not yet found a portable one. Keep exploring, and come back here later."; rtrue; } if (torch hasnt moved) { if (self.count & $2 == 0) { self.count = self.count | $2; print "You've seen something that could serve as a torch, although you didn't investigate it."; return 2; } print "The bundle of straw in the Harp Room could serve as a torch, if you could light it."; rtrue; } if (torch has light) { if (torch in player) { print "You're holding a lit torch"; if (location == CavePassage) print "; just head north."; else print "; uh, why is it dark? [BUG]"; rtrue; } if (IndirectlyContains(location, torch)) { print "You've got a lit torch; just pick it up and explore."; rtrue; } print "You left a lit torch lying around here somewhere."; rtrue; } if (self.count & $4 == 0) { self.count = self.count | $4; print "You'll need to find a way to light the torch, somehow."; return 2; } if (self.count & $8 == 0) { self.count = self.count | $8; print "You've found lit candles and a fireplace; but they all seem to be magical fire, or illusion. They won't light a torch."; return 2; } if (GardenWarm hasnt visited) { print "You have not yet found the means to light the torch. Keep exploring, and come back here later."; rtrue; } if (warmberries hasnt general) { if (self.count & $10 == 0) { self.count = self.count | $10; print "The orange berries in the garden are a source of extreme heat."; return 2; } if (self.count & $20 == 0) { self.count = self.count | $20; print "The orange berries in the garden are a source of extreme heat."; print " The simplest solution is to go there, and say ", (helpcmd) "light torch with berries", " or ", (helpcmd) "put torch in bush", "."; return 3; } print "There's also a way to safely pick the orange berries. That would allow you to carry a handful around -- which could be useful."; rtrue; } print "The orange berries you took from the garden are a source of extreme heat"; ix = IndirectlyContains(location, torch); jx = IndirectlyContains(location, warmberries); if (~~ix) { print ". Go get the straw torch"; if (~~jx) print " and the handful of orange berries"; } else { print ". You have a straw torch"; if (~~jx) print "; go get the handful of orange berries"; } if (ix && jx) print ". So you can"; else print ". You can then"; if (self.count & $40 == 0) { self.count = self.count | $40; print " light the torch, using the berries."; return 2; } print " type ", (helpcmd) "light torch with orange berry", " or ", (helpcmd) "put orange berry on torch", "."; rtrue; ]; ! ---- UnlitRoom CentralCave "Vaulting Cavern" with description [; print "A high, arched space opens around you, deep within the earth. The floor is unevenly interspersed with stalagmites and stone columns; your torchlight glitters in droplets from the stalactites above. Between the pale, hanging pinnacles of frozen stone, a vein of dark ore streaks the vault.^^ A narrow passage leads away to the south. A broader one enters on the west side; it once crossed the cave, but the eastern exit has collapsed. A low crawl runs northeast. At one edge of the cave, a pit descends abruptly"; if (cavesteam in self) print ". Wisps of steam rise from its depths"; if (cavefrost in self) print ". Cold air seems to spill from its mouth, and traces of frost are visible around the rim"; "."; ], e_to "The passage leading east has collapsed. Immovable slabs of limestone block it entirely.", s_to [; return GoDark(CavePassage); ], w_to [; return GoDark(NearShore); ], ne_to [; return GoDark(ConfusingPassage); ], d_to [; return GoDark(CavePit1, "You climb carefully into the pit."); ], coredir s_obj, coredirmod DIRMOD_FAR; CeilingObject -> centralcaveceiling with name 'vault', description "The roof is hung with stalactites. A dark vein of stone slashes across the creamy limestone."; Object -> centralcavevein "dark vein" with name 'dark' 'black' 'rusty' 'mark' 'vein' 'of' 'ore' 'stone', description "The vein is a rusty black mark which cuts across the limestone vault above.", before [; Examine: rfalse; default: "The dark vein of ore is far above your reach."; ], has scenery; Object -> centralcavepit "pit" with name 'twisting' 'pit' 'depths' 'hole', description [; print "The floor slopes sharply downward at the cave's edge, narrowing into a twisting pit. It looks like you could climb down safely -- at least as far down as you can see"; if (cavesteam in CentralCave) print ". Wisps of steam rise from the pit"; if (cavefrost in CentralCave) print ". Traces of frost rim the pit"; "."; ], before [; Search: "You can't see very far down."; Touch: if (cavepit.number <= 4) "Humid warmth rises from the pit."; if (cavepit.number >= 8) "A bitter chill radiates from the pit."; "You feel nothing unusual."; Enter, Climb: <>; Receive: "You throw something down there, you'll probably never see it again."; BerryBurn: <>; BerryFreeze: <>; ], has scenery; Object -> cavesteam "wisps of steam" with name 'wisp' 'wisps' 'plume' 'of' 'steam' 'mist' 'fog', description "A thin plume of steam drifts from the pit, rising in the cave's cool air. Perhaps there is a hot spring somewhere below.", before [; Examine: rfalse; Search: <>; Touch: "The air from the pit is hot; it leaves a moist slick on the cool skin of your fingers."; Smell: "A hot mineral odor wafts from the depths of the pit."; default: "The wisps of steam are immaterial."; ], has scenery pluralname; Object cavefrost "traces of frost" with name 'white' 'snow' 'frost' 'ice' 'trace' 'traces' 'of', description "The pit is rimmed with traces of white, new-fallen frost.", before [; Examine: rfalse; Search: <>; Touch, Rub: "The frost melts at your touch."; Blow: "The frost melts in a small dark patch where you breathe on it."; Smell: "The frost is scentless."; BerryBurn: remove self; "You crush an orange berry on the rim of the pit. The juice crackles into flame, melting away the frost."; BerryFreeze: "You crush a white berry on the rim of the pit. The juice turns to frost as you watch, crusting over what is already there."; default: "There isn't enough frost to do anything with."; ], has scenery pluralname; ! ---- UnlitRoom ConfusingPassage "Confusing Passage" with description "The passageway runs from southwest to northeast, more or less. Great columns and masses of stone rise from floor to ceiling; the tunnel divides and enjoins around them, a confusing wrangle of minor branches.", initial [; if (self.count < 3) self.count++; ], cant_go "There are many exits, but they all seem to lead roughly northeast or southwest.", sw_to [; return GoDark(CentralCave, "You pick your way back to the cavern."); ], ne_to [; return GoDark(ConfusingEnd, "You pick your way through the stone formations."); ], u_to "The passage is level.", d_to [; <>; ], out_to [; <>; ], w_to [; <>; ], s_to [; <>; ], e_to [; <>; ], n_to [; <>; ], se_to [ str; if (greychamberentrance in self) { if (GreyChamber has general) str = "You re-enter the narrow passage, which fades into indistinct greyness as you traverse it."; else str = "You enter the narrow passage, which fades into indistinct greyness as you traverse it."; return GoDark(GreyChamber, str); } rfalse; ], count 0, each_turn [; ReminisceMemPalace.invoke(); ], coredir s_obj, coredirmod DIRMOD_FAR; CeilingObject -> confusingceiling with name 'twisted' 'vault' 'stone', description "The roof is a twisted vault of stone, hung with stalactites."; Object greychamberentrance "gap" with name 'gap' 'opening' 'small' 'darkness', initial "A small gap is visible in the stone to the southeast.", description [; print "To the southeast, a narrow gap twists into the darkness"; if (GreyChamber has general) print " -- the opening which released you from the grey chamber"; "."; ], before [; Enter: <>; Search: <>; ], has static; ! ---- UnlitRoom ConfusingEnd "Dead End" with description [; print "The passage from the southwest comes to an abrupt end here, in a round, water-worn alcove. The eastern wall is of dressed granite -- an intrusion in these deep natural caverns. A heavy iron door is set into the wall"; if (cisterndoor has open) print ". It is open, spilling soft light towards you, but it is starting to swing closed"; else print "; it is tightly shut"; "."; ], sw_to [; return GoDark(ConfusingPassage); ], e_to [; if (cisterndoor has locked) <>; return GoDark(cisterndoor, cisterndoor.evoke); ], cant_go "The only ways out are the door to the east, and the passage to the southwest.", coredir sw_obj, coredirmod DIRMOD_FAR; Object -> confusingendwall "granite wall" with name 'granite' 'dressed' 'stone' 'wall' 'block' 'blocks' 'east' 'eastern', description [; print "The wall cuts across the eastern end of the alcove, entirely blocking it. The neatly dressed granite blocks have a slight curve -- as if the chamber beyond formed a large circle. The iron door in the wall is"; if (cisterndoor has open) print " open"; else print " closed"; "."; ], before [; Enter: <>; Climb: "The granite blocks are too tightly fitted to climb."; ], has scenery; ! ---- Object caveriver "underground river" with name 'underground' 'river' 'water' 'sheet' 'black' 'dark' 'stream' 'waterfall' 'cascade', parse_name [ wd num hasice; hasice = (self.number > 0); wd = NextWord(); while (WordInProperty(wd, self, name) || (hasice && wd == 'frozen')) { num++; wd = NextWord(); } return num; ], description [; if (self.number > 0) <>; "The dark stream is three or four yards across. The water reflects the cave walls; you cannot see beneath the surface. But you sense that it flows swiftly. Somewhere to the south, down the river's passage, you can hear the water cascading down into some deeper abyss."; ], found_in NearShore FarShore, number 0, before [; Listen: "The sound of a waterfall echoes somewhere to the south, out of sight."; Touch: "The water has the deep coolness of these subterranean passages. Your touch sets ripples into startling motion -- they fly across the mirror surface and instantly vanish."; Taste, Drink: "The water tastes clean as fresh-born stone."; Enter: if (location == NearShore) <>; if (location == FarShore) <>; <>; JumpOver: "The river is several yards wide -- much too wide to jump."; Receive: if (noun == torch) { if (torch hasnt light) "[BUG] Torch isn't lit in river."; give torch ~light; print "The torch hisses, instantly extinguished. All light dies away.^"; ToDarkness(); rtrue; } "Better not. You'd likely never see it again."; BerryBurn: if (self.number == 0) { "You toss an orange berry into the water, which immediately erupts in a gout of steam."; } if (self.number > 1) self.number = self.number-1; "You gingerly drop an orange berry onto the ice. It spatters into sizzling embers, melting away a wide swath of the surface."; BerryFreeze: if (self.number == 0) { StartDaemon(self); move caveriverice to self; self.number = 7; print "You toss a white berry into the water.^^"; if (self hasnt general) { give self general; print "The response catches your breath away: "; } else { print "Immediately, "; } "planes of frost crackle across the river's surface. Water eddies up around the obstruction, and is subsumed as quickly. The ice snaps and groans, cracking and splitting and freezing again faster than you can follow.^^In seconds, an uneven sheet of ice has formed across the entire width of the river. It seems solid, although water hisses and bubbles underneath."; } if (self.number < 4) self.number = self.number+2; "You drop a white berry onto the ice. Pale juice spatters, spraying fresh frost across the eroding surface."; ], react_before [; Swim: <>; Listen: if (noun == nothing) <>; ], daemon [; self.number--; if (self.number == 0) { StopDaemon(self); remove caveriverice; switch (location) { RiverCrawl: print "^You hear a faint crackling noise, somewhere above.^"; Hall1: print "^A motion, beyond the window, catches your eye. White shards of ice are cascading over the waterfall -- turning, tumbling in the air, shattering to snow on the ledges below. In a breath they are gone.^"; } } if (player in NearShore or FarShore) { switch (self.number) { 5: print "^You can see the upstream edge of the ice slowly, but steadily, wearing away in the current.^"; 3: print "^The ice creaks alarmingly.^"; 1: print "^A dark split streaks across the ice. Water begins to well through.^"; 0: print "^The ice cracks and splits, vanishing into a tumble of grey slabs. They are quickly drawn away in the current, and in moments, the river flows as dark and undisturbed as ever.^"; } } ], has scenery transparent ~general; Object caveriverice "sheet of ice" with name 'sheet' 'of' 'ice' 'frost' 'slab' 'irregular' 'uneven' 'split', description [; print "The river is frozen over, although the current bubbles inaudibly beneath the ice. The surface is cracked and shelved, twisted -- the water, solidified in a tormented instant, has frozen in uneven planes and angles"; if (caveriver.number <= 1) ". The ice is thinning; wet splits are visible in the sheet."; if (caveriver.number <= 3) ". The ice looks solid, although the sheet is beginning to wear thin at the edges."; ". The ice appears solid enough to bear your weight."; ], before [; Touch: "Cold as... cold."; Push: "It seems solid."; Enter: <>; Take, Pull: "The sheet of ice is much too large to move."; Receive: "Better not. The ice won't last forever."; BerryBurn: <>; BerryFreeze: <>; ], has scenery; ! ---- UnlitRoom NearShore "Shore of River" with initial [; WitnessMask(greenmask); if (greenmask in FarShore) SafeMove(streamfarmask, self); else SafeMove(streamfarmask, nothing); ], description [; print "You stand on the eastern shore of"; if (caveriver.number == 0) { print " a black river -- a silent sheet of mirror-dark water which slips by as you watch"; } else { print " a frozen river -- an irregular sheet of pale, cracked ice. It must not be solid to the bottom, for the current hisses and bubbles beneath the ice, emerging beyond it"; } print ". Somewhere, far to the south, you hear the thin roar of falling water. A broad passage leads back to the east"; if (streamfarmask in self) { print ".^^The far shore is a narrow ledge of scree. You can see ", (a) streamfarmask, " lying amid the rubble there"; } "."; ], e_to [; return GoDark(CentralCave); ], w_to [; if (caveriver.number > 0) { return GoDark(FarShore, "Treading carefully, you cross the ice."); } OfferHint(HintoRiverMask); "You cannot tell how deep the water is, but it is moving quite fast. If you lost your footing, or tried to swim, you would certainly be swept away."; ], n_to [; if (caveriver.number > 0) "The ice only extends a few paces up- and down-stream."; "The river flows along a steep-sided tunnel. There is no room to walk on the water's edge."; ], s_to [; <>; ], cant_go [; print "You can only"; if (caveriver.number > 0) print " cross the frozen river, or"; " return back the way you came, to the east."; ], hinto HintoRiverMask, coredir se_obj, coredirmod DIRMOD_FAR; Object -> nearshorefarshore "far shore" with name 'far' 'western' 'shore' 'scree' 'rubble' 'ledge' 'shelf' 'narrow', description [; print "The other side of the river is not as broad as the shore you stand on. It's just a sloping shelf of fallen stone that descends to the water"; if (streamfarmask in NearShore) print ". A ", (name) streamfarmask, " is visible on the far shore"; "."; ], before [; Examine: rfalse; default: "Yards of swift water stretch between you and the far shore."; ], has scenery; Object HintoRiverMask with hint_name streamfarmask, number 0, description [; if (FarShore has visited) rfalse; if (caveriver.number > 0) { print "You can just walk west, over the frozen river, to reach the mask."; rtrue; } if (caveriver has general) { print "The ice has melted. You'll need to freeze it again before you can cross."; rtrue; } print "The river is too wide to jump, and the current is too quick to swim"; if (GardenCool hasnt visited) { if (self.number & $4 == 0) { self.number = self.number | $4; print ". You'll need to find a way to bridge it, somehow."; return 2; } print ".^^You have not yet found the means to cross this river. Keep exploring, and come back here later."; rtrue; } if (coolberries hasnt general) { print ". Perhaps there's a way to bridge it. You've found a source of extreme cold"; if (self.number & $1 == 0) { self.number = self.number | $1; print "; if you could carry it here, you might be able to freeze the water."; return 2; } print " -- the white berries in the garden. If you could carry some here, you might be able to freeze the water."; rtrue; } print ". Perhaps there's a way to bridge it. The white berries"; if (IndirectlyContains(location, coolberries)) print " you've got"; else print " you found earlier"; print " are a source of extreme cold"; if (self.number & $2 == 0) { self.number = self.number | $2; print ". They might suffice to freeze the river over."; return 2; } print " -- they can freeze the river over. There are several ways to enter this command: ", (helpcmd) "put white berry in water", " or ", (helpcmd) "freeze river with white berry", " will work."; rtrue; ]; DistantMaskClass streamfarmask with number greenmask, description [; print_ret "You can see ", (the) self, " on the far side of the river. It looks like a ", (string) self.number.name_str, " paper cutout of a human face."; ], before [; Examine: OfferHint(HintoRiverMask); rfalse; default: OfferHint(HintoRiverMask); print_ret "The river is several yards wide. You cannot reach ", (the) self, " from this shore."; ]; ! ---- UnlitRoom FarShore "Far Shore of River" with description [; print "You have reached the western side of the subterranean river. A narrow shelf of loose rubble slopes down to the water's"; if (caveriver.number > 0) { print " frozen edge. The ice still spans the river, although"; if (caveriver.number > 3) print " it is slowly wearing away in the silent current"; else print " it is thin and beginning to crack"; } else { print " edge. The current is once again smooth and silent"; } ". The shore does not extend far up-stream or down; but at the top of the slope, a narrow crawl leads southwest, away from the river-passage."; ], n_to [; if (caveriver.number > 0) "The ice only extends a few paces up- and down-stream."; "The river flows along a steep-sided tunnel. There is no room to walk on the water's edge."; ], s_to [; <>; ], e_to [; if (caveriver.number > 0) { return GoDark(NearShore, "Treading carefully, you cross the ice."); } "You cannot tell how deep the water is, but it is moving quite fast. If you lost your footing, or tried to swim, you would certainly be swept away."; ], sw_to [; return GoDark(RiverCrawl); ], cant_go [; if (caveriver.number > 0) print "You can only cross the frozen river, or"; else print "With the river flowing clear, you can only"; " enter the southwest crawl."; ], coredir se_obj, coredirmod DIRMOD_FAR; MaskClass -> greenmask with name_wd 'green', name_str "green", count 5, initial [; print_ret "A ", (name) self, " is lying in the scree."; ], description [; self.MaskClass::description(); "^The face depicted shows satisfaction, but no triumph."; ]; ! ---- UnlitRoom RiverCrawl "River Crawl" with description "You are crouched in a narrow twisting crawlway. A faint rushing sound, distant above you, reveals that you are some way below the dark river. The crawl slopes upward to the northeast, back the way you came, and angles even more sharply downward to the southeast.", ne_to [; return GoDark(FarShore, "You twist around and climb back up the crawl."); ], se_to [; return GoDark(CavePit1, CavePitFallIn); ], u_to [; <>; ], d_to [; <>; ], cant_go "The crawl bends northeast and southeast.", coredir se_obj, coredirmod (DIRMOD_ABOVE | DIRMOD_FAR); Object -> rivercrawlriver "river noise" with name 'dark' 'river' 'stream' 'water' 'faint' 'rushing' 'sound' 'noise', description "The water's movement is somehow amplified by its passage through stone. The river must not be far above.", before [; Examine: rfalse; Search, Listen: <>; default: "The river is not present, though you can hear it."; ], react_before [; Listen: if (noun == nothing) <>; ], has scenery; ! ---- Object cavepit "[BUG] cavepit" with number 0, before [ ix; BerryBurn: ix = self.number; print "The orange berry vanishes into the"; if (location == CentralCave) print " pit"; else print " depths"; print ", showering sparks as it bounces from wall to wall"; if (location == CavePit3) { deadflag = 1; GuideEnqueue(GuideFellInPitMessage); print ". Instantly, you hear a bubbling roar. The pool explodes into vapor"; if (ix >= 3) print ", consuming its remaining ice and"; else print ","; " sending a thick gout of steam hurtling up towards you.^^ You clench your eyes shut in the scalding cloud; but sweat and moisture are suddenly slick under your hands. You scrabble for a hold, and then you fall."; } switch (location) { CavePit3: print ". Instantly"; CavePit2: print ". Almost immediately"; default: print ". Seconds later"; } if (ix <= 7) { move cavesteam to CentralCave; give cavepitsteam ~absent; if (cavepitsteam.found_in()) move cavepitsteam to location; StopDaemon(self); self.number = 0; print ", you hear a bubbling roar, and a gout of steam erupts up towards you"; if (location == CentralCave) print ". You duck away; the cloud rolls towards the cavern's roof, slowly dissipating"; else print ". You turn your face away as the airless heat envelops you. Slowly, it dissipates, leaving your clothes soaked with sweat and cooling moisture"; } else { self.number = 4; remove cavefrost; remove cavepitfrost; give cavepitfrost absent; move cavesteam to CentralCave; give cavepitsteam ~absent; if (cavepitsteam.found_in()) move cavepitsteam to location; print ", you hear a crackling roar. Steamy air erupts up towards you, melting the frost"; if (location == CentralCave) print " around the pit"; else print " on the walls"; } "."; BerryFreeze: ix = self.number; self.invoke(); print "The white berry vanishes into the"; if (location == CentralCave) print " pit"; else print " depths"; print ", glancing crystalline motes from the stone as it falls"; if (ix <= 2) { switch (location) { CavePit3: print ".^^Instantly"; CavePit2: print ".^^Almost immediately"; default: print ".^^Seconds later"; } print ", an icy crackle resounds from far below"; if (location == CentralCave) print ". The wisps of steam glitter into a sudden shower of snow, as a wave of cold air rolls up from the pit"; else print ". The warm mist turns in an instant to a hard glitter in the air, as a wave of cold billows up the pit. The walls bloom white into frost"; } else { print ".^^A fresh whirlwind of sparkling frost bursts upward"; if (location == CentralCave) { print " from the pit"; } else { print " past you, glazing the walls anew"; } if (ix <= 4) print ", devouring the hint of steamy warmth in an instant"; } if (location == CavePit3) { deadflag = 1; GuideEnqueue(GuideFellInPitMessage); print ".^^Your fingers are immediately numb. You shift your weight... then scrabble for a hold against the suddenly-merciless ice. Then you slip; then you fall"; } "."; ], invoke [; self.number = 13; StartDaemon(self); remove cavesteam; move cavefrost to CentralCave; remove cavepitsteam; give cavepitsteam absent; give cavepitfrost ~absent; if (cavepitfrost.found_in()) move cavepitfrost to location; ], daemon [ str; self.number--; switch (self.number) { 7: remove cavefrost; remove cavepitfrost; give cavepitfrost absent; 4: move cavesteam to CentralCave; give cavepitsteam ~absent; if (cavepitsteam.found_in()) move cavepitsteam to location; 0: StopDaemon(self); if (location == CavePit3) { deadflag = 1; GuideEnqueue(GuideFellInPitMessage); print "^The gathering moisture oozes on your skin, making your hold uncertain. You shift your position... and feel the sudden, terrifying pain of rock slipping past you.^^ The pool at the pit's bottom is once again in full boil. Your agony is brief.^"; return; } } switch (location) { CentralCave: switch (self.number) { 10: print "^The chill of the air flowing from the pit is beginning to recede.^"; 8: print "^The frost around the pit is slowly melting.^"; 7: print "^The frost around the pit is gone.^"; 5: print "^You feel a hint of warmth.^"; 4: print "^A trace of steam rises from the pit, borne on a breath of renewed heat.^"; 2: print "^The warm current of air is stronger now, and wisps of steam rise from the pit.^"; 0: print "^The steam thickens.^"; } CavePit1, CavePit2, CavePit3: str = "^"; if (location == CavePit3) { switch (self.number) { 4: str = "^The frozen pool is visibly melting. "; 2: str = "^The ice below continues melting.... "; 1: str = "^The ice in the pool is nearly gone.^^"; } } switch (self.number) { 10: print (string) str, "The cold seems a little less bitter now.^"; 8: print (string) str, "The air grows milder; the frost on the pit walls is thinning.^"; 7: print (string) str, "The last traces of frost are gone now.^"; 5: print (string) str, "The air rising from the pit carries a hint of warmth.^"; 4: print (string) str, "A wisp of steam rises past you now.^"; 2: print (string) str, "The air is regaining its humid heat. A mist of condensation is appearing on the stone.^"; 1: print (string) str, "You are beginning to sweat again.^"; 0: print (string) str, "The column of steam thickens.^"; } } ]; [ CavePitFallIn; if (torch in player) { move torch to CavePit1; give torch ~moved; } "You continue crawling down the steepening slope. You soon find it difficult to maintain your grip...^^ Then, with a horrible lurch of your stomach, you slip. The stone floor drops away entirely; your torch goes spinning through empty space as you flail, falling, for a hold that is not there.^^ After a long second, you slam into a rocky ledge."; ]; Object cavepitsteam "mist" with name 'steam' 'fog' 'mist' 'moisture' 'condensat' 'slippery' 'stream' 'air' 'warm' 'moist' 'breath' 'current' 'column', parse_name [ wd num haswater; haswater = (location ~= CavePit3); wd = NextWord(); while (WordInProperty(wd, self, name) || (haswater && wd == 'water')) { num++; wd = NextWord(); } return num; ], found_in [; if (location == CavePit1 or CavePit2 or CavePit3) rtrue; rfalse; ], initial "A warm breath of air rises slowly up the pit, steadily, carrying with it an eddying stream of mist.", description [; print "Mist eddies slowly up the shaft, borne on a current of warm, moist air from below -- perhaps from a hidden subterranean hot spring"; if (cavepit.number <= 2) { print ". The moisture slicks the stone all around you"; if (location == CavePit1) print ", and underfoot"; else print ", leaving your hold uncertain and treacherous"; } "."; ], before [; Examine: rfalse; Search: <>; Smell: "You smell hot minerals in the rising steam."; Touch: "Your fingers are damp and slick already."; Blow: "Your breath ripples the mist."; BerryBurn: <>; BerryFreeze: <>; default: "You can do little to affect the mist."; ], react_before [; Smell: if (noun == nothing) <>; ], has static ~absent; Object cavepitfrost "frost" with name 'ice' 'white' 'frost' 'moisture' 'water' 'snow' 'glitter' 'air' 'layer', found_in [; if (location == CavePit1 or CavePit2 or CavePit3) rtrue; rfalse; ], initial "The air is chill, and a skein of frost furs the stone all around.", description [; switch (cavepit.number) { 8: print "A thin layer"; default: print "A thick layer"; } " of frost clings to the walls of the pit."; ], before [; Examine: rfalse; Search: <>; Smell: "You smell a faint, sterile aroma of ice."; Touch, Rub: "Your touch melts away the frost in tiny dark patches."; Blow: "Your breath melts away the frost in a small dark patch."; BerryBurn: <>; BerryFreeze: <>; ], react_before [; Smell: if (noun == nothing) <>; ], has static absent; ! ---- UnlitRoom CavePit1 "Ledge in Pit" with description [; print "You are balanced on a ledge, leaning against the wall of a twisty, irregular pit. Across from you, and slightly above, you can see a narrow opening in the wall. A climbable rough path leads upward. You might be able to descend further"; if (cavepit.number <= 2) print ", but the pit beneath you is nearly vertical, and the stone is damp and slippery with condensation"; else if (cavepit.number > 7) print ", but the pit beneath you is nearly vertical, and slick with ice"; else print ", although the pit beneath you is nearly vertical"; "."; ], u_to [; return GoDark(CentralCave, "You reach the top of the pit safely."); ], d_to [; return GoDark(CavePit2, "You slowly inch your way down the pit."); ], out_to [; <>; ], cant_go "You can only climb up or down.", before [; Jump: "That would be a bad, bad idea."; ], after [; Drop: "You set ", (the) noun, " down on the ledge."; ], coredir s_obj, coredirmod (DIRMOD_ABOVE | DIRMOD_FAR | DIRMOD_FOLLOWVERT); WallObject -> cavepit1walls with name 'cave' 'limestone' 'flowstone' 'stone' 'pit' 'rough' 'path', description [; if (cavepit.number <= 2) "The pit walls are misted with damp condensation."; if (cavepit.number > 7) "The pit walls are filmed with glittering frost."; "The pit walls are relatively dry."; ], before [; Climb, ClimbUp: <>; ClimbDown: <>; JumpOver: "You could not reach the opening even if you jumped."; Enter: CavePit1.cant_go(); rtrue; BerryBurn: <>; BerryFreeze: <>; ]; FloorObject -> cavepit1ledge with name 'ledge', short_name "ledge", description "It's wide enough to stand on. That's about all it has going for it.", before [; BerryBurn: if (self has general) "You'd better not."; give self general; "The berry spatters on the ledge, showering sparks and hissing vapor. The ledge itself crackles ominously; you feel the stone shift minutely as it heats. Perhaps you shouldn't be aiming so close by."; BerryFreeze: if (self has general) "You'd better not."; give self general; "The berry spatters on the ledge, spattering frost and splinters of ice. The ledge itself crackles ominously; you feel the stone shift minutely as it chills. Perhaps you shouldn't be aiming so close by."; ], has ~general; Object -> cavepitopening "narrow opening" with name 'narrow' 'opening' 'hole', description "There is a narrow opening in the pit wall, perhaps a crawlway branching off horizontally. But there is no way to reach the opening. It is across the pit from your ledge; you could not safely jump there. Nor could you climb around to it -- that part of the wall is smooth and slightly overhung.", before [; Examine: rfalse; Search: "You cannot see very far into the opening."; Receive: "Anything you tossed in would certainly be lost forever."; default: "You cannot reach the opening."; ], has scenery; ! ---- UnlitRoom CavePit2 "Deep in Pit" with description [; print "The shaft is roughly vertical here, and you cling to holds in the wall, hoping desperately that you do not slip. Below you, the pit narrows even further"; if (cavepit.number <= 2) print "; the smooth walls glisten with moisture"; if (cavepit.number > 7) print "; the smooth walls gleam with ice"; ". The climb above looks marginally safer."; ], before [; Disrobe: "Holding on is hard enough without trying to undress at the same time!"; Wear: "Holding on is hard enough without trying to dress up at the same time!"; Drop: if (noun == warmberries or coolberries) <>; "Anything you dropped would certainly be lost forever."; Jump: "That would be a bad, bad idea."; ], u_to [; return GoDark(CavePit1, "You slowly inch your way back upwards."); ], d_to [ ix; ix = 0; if (cavepit.number <= 2) ix = 1; if (cavepit.number > 7) ix = 2; if (ix == 0) { return GoDark(CavePit3, "You brace your knees and back against the smooth stone, one way and the other, and begin the slow descent."); } if (ExpertMode && self hasnt general) { give self general; print "You begin creeping down the pit wall. Almost immediately, your foot slips on"; if (ix == 1) print " the slick damp stone. You clutch for a hold -- and nearly lose it. You are sweating in the air's heat and moisture"; else print " the icy stone. You clutch for a hold -- and nearly lose it"; ". Perhaps this descent is too dangerous to continue."; } deadflag = 1; GuideEnqueue(GuideFellInPitMessage); print "You begin creeping down the pit wall"; if (ix == 1) print "... until your sweating fingers slip on the hot, glistening stone.^^ There is indeed, you discover, a spring of boiling water at the bottom of the pit"; else print "... until your numb fingers slip on the gleaming, icy stone.^^ The bottom of the pit, you discover, is a churned mass of broken, jagged ice"; ". Your agony is brief."; ], cant_go "You can only climb up or down.", hinto HintoArtifactArea, coredir s_obj, coredirmod (DIRMOD_ABOVE | DIRMOD_FAR | DIRMOD_FOLLOWVERT), has ~general; WallObject -> cavepit2walls with name 'cave' 'limestone' 'flowstone' 'stone' 'pit' 'shaft' 'vertical', description [; if (cavepit.number <= 2) "The pit walls are misted with damp condensation."; if (cavepit.number > 7) "The pit walls are filmed with glittering frost."; "The pit walls are relatively dry."; ], before [; Climb, ClimbUp: <>; ClimbDown: <>; JumpOver: "There's nowhere to jump to."; Enter: CavePit2.cant_go(); rtrue; BerryBurn: <>; BerryFreeze: <>; ]; ! ---- UnlitRoom CavePit3 "Depths of Pit" with describe [ ix; print "You hang in a narrow shaft, wedged knees-to-back between the walls. One hand clutches your torch; with the other, you cling to an angle in the rock. You are certain you cannot keep hold here for long.^"; ix = child(cavepithollow); if (ix) { print "^You see ", (a) ix, " before you, wedged into a hollow in the pit wall.^"; } "^Below you, the shaft widens out -- an impossible descent, which leads only to a bubbling underground pool, jagged with rocks and shattered ice."; ], before [; Drop: if (noun == warmberries or coolberries) <>; return CavePit2.before(); Disrobe, Wear, Jump: return CavePit2.before(); ], u_to [; return GoDark(CavePit2, "You slowly chimney your way back upwards."); ], d_to "The pit below you widens, overhung and too wide to chimney. Further descent is impossible.", cant_go "You can only return upwards.", coredir s_obj, coredirmod (DIRMOD_ABOVE | DIRMOD_FAR | DIRMOD_FOLLOWVERT), hinto HintoArtifactArea; Object -> cavepitpool "pool" with name 'rocky' 'bubbling' 'underground' 'pool' 'ice' 'rock' 'rocks' 'hot' 'water' 'jagged' 'frozen', description [; if (cavepit.number >= 4) print "The pool's edges are still caked with shelved ice, but the center is already melted away"; else print "The pool still has traces of ice around its edge, but most of its center has melted"; print ". The dark water bubbles"; if (cavepit.number <= 2) { print " and steams"; if (cavepit.number <= 1) print " furiously"; } else { print " warmly"; } print ", fed by some hidden subterranean fire"; ". Darker and jagged rocks protrude from the surface."; ], before [; Examine: rfalse; Enter: <>; BerryBurn: <>; BerryFreeze: <>; default: "The pool is several yards below you (and you don't want it any closer)."; ], react_before [; Swim: <>; ], has scenery; WallObject -> cavepit3walls with name 'cave' 'limestone' 'flowstone' 'stone' 'pit' 'shaft' 'vertical' 'angle', description [; if (cavepit.number <= 2) "The pit walls are beginning to mist over, as the steam thickens."; "The pit walls are relatively dry."; ], before [; Climb, ClimbUp: <>; ClimbDown: <>; JumpOver: "There's nowhere to jump to."; Enter: CavePit3.cant_go(); rtrue; BerryBurn: <>; BerryFreeze: <>; ]; Object -> cavepithollow "hollow" with name 'hollow', description [ ix; ix = child(self); if (ix == nothing) "You see nothing special about ", (the) self, "."; "A ", (name) ix, " is wedged precariously in the hollow in the stone."; ], before [ ix; Take: "That's hardly portable."; Receive: if (noun == bracelet) "You doubt you could wedge it back into place so neatly."; print_ret (The) noun, " wouldn't fit well; it would just fall out, fall down, and be lost."; EmptyT: "That isn't plausible."; Empty: ix = child(self); if (ix) <>; Enter: "The hollow is only a few inches deep."; ], after [; LetGo: "You steady your hold, lean slightly forwards, and manage to pop ", (the) noun, " out of its hollow. Even better, you manage not to drop it down the shaft."; ], has scenery container open; Artifact -> -> bracelet "tarnished bracelet" with name 'tarnished' 'tarnish' 'metal' 'bracelet' 'band', description [; print "You see a broad band of darkly tarnished metal -- you cannot tell what metal"; if (self has worn) print " -- upon your wrist"; else print " -- an incomplete ring, so that it may easily be slipped on and off"; ". The outer surface is finely engraved with a curving, cross-grained pattern."; ], before [; Search: if (self hasnt worn) "You peer at the inside surface of the bracelet. Nothing is visible but tarnished metal."; Touch: print "The texture is alluring"; if (self has worn) print ", and the metal is warm with your skin's heat"; "."; Rub: "You give the bracelet a few hard rubs, but the tarnish seems to be deeply worn in the metal."; Remove: if (self in player) <>; ], after [; Wear: "With some effort, you slip the bracelet over your left hand."; Disrobe: "With a bit of tugging, you remove the bracelet."; ], scaleweight 91, has clothing ~worn;