! ---- Class CisternRoom with coredir sw_obj, coredirmod (DIRMOD_UNCERTAINPATH | DIRMOD_FAR); [ FoundInCistern; if (location ofclass CisternRoom) rtrue; else rfalse; ]; [ FoundInCisternPlus; if (location ofclass CisternRoom) rtrue; if (location == CisternRising) rtrue; rfalse; ]; Object goop "[BUG] goop" with number 2, count 0, invoke [ withdelay; if (self hasnt general) { give self general; if (withdelay) self.count = 2; else self.count = 0; StartDaemon(self); } ], daemon [ newnum oldnum drainopen ladderflag; ! print "^[DEBUG] goop daemon, count ", self.count, ", num ", ! self.number, ".^"; ! first, the column ladderflag = 0; oldnum = cisterncolumn.number; if (flowvalve hasnt general) { newnum = 0; SetCisternCatwalkCounts(false); } else { if (cisternpipetop hasnt general) { newnum = e_obj; SetCisternCatwalkCounts(false); } else if (glassshard has general) { newnum = ne_obj; SetCisternCatwalkCounts(newnum); } else if (child(smallhole) == nothing) { newnum = n_obj; SetCisternCatwalkCounts(newnum); } else if (child(bighole) == nothing) { newnum = nw_obj; SetCisternCatwalkCounts(newnum); } else if (child(mediumhole) == nothing) { newnum = w_obj; SetCisternCatwalkCounts(newnum); } else if (1) { newnum = se_obj; SetCisternCatwalkCounts(newnum); } else { print "^[BUG] Upper grate is open.^"; newnum = 0; SetCisternCatwalkCounts(true); } } if (newnum ~= oldnum) { cisterncolumn.number = newnum; if (newnum == 0) { remove cisterncolumn; give cisterncolumn absent; print "^Between a breath and a breath, the black column vanishes. It goes from the top end down -- like a rope cut loose from the catwalk, slithering straight down into"; if (goop.number == 2) print " the floor"; else print " the well"; print " without a waver or a splash.^"; } else { give cisterncolumn ~absent; if (FoundInCistern()) move cisterncolumn to location; print "^The black column reappears"; if (cisterncolumn.count || newnum == e_obj) { print ": spilling down from the catwalk"; } else { cisterncolumn.count = 1; print " -- but not where it used to be. It spills down from the catwalk"; } if (newnum ~= e_obj) print " on the ", (string) newnum.name_str, " side of the room,"; print " to the floor"; if (goop.number < 2 && newnum ~= e_obj) print ", and then down the slope,"; print " in one dark silent fall.^"; } if (newnum == e_obj && oldnum ~= e_obj) { remove cisternladderbot; remove cisternladdermid; remove cisternladdertop; ladderflag = 1; } if (newnum ~= e_obj && oldnum == e_obj) { move cisternladderbot to CisternBottom; move cisternladdermid to CisternEast; move cisternladdertop to CisternCatwalkEast; ladderflag = 2; } } ! now, the floor oldnum = self.number; if (self.count > 0) { self.count--; if (FoundInCistern()) { if (goop.number > 0 && child(cisternbottomgrating) == 0) { switch (self.count) { 1: print "^A curious thick gurgle sounds, somewhere below you.^"; 0: print "^The gurgle is louder now.^"; } } } jump daemondone; } drainopen = ((drainvalve has general) && (child(cisternbottomgrating) == 0)); if (flowvalve hasnt general) { if ((~~drainopen) && oldnum > 0) newnum = 1; else newnum = 0; } else { ! flowing... if (~~drainopen) newnum = 2; else newnum = 1; } StopDaemon(self); give self ~general; if (self.number == newnum) jump daemondone; self.number = newnum; if (self.number == 0) { grategauze.evoke(false); } else { if (child(cisternbottomgrating)) grategauze.evoke(true); } if (newnum == 0 && oldnum == 1) { if (location == CisternBottom) print "^The remaining circle of black sinks away, revealing a brass grating at the bottom of the slope.^"; remove cisternbottomblackpuddle; move cisternbottomgrating to CisternBottom; jump daemondone; } if (newnum == 1 && oldnum == 0) { if (location == CisternBottom) print "^Black pools on the grating, hiding it from sight. But the black substance rises no higher.^"; remove cisternbottomgrating; move cisternbottomblackpuddle to CisternBottom; jump daemondone; } if (oldnum == 2) { if (FoundInCistern()) { print "^Suddenly, the black surface"; if (location ofclass CisternCatwalkClass) print " below the catwalk"; else if (player in cisternplatform) print " beneath the platform"; else print " beneath you"; print " -- the entire floor -- begins sinking away, in ripples, like draining oil"; if (cisterncolumn.number == e_obj) print ". The black column lengthens (or is uncovered) as it goes"; print ". The true bottom of the cistern is quickly revealed: a deep, sloping well, lined with granite blocks, as the walls are"; if (location == CisternWest) print ". You are left standing at the top of the slope, as the blackness withdraws from under your feet"; if (cisterncolumn.number && cisterncolumn.number ~= e_obj) print ". The black column extends down the slope, following its angle"; if (location == CisternWest) print ".^^You also notice a brass grating set into the stone floor nearby"; print ".^"; } give HintoCistern general; move cisternwestgrating to CisternWest; if (newnum == 1) { remove cisternbottomgrating; move cisternbottomblackpuddle to CisternBottom; } else { remove cisternbottomblackpuddle; move cisternbottomgrating to CisternBottom; } sweep_movables(CisternEast, CisternBottom); remove cisternblackfloor; give cisternblackfloor absent; give cisternstonefloor ~absent; MoveFloatingObjects(); if (location == CisternEast) { if (player in cisternplatform) { print "^You are left stranded on the glass platform, now high above the floor.^"; } else { print "^You are borne down with the tide, until the last few courses of stone emerge from the blackness beneath your feet.^"; PlayerTo(CisternBottom); } } } else { if (FoundInCistern()) { print "^The bottom of the cistern begins filling once again with the black substance. It ripples outward from the base of the column.^"; } sweep_movables(CisternBottom, CisternEast); remove cisternwestgrating; remove cisternstonefloor; give cisternstonefloor absent; give cisternblackfloor ~absent; MoveFloatingObjects(); if (child(cisternwestgrating)) { move grategauze to CisternWest; if (FoundInCistern()) { ladderflag = 0; CisternRising.invoke(); } } else { switch (location) { CisternWest: print "^The black tide rises until the stone floor, and the grating, are covered -- and then it stops.^"; CisternEast: print "^The black tide rises nearly to the level of the platform -- and then stops.^"; CisternBottom: print "^The black tide rises under your feet, bearing you upward. But it stops before reaching the glass platform.^"; PlayerTo(CisternEast); default: print "^The black tide stops at the level of the glass platform, well below you.^"; } } } .daemondone; if (ladderflag == 1) { print "^The column's return blocks the ladder from view.^"; } if (ladderflag == 2) { print "^You now see a line of handholds -- a ladder -- cut into the wall, where the column previously rose. They ascend from the cistern's bottom, where you stand, past the glass platform, up to the catwalk.^"; } ], has ~general; Array CisternCatwalkArray --> CisternCatwalkEast CisternCatwalkNortheast CisternCatwalkNorth CisternCatwalkNorthwest CisternCatwalkWest CisternCatwalkSouthwest CisternCatwalkSouth CisternCatwalkSoutheast; [ SetCisternCatwalkCounts val ix loc setval; setval = 1; if (val == false) setval = 0; for (ix=0 : ix<8 : ix++) { loc = CisternCatwalkArray-->ix; if (loc.number == val) { loc.count = 2; setval = 0; } else { loc.count = setval; } } if (CisternCatwalkNorth.count == 0) move smallhole to CisternCatwalkNorth; else remove smallhole; if (CisternCatwalkNorthwest.count == 0) move bighole to CisternCatwalkNorthwest; else remove bighole; if (CisternCatwalkWest.count == 0) move mediumhole to CisternCatwalkWest; else remove mediumhole; if (CisternCatwalkSouthWest.count == 0) move catwalkweakcracks to CisternCatwalkSouthWest; else remove catwalkweakcracks; ]; CeilingObject cisternsky with name 'surface' 'luminescent' 'glowing' 'glow' 'white' 'flat' 'featureless' 'plane' 'ellipse' 'oval', short_name "white ceiling", found_in FoundInCisternPlus, description [; print "The ceiling is a white ellipse, remote and blank. It radiates a featureless white glow, which illuminates the chamber -- a perfect and shadowless light"; if (location == CisternWest or CisternEast or CisternBottom) print ".^^A catwalk is hung around the perimeter wall, well below the ceiling, though far above you"; "."; ]; FloorObject cisternblackfloor with name 'surface' 'black' 'flat' 'featureless' 'plane' 'ellipse' 'oval', short_name "black floor", found_in FoundInCisternPlus, description [; "The floor is a black, blank ellipse. The surface seems like it should be reflective, but you can see no reflection within it -- not even the soft glare of the roof."; ], before [; if (action == ##Examine) rfalse; if (location ofclass CisternCatwalkClass) { "The floor is far below you."; } Touch: "The black floor is hard and glassy-smooth."; ], has ~absent; FloorObject cisternstonefloor with name 'stone' 'granite' 'block' 'blocks', short_name "stone floor", found_in FoundInCistern, description [; print "The floor is of tight-fitted granite, like the walls"; if (location == CisternWest) ". On the west side of the room, where you stand, the floor is level; on the east side it slopes down, forming an angled well."; if (location == CisternBottom) ". The floor slopes sharply on this side of the room; it rises to the west."; if (location == CisternEast) ". The floor is level on the far side of the room, but below you, it slopes sharply down, forming an angled well."; ". On the west side of the room, the floor is level; on the east side, it slopes sharply down."; ], before [; if (action == ##Examine) rfalse; if (location ofclass CisternCatwalkClass || (location == CisternEast && goop.number < 2)) { "The floor is far below you."; } ], has absent; WallObject cisternwall with name 'granite' 'dressed' 'stone' 'block' 'blocks', short_name "granite wall", found_in FoundInCisternPlus, description [; "The chamber is walled in a single, elliptical expanse of tightly-dressed granite. The blocks sweep upward in their array to the strange, luminescent ceiling."; ], before [; Climb: "The granite blocks are too tightly fitted to climb."; ]; Object cisterncolumn "black column" with name 'black' 'column' 'vertical', describe [; if (location ofclass CisternCatwalkClass && self.number == location.number) rtrue; ], initial [; if (location ofclass CisternCatwalkClass) { print_ret "A black column descends from the catwalk on the ", (string) self.number.name_str, " side of the room."; } if (self hasnt general) { print "A black column rises along the ", (string) self.number.name_str, " wall, from the"; if (goop.number == 2) print " black floor"; else print " floor"; print " up to the catwalk"; } else { print "A black column descends along the ", (string) self.number.name_str, " wall, from the catwalk down to the"; if (goop.number == 2) { print " black floor"; } else { print " floor"; if (self.number ~= e_obj) print ", and then down the slope to the bottom of the room"; } } if (self.number == e_obj && (location == CisternEast or CisternBottom)) { print ". It passes just to the right of the platform"; } if (self.number == w_obj && (location == CisternWest)) { print ". It passes just to the right of the iron door"; } "."; ], description [; if (location ofclass CisternCatwalkClass) { print "A black column descends from the catwalk"; if (self.number ~= location.number) print " on the ", (string) self.number.name_str, " side of the room"; else print " directly beneath you"; "."; } print "The black column seems to be of the same black, unreflective substance as the floor"; if (goop.number < 2) print " was"; else print ", which it rises directly out of"; if (((location == CisternWest) && (self.number ~= w_obj or nw_obj or sw_obj or n_obj or s_obj)) || ((location == CisternEast or CisternBottom) && (self.number ~= e_obj or ne_obj or se_obj))) { ". You can see no more from here."; } if (location == CisternEast && self.number == e_obj) { print ". The column stands just to one side of the glass platform"; if (goop.number < 2) print "; it descends from the catwalk above, down past the platform, all the way to the stone floor below"; else print "; it rises halfway up the wall, to the level of the catwalk above"; "."; } if (location == CisternBottom && self.number == e_obj) { print ". The column stands to the right of the iron wheel. It descends from the catwalk high above, down past the glass platform, to the black circle at the foot of the wall"; if (goop.number == 0) print "; [BUG] no black circle here"; "."; } print ". The column descends from the catwalk, down along the ", (string) self.number.name_str, " wall, to the floor"; if (goop.number == 2) "."; print ". From there it angles down along the stone, to the lowest point in the room"; if (location == CisternBottom) print ", where it merges with the black circle at your feet"; else if (location == CisternEast) print ", directly below you"; else print ", to the east"; "."; ], found_in FoundInCistern, number e_obj, count 0, before [; if (action == ##Examine) rfalse; if (location ofclass CisternCatwalkClass) { if (location.number == self.number) "The column is below the catwalk, out of reach."; else "The column is not within reach."; } if (player in cisternplatform && self.number ~= e_obj) "You cannot reach the column from the platform."; if (((location == CisternWest) && (self.number ~= w_obj or nw_obj or sw_obj or n_obj or s_obj)) || ((location == CisternEast or CisternBottom) && (self.number ~= e_obj or ne_obj or se_obj))) { "The column is across the room."; } Touch: print "The substance of the column is hard and perfectly smooth -- apparently the same as the floor"; if (goop.number < 2) print " was"; "."; Climb: "The column is much too smooth. You might as well climb a mirror."; ], has static ~absent ~general; Object cisternfarcatwalk "glass catwalk" with name 'glass' 'crystal' 'catwalk' 'trough', found_in CisternEast CisternWest CisternBottom, description [ val; print "The catwalk is far above you"; if (location ~= CisternBottom) print ", though only halfway to the luminescent ceiling"; else print ", halfway between the platform and the luminescent ceiling"; val = cisterncolumn.number; if (val == 0 or e_obj) { print ". It seems to be a single elliptical pathway of glass, running most of the way around the perimeter of the room. The glass, or crystal, is colorless and impossibly clear... but not perfect; you think you can see cracks. It's difficult to tell from down here"; } else if (val == se_obj) { print ". It seems to be a single elliptical pathway of black glass, running most of the way around the perimeter of the room"; } else { print ". It seems to be a single elliptical pathway of glass, running most of the way around the perimeter of the room"; print ". From the east side around to the ", (string) val.name_str, ", where the column descends, the catwalk is black; from that point on, it is colorless and impossibly clear"; } if (gcistfarmask in self) { WitnessMask(gcistfarmask.number); print ".^^You can see a small ", (string) gcistfarmask.number.name_str, " shape -- another mask -- resting on the catwalk, at the"; if (ExpertMode) print " south"; else print " east"; print " edge of its ellipse"; if ((~~ExpertMode) && location ~= CisternWest) print ", directly above you"; } "."; ], before [; Examine: OfferHint(HintoCistern); rfalse; default: OfferHint(HintoCistern); "The catwalk is out of reach."; ], has scenery transparent; DistantMaskClass -> gcistfarmask with name 'small' 'shape', number redmask, description [; WitnessMask(gcistfarmask.number); print (The) self, " is on the catwalk, high above"; if (ExpertMode) print " and to the south"; else print " the eastern side of the room"; print ". You can see it clearly through the glass"; ! should not appear if the glass is black if ((~~ExpertMode) && location ~= CisternWest) print ", directly above you"; "."; ], before [; Examine: OfferHint(HintoCistern); rfalse; default: <>; ]; DistantMaskClass gcistfarmask2 with name 'small' 'shape', number redmask, found_in [; if (location ofclass CisternCatwalkClass) { if (self.number notin location) rtrue; } ], description [; WitnessMask(gcistfarmask.number); print (The) self, " is on the catwalk, at your level, but at the"; if (ExpertMode) print " southern"; else print " eastern"; " edge of the room."; ], before [; Examine: rfalse; default: "You'll have to move around the catwalk to reach it."; ], has ~absent; Object HintoCistern with hint_name gcistfarmask, hint_suppress [; if (gcistfarmask notin cisternfarcatwalk) rtrue; ], count 0, description [; if (location == CisternCatwalkEast) { print "You've made it to the mask."; rtrue; } if (self.count & $80 == 0) { self.count = self.count | $80; print "Have you taken a close look at the catwalk above you?"; return 2; } if (self.count & $1 == 0) { self.count = self.count | $1; print "You'll have to find a way up to the catwalk."; return 2; } if (CisternEast hasnt visited) { print "There's no way up on this side of the room. Keep looking around."; rtrue; } if (self hasnt general) { if (self.count & $2 == 0) { self.count = self.count | $2; print "You can't see any way up to the catwalk. But levers were meant to be played with. Try different actions. And remember that some things take time."; return 2; } if (self.count & $4 == 0) { self.count = self.count | $4; print "Pull the lever."; return 2; } print "And, after you pull the lever, wait to see what happens."; rtrue; } if (location == CisternEast && goop.number < 2) { if (cisternladdermid in CisternEast) { print "You seem to have a way up now."; rtrue; } if (self.count & $8 == 0) { self.count = self.count | $8; print "Well, well. You've stranded yourself. An interesting result, but not what you wanted. You'd better reverse what you've done, and then try something a little different."; return 2; } print "Push the lever. And then wait. And then try something different."; rtrue; } if (CisternBottom hasnt visited) { if (goop.number < 2) { print "You've found a way to drain the cistern. Surely it's worth exploring the newly-uncovered bottom."; rtrue; } if (self.count & $10 == 0) { self.count = self.count | $10; print "You've found a way to lower the floor, or drain the cistern -- however you want to consider it. But you were trapped on the platform. Is it possible to drain the place ", (emph) "without", " being left high and dry there?"; return 2; } if (self.count & $20 == 0) { self.count = self.count | $20; print "It takes a few moments after you pull the lever for the cistern to drain. Could you do something in that time besides wait?"; return 2; } print "Pull the lever, and then get off the platform (or go west). That way you won't be stuck on the platform after the cistern drains."; rtrue; } if (location == CisternBottom) { if (cisternladderbot in CisternBottom) { print "You seem to have a way up now."; rtrue; } print "You've worked hard to reach this spot. Either the wheel or the grating must be somehow important."; rtrue; } print "You worked hard to reach the bottom well of the cistern. There must be something important there."; rtrue; ], has ~general; Object cisterndoor "iron door" with name 'heavy' 'iron' 'massive' 'door' 'bar' 'high' 'sill', article "an", found_in ConfusingEnd CisternWest, description [; print "The door is a massive iron affair with a high sill. It has no keyhole, only an iron bar for a handle. The door is"; if (self has open) print " open, but starting to swing closed"; else print " closed"; "."; ], door_dir [; if (location == ConfusingEnd) return e_to; else return w_to; ], door_to [; if (self.number > 1) self.number = 1; if (location == ConfusingEnd) return CisternWest; else return ConfusingEnd; ], before [; Push: if (location == CisternWest) "The door is hinged to swing towards you."; <>; Pull: if (location == ConfusingEnd) "The door is hinged to swing away from you."; <>; Open: if (self has locked) { if (location == CisternWest) "[BUG] door locked inside."; "You push on the door, but it is now utterly immovable."; } if (self has open) { self.number = 2; if (location == ConfusingEnd) print "You shove on the iron bar"; else print "You yank on the iron bar"; ", delaying the door's attempt to close itself."; } self.invoke(); if (location == ConfusingEnd) ". Light pours from the other side -- gentle, but still bright after your torchlit exploration."; else ". The cistern's light spills out meagerly into the cave-darkness beyond."; Attack: if (self has open) print_ret (The) self, " is open."; "No answer, and the iron hurts your knuckles."; Close: if (self has open) "It's already closing."; ], evoke [; ! "self" broken, sorry. Don't use it. if (cisterndoor has locked) "[BUG] Locked door in evoke check."; if (cisterndoor hasnt open) { cisterndoor.invoke(); ", and slip through."; } "You dodge through the slowly closing door."; ], invoke [; if (self has locked) "[BUG] Locked door invoked."; give self open; self.number = 2; StartDaemon(self); if (self hasnt general) { give self general; print "You push on the door -- and then set yourself and heave again; for it is as massive as it looks, and weighted to close of its own accord. By leaning hard against the iron, you get it open"; } else { print "You heave the door open"; } ], number 0, daemon [; self.number--; if (self.number <= 0) { StopDaemon(self); give self ~open; if (location == CisternWest or ConfusingEnd) print "^The iron door swings to with a faint ", (emph) "boom."; if (location == ConfusingEnd && (~~(torch has light && IndirectlyContains(location, torch)))) { print " The light beyond is sealed away.^"; ToDarkness(); } else { print "^"; } } ], has door openable ~open ~locked scenery ~general; Class CisternLadder with short_name "ladder", name 'handhold' 'handholds' 'hollow' 'hollows' 'ladder', description "They're just shaped hollows in the granite.", before [; Search: "There's nothing in there."; Receive: "That won't help."; ], has static; Class CisternGrating with name 'brass' 'rough' 'hammered' 'grating' 'grate' 'slab' 'sheet' 'round' 'circle', description "It's a round slab of rough hammered brass, pierced by finger-sized holes.", before [; Open: "The grating is securely fastened into the stone floor."; Take, Pull, Push: <>; Search: "There is empty space beneath the grate, but you cannot tell what might be there."; LookUnder, LookBehind: <>; Enter: "Certainly impossible."; Receive: "Putting ", (thatorthose) noun, " on ", (the) self, " would achieve nothing."; ], has static transparent; Object grategauze "scrap of gauze" OrreryNorth with name 'scrap' 'of' 'gauze' 'pale' 'gauzy' 'rag' 'weave' 'cobweb' 'circle' 'round', initial "A pale gauzy rag is crumpled at the alcove's edge.", description [; print "The scrap is perfectly round; its weave spirals like a cobweb, and the fine strands glint pearl-pale. But holes mar it everywhere, as if an uncaring child had forced fingers through the gauze again and again"; if (parent(self) ofclass CisternGrating) print ". The gauze is stretched over the grating, which it perfectly fits"; "."; ], before [; Examine: if (self hasnt moved) "It just looks like a pale dusty scrap, abandoned in a corner."; Search: <>; Pull: if (parent(self) ofclass CisternGrating) <>; "The gauze is stronger than it looks. You cannot tear the weave."; Take: if (parent(self) ofclass CisternGrating) { move self to player; "The gauze crackles faintly as you peel it away from the grating."; } Wave, Blow: "The gauze ripples weightlessly."; Touch, Rub: "The pale strands are soft as felt."; Smell: print "The pale scrap smells"; self.number++; if (self.number == 1) " somehow of... darkness? The contradiction catches at your memory."; print " somehow of darkness.^"; if (self.number == 2) { ! reminisce print "^", (emph) "~To de-still a quality out of its natural substance is a matter of craft, and you will learn such craft: rigidity, pain, splendor are essences of value. To calcine these essences into new substance is a matter of art. As no substance is pure, these artifices take on qualities you may not know.~", "^^", (emph) "The voice slows, turns inward. ~The liquor of rage has its own potent flavor. The golden thread of heart's need can bind what needs be bound. Do not limit such things to the uses of their own names.~", "^"; } rtrue; ], number 0, invoke [ target; if (self notin player) "[BUG] gauze invoked not in player"; move self to target; print "You begin spreading the circle of gauze across the grating. It clings"; if (self hasnt general) { give self general; print ", and seems almost to shift in your fingers; and now you see that the holes in the pale web line up precisely with the holes in the brass beneath it. In"; } else { print ", and in"; } print " a few moments, the grating is entirely covered"; "."; ], after [; Take: if (self hasnt moved) "You lift the rag and spread it in your hands. It's finer than you had originally thought -- a delicate cobwebby gauze -- but the weave is wracked with holes."; ], count 0, evoke [ val; if (~~val) { if (self.count) { StopDaemon(self); self.count = 0; } } else { if (self.count == 0) { StartDaemon(self); self.count = 5; } } ], daemon [; if ((self notin cisternbottomgrating) || (goop.number == 0)) { StopDaemon(self); self.count = 0; return; } self.count--; if (self.count == 0) { StopDaemon(self); if (goop.number == 1) { move self to CisternBottom; if (location == CisternBottom) print "^With a gentle ", (emph) "fwip,", " the scrap of gauze emerges from the black disk.^"; } else if (goop.number == 2) { move self to CisternEast; if (location == CisternEast) print "^With a gentle ", (emph) "fwip,", " the scrap of gauze floats up through the black surface.^"; } goop.invoke(true); } ], scaleweight 7, has ~general; ! ---- CisternRoom CisternWest "Cistern, West" with !initial [; ! WitnessMask(gcistfarmask.number); !], description [; print "You are at the edge of an immense and empty elliptical chamber. The walls are of granite blocks, tightly fitted and dressed, bare of window or ornament. It feels like a vast cistern, not a place for human habitation. The only exit is the"; if (cisterndoor has open) print " door directly west"; else print " closed door directly west"; if (goop.number == 2) { print ".^^ The floor is a flat, perfect plane of black"; if (self hasnt general) { give self general; print " stone... or metal... or glass. You can't tell ", (emph) "what", " it is"; } print ". The roof, far above, is an equally flat and perfect surface of featureless, luminescent white. Both spread out eastward, defining the chamber between them. And halfway in between, a glass catwalk runs around the wall, girdling the room"; "."; } else { print ".^^The stone floor is level where you stand, but to the east it slopes sharply down"; print ". The roof, far above, is a flat and perfect surface of featureless, luminescent white. Halfway up to it, a glass catwalk runs around the wall, girdling the room"; "."; } ], w_to [; if (~~(IndirectlyContains(player, torch))) "This room is well lit, but the caverns outside are dark. You really don't want to leave your torch behind."; ! if torch is unlit, door.daemon will take care of endarkening us. cisterndoor.evoke(); return cisterndoor; ], out_to [; <>; ], e_to [; if (goop.number == 2) { return CisternEast; } else { print "You walk down the angled floor.^"; return CisternBottom; } ], d_to [; if (goop.number < 2) <>; ], u_to [; OfferHint(HintoCistern); "There is no way up to the catwalk here."; ], cant_go "You can walk across the chamber to the east, or leave through the western door.", hinto HintoCistern, has ~general; CisternGrating cisternwestgrating "brass grating" with initial [; print "A brass grate is set into the the floor near the door"; if (child(self)) print ". A scrap of pale gauze is stretched over it"; "."; ], description [; if (goop.number == 2) "[BUG] grating present at nonzero level."; print "It's a round slab of rough hammered brass, pierced by finger-sized holes"; if (child(self)) print ". The surface of the grate is covered with a fine pale gauzy web"; ". You can see only darkness below."; ], before [; Receive: if (noun == grategauze) { if (child(self)) "The grate is already covered."; grategauze.invoke(self); rtrue; } ], has static; ! ---- CisternRoom CisternEast "Cistern, East" with description [; if (goop.number < 2) { if (player notin cisternplatform) print "[BUG] Not on platform. "; print "You are standing on a glass platform at the eastern side of the elliptical cistern. The platform is about three strides across; it juts out over a deep well"; if (cisternladdermid notin self) print ". You see no way off"; } else { if (player notin cisternplatform) print "You are at the eastern side of the elliptical cistern, standing next to a low glass platform"; else print "You are standing on a low glass platform at the eastern side of the elliptical cistern"; print ". The platform is about three strides across; it juts out from the granite wall, a bare inch above the dead-black floor"; } print ".^^High above you, a glass catwalk runs around the room's perimeter"; "."; ], before [; Go: if (player in cisternplatform) { switch (noun) { w_obj: if (goop.number < 2) <>; print "You step off the platform.^"; move player to self; d_obj: if (goop.number == 2) <>; if (cisternladdermid notin self) { OfferHint(HintoCistern); "You see no safe way to descend."; } move player to self; u_obj: if (cisternladdermid notin self) { OfferHint(HintoCistern); "There is no way up to the catwalk here."; } move player to self; } } Exit: if (player in cisternplatform) { if (goop.number < 2) { if (cisternladdermid notin self) OfferHint(HintoCistern); print "You can't leave the platform -- the floor is gone"; if (cisternladdermid notin self) print "! The stone bottom of the cistern is too far below you to descend safely"; else print ". The only ways off are up or down the ladder"; "."; } move player to self; "You step from the platform down onto the black surface."; } ], after [; Go: if (goop.number < 2) move player to cisternplatform; ], w_to [; return CisternWest; ], d_to [; if (goop.number == 2) rfalse; return CisternBottom; ], u_to [; if (cisternladdermid notin self) { OfferHint(HintoCistern); "There is no way up to the catwalk here."; } return CisternCatwalkEast; ], cant_go [; if (cisternladdermid in self) { if (goop.number == 2) "The only ways out are west, and up the ladder."; else "The only ways off the platform are up the ladder and down it."; } else { if (goop.number == 2) "The only way out is to the west."; else "There is no way off the platform!"; } ], hinto HintoCistern; SittableClass -> cisternplatform "glass platform" with name 'glass' 'crystal' 'low' 'platform', description [; print "The platform curves out from the wall at the easternmost end of the room -- you think of the bubble at one end of an egg. It is a single perfect sheet of crystal or glass, two inches thick, and just an inch above the black floor. Or nearly perfect; the edges are chipped, in places.^^ The iron lever projects from the platform's edge, near the wall. "; ; rtrue; ], before [ ix; Search: ix = children(self); if (ix == 0) "There is nothing on the platform."; if (ix == 1 && player in self) "Besides yourself, there is nothing on the platform."; ix = child(self); if (player in self) print "Besides yourself, you see "; else print "You see "; WriteListFrom(ix, TERSE_BIT + ENGLISH_BIT + CONCEAL_BIT); " on the platform."; LookUnder: if (goop.number == 2) "The only thing beneath the platform is the black surface of the floor."; else "An empty well falls beneath your feet. The stone floor is a long way below the platform."; ], after [; Enter: if (keep_silent) "(first stepping onto the glass platform)"; "You step up onto the platform."; ], has supporter enterable scenery; Object -> drainvalve "iron lever" with name 'heavy' 'iron' 'lever' 'bar', initial "A heavy iron lever rises from the platform, by the wall.", description "The lever is just a plain iron bar. Its base is clearly a socket, although you cannot see what mechanism it connects to -- the glass beneath it is oddly shadowed.", before [ kx; if ((action ~= ##Examine or ##Search) && player notin cisternplatform) { kx = keep_silent; keep_silent = 1; ; keep_silent = kx; if (player notin cisternplatform) "You cannot reach the lever, since you are not standing on the platform."; } Pull: if (self has general) "The lever is pulled all the way down. Perhaps you mean to push it."; give self general; goop.invoke(true); kx = (goop.number > 0 && child(cisternbottomgrating) == 0); print "You pull the lever, which clunks"; if (kx) print " stiffly"; else print " freely"; " down. The clunk is echoed from below you."; Push: if (self hasnt general) "The lever is pushed all the way up. Perhaps you mean to pull it."; give self ~general; goop.invoke(true); kx = (goop.number > 0 && child(cisternbottomgrating) == 0); print "You push the lever, which clunks"; if (kx) print " stiffly"; else print " freely"; " back up. The clunk is echoed from below you."; ], has static ~general; CisternLadder cisternladdermid with initial [; print "Handholds cut into the wall, to the right of the platform, form a ladder leading"; if (goop.number == 2) " upwards."; else " both up and down."; ], before [; ClimbUp: <>; ClimbDown: <>; Climb, Enter: if (goop.number == 2) <>; "Do you want to climb up or down?"; ]; ! ---- CisternRoom CisternBottom "Cistern, Bottom" with description [; if (goop.number >= 2) "[BUG] Cistern Bottom with goop too high."; "You are at the bottom of the cistern, at the edge, where the down-sloping floor meets the east wall. Directly above you hangs the glass platform; yards above that, the catwalk circumnavigates the room; and above that, the white ellipse of the ceiling spreads its featureless radiance."; ], w_to [; print "You walk up the slope.^"; return CisternWest; ], u_to [; if (cisternladderbot notin self) { print "You can see no way up to the platform"; if (cisterncolumn.number == e_obj) print ". The wall is unclimbable; the black column even worse"; "."; } print "You seize the stone handholds and begin climbing.^"; return CisternEast; ], cant_go [; print "You can only go west"; if (cisternladderbot in self) print ", or up the ladder"; "."; ], hinto HintoCistern; Object -> flowvalve "iron wheel" with name 'heavy' 'iron' 'metal' 'hub' 'wheel', initial "A heavy iron wheel is set into the eastern wall.", description "The wheel is supported on a thick hub which protrudes from the wall. The edge is deeply notched, as if the wheel were meant to be gripped and turned -- it reminds you of a ship's rudderwheel.", before [; Touch: if (self has general) "A barely-perceptible vibration thrums through the wheel."; else "Just worn iron."; Push, Pull: "The wheel can only be turned."; Turn: if (self hasnt general) <>; else <>; Switchon: if (self has general) "The wheel will turn no farther to the right."; give self general; goop.invoke(false); "You spin the wheel to the right until it stops. As you do, a faint, unsteady vibration grows in the metal."; Switchoff: if (self hasnt general) "The wheel will turn no farther to the left."; give self ~general; give cisterncolumn general; goop.invoke(false); "You spin the wheel to the left until it stops. A faint vibration within the metal -- perceptible only when you laid hands on it -- slowly stills."; ], has static general; Object -> cisternbottomplatform "glass platform" with name 'glass' 'crystal' 'low' 'platform', description "The platform hangs a couple of yards over your head. The lever upon it is clearly visible through the glass.", before [; Examine: rfalse; Search: <>; LookUnder: print_ret (emph) "You", " are underneath the glass platform."; default: "The platform is too far above you to reach -- or rather, you have descended too far below its level."; ], has scenery transparent; Object -> -> cisternbottomlever "iron lever" with name 'heavy' 'iron' 'lever' 'bar', before [; default: <>; ], has scenery; CisternLadder cisternladderbot "ladder" with initial "Simple handholds cut into the wall form a ladder leading upwards.", before [; Climb, Enter: <>; ]; CisternGrating cisternbottomgrating "brass grating" with initial [; print "A brass grate is set into the lowest angle of the floor, just by the wall"; if (child(self)) print ". A scrap of pale gauze is stretched over it"; "."; ], description [; if (goop.number ~= 0) "[BUG] grating present at nonzero level."; print "It's a round slab of rough hammered brass, pierced by finger-sized holes"; if (child(self)) print ". The surface of the grate is covered with a fine pale gauzy web"; if (drainvalve has general) ". You can see only darkness below."; else ". The holes are blocked by another layer of metal; there must be another sheet of brass just below the grating."; ], before [; Search: if (drainvalve hasnt general) "There is another sheet of brass just below the grating, sealing it."; Receive: if (noun == grategauze) { if (child(self)) "The grate is already covered."; grategauze.invoke(self); rtrue; } ], has static; Object cisternbottomblackpuddle "black circle" with name 'surface' 'black' 'flat' 'featureless' 'plane' 'small' 'round' 'circle' 'disc' 'disk', initial [; print "At the lowest angle of the floor, just by the wall, you see a black circle -- a small disk of the featureless substance which once floored this entire chamber"; if (cisterncolumn.number) { if (cisterncolumn.number == e_obj) print ". The black column merges into its rim"; else print ". The black column angles down the slope to merge with its rim"; } "."; ], description "It is a black, blank circle, less than two feet across. The surface seems like it should be reflective, but you can see no reflection within it.", before [; Touch: "The black circle is hard and glassy-smooth."; ], has static; ! ---- Class CisternCatwalkClass class CisternRoom, with number 0, count 0, description [; "[BUG] You are in the ", (string) self.number.name_str, " catwalk, with count ", self.count, "."; ], u_to "There is no way farther up.", d_to "There is no way down here.", cant_go "You can only follow the catwalk around.", hinto HintoArtifactArea, coredirmod (DIRMOD_UNCERTAINPATH | DIRMOD_FAR | DIRMOD_BELOW); FloorObject cisterncatwalkcatwalk "catwalk" with name 'catwalk' 'trough' 'glass', parse_name [ wd num hasgoop; hasgoop = ((location ofclass CisternCatwalkClass) && (location.count > 0)); wd = NextWord(); while (WordInProperty(wd, self, name) || (hasgoop && wd == 'black' or 'substance' or 'plane')) { num++; wd = NextWord(); } return num; ], short_name [; if (location.count == 0) print "glass catwalk"; else print "black catwalk"; rtrue; ], description [; if (location.count == 0) { print "The catwalk is a shallow glass trough, a yard wide and perhaps a foot deep"; switch (location.number) { e_obj: print ". It begins here, and"; se_obj: print ". It ends here, and"; default: print ". It"; } print " seems to curve almost all the way around the room at this level"; switch (location.number) { n_obj: print ".^^The glass is uneven and slightly cracked. You see a hole the size of your thumb in the trough's bottom"; nw_obj: print ".^^The glass is cracked and uneven. You see a hole the size of your fist in the trough's bottom"; w_obj: print ".^^The glass is cracked and irregular. You see an egg-sized hole in the trough's bottom"; sw_obj: print ".^^The glass is badly cracked here; opaque glinting seams run across the breadth of the catwalk"; default: print ".^^The glass is thick and clear, but somewhat uneven at the edges -- small chips and cracks mar it"; } "."; } else if (location.count == 1) { print "The catwalk is a flat black pathway, a yard wide. The black substance seems to fill it to the brim"; "."; } else { switch (location.number) { ne_obj: print "The flat black pathway ends here. The black substance seems to rear up and spill over the edges of the catwalk, joining the black column which descends directly beneath you. To the"; se_obj: print "The black substance meets the wall, where it seems to rear up and spill over the edges of the catwalk. There it joins the black column which descends directly beneath you"; "."; default: print "The flat black pathway ends here. The black substance seems to drain down through the glass, joining the black column which descends directly beneath the catwalk. To the"; } print " "; switch (location.number) { ne_obj: print "northwest"; n_obj: print "west"; nw_obj: print "southwest"; w_obj: print "south"; sw_obj: print "southeast"; s_obj: print "east"; se_obj: print "[BUG]"; } print ", the catwalk continues as a shallow glass trough"; "."; } ], found_in FoundInCisternCatwalk; Object catwalkholecracks "cracks" with name 'crack' 'cracks' 'spiderweb' 'web' 'hairline' 'fracture' 'fractures', found_in [; if (location == CisternCatwalkNorth or CisternCatwalkNorthwest or CisternCatwalkWest) { if (location.count ~= 1) rtrue; } rfalse; ], description [; print "They're hairline fractures, barely visible except when they catch a sliver of light. But they run quite a distance across the glass surface"; if (location.count == 2) print ". The cracks seem to spread out from under the end of the black substance"; else print ". The cracks spread out from a hole in the bottom of the trough"; "."; ], before [; Touch, Rub: "No hint of uneven edge catches your fingers."; Receive: if (location.count == 0) { switch (location) { CisternCatwalkNorth: <>; CisternCatwalkNorthwest: <>; CisternCatwalkWest: <>; } } ], has scenery pluralname; [ FoundInCisternCatwalk; if (location ofclass CisternCatwalkClass) rtrue; else rfalse; ]; Class GumClass with name 'gum' 'of' 'blob' 'blobs//p' 'cloudy' 'brown' 'resin', list_together "blobs of gum", before [; Smell: "The resin smells of dust, and of what a thousand years ago was a tree."; Taste: "The gum leaves a bitter and aromatic tang in your mouth."; Eat: "You're pretty sure you don't want to eat this stuff."; Squeeze, Push, Pull: "The gum yields slightly and stickily, but its core is rigid."; Touch, Rub: "The gum is, well, a bit gummy."; Take: if (parent(self) ofclass GumHoleClass) { move self to player; "You pry at the blob with your thumbnail. After a few moments, you manage to work it loose."; } ]; Class GumHoleClass with name 'hole' 'gap' 'sized', description [ ix; print "Several cracks converge, leaving a gap in the glass surface the size of ", (string) self.name_str; ix = child(self); if (ix) { if (ix == glassshard) { print ". The hole is tightly covered by an irregular slab of glass"; } else { print ". The hole is"; if ((ix == smallgum && self == smallhole) || (ix == biggum && self == bighole)) print " perfectly filled"; else print " awkwardly stoppered"; print " by ", (a) ix; } } "."; ], before [ ix; Take: "The hole is hardly portable."; Search: ix = child(self); if (ix) { if (ix == glassshard) { print "The hole is tightly covered by an irregular slab of glass"; } else { print "The hole is"; if ((ix == smallgum && self == smallhole) || (ix == biggum && self == bighole)) print " perfectly filled"; else print " awkwardly stoppered"; print " by ", (a) ix; } "."; } "Looking through the hole, you see the room below. (Of course, you can see that through the glass catwalk anyway.)"; Receive: ix = child(self); if (ix) "The hole is already blocked by ", (the) ix, "."; if (noun == glassshard) { move noun to self; "You lower the slab carefully, covering the hole in the trough."; } if (noun ofclass GumClass) { if (noun == smallgum && self ~= smallhole) "The blob is too small for that -- it would just fall through the hole."; move noun to self; if ((noun == smallgum && self == smallhole) || (noun == biggum && self == bighole)) print "The blob fits perfectly into the hole; the"; else print "The blob sits awkwardly on top of the hole, but the"; " resin squishes firmly around the edges."; } if (noun ofclass KeyClass) { "Dropping that through the hole won't solve anything."; } if (noun == grategauze) { "The gauze doesn't seem to want to spread across the glass. It clings to itself, and to your hand, as if the air were driest winter."; } "That won't fit in the hole."; ], has scenery transparent; ! ---- CisternCatwalkClass CisternCatwalkEast "Cistern Catwalk, East" with initial [; WitnessMask(gcistfarmask.number); ], number e_obj, description [; if (self.count == 0) print "You stand on the catwalk -- or rather, ", (emph) "in", " the catwalk. The glass surface is curved, forming a shallow trough"; else print "You stand on the catwalk -- or rather, on the black substance which fills the catwalk's trough"; print ". It begins here, on the east side of the cistern, and follows the wall around to the north"; "."; ], n_to CisternCatwalkNortheast, nw_to CisternCatwalkNortheast, s_to "The catwalk ends here. You can only follow it north.", sw_to [; <>; ], d_to [; print "You shift yourself to the handholds and descend.^"; return CisternEast; ], cant_go "You can only follow the catwalk to the north, or climb back down.", hinto HintoCistern; Object -> cisternpipetop "spout" with name 'pipe' 'brass' 'heavy' 'graceful' 'fitting' 'curve' 'curved' 'spout', initial [; print "A heavy brass pipe protrudes from the wall"; if (cisternladdertop in CisternCatwalkEast) print ", between the catwalk and the ladder"; if (self hasnt general) print ". The end of the pipe is a curved fitting, which ends in a graceful brass spout. But the spout does not point down; it curves to the right, towards the ladder"; else print ". The spout on the end of the pipe curves left, towards the catwalk"; if (flowvalve has general) { print ". An arc of the blackness falls from the spout"; if (self hasnt general) print "; it flows down the wall, forming the black column"; else print "; it merges seamlessly into the black substance which fills the trough"; } "."; ], description [; print "The pipe is a thick tube of hammered brass, with heavy fittings. It extends about a foot from the wall; it is just beyond the catwalk's end and just above the catwalk's level. The end of the pipe is a graceful curved spout, which bends"; if (self hasnt general) print " towards the ladder"; else print " towards the catwalk"; print ".^^The spout looks slightly loose on its fitting, as if you could turn it"; if (flowvalve has general) { print ". An arc of the blackness falls from the spout"; if (self hasnt general) print " and down the wall"; else print " and into the trough"; } "."; ], before [; Search: "You cannot see far into the curved pipe. But there seem to be inky-black streaks along the inside surface."; Receive: "You cannot put anything into the spout."; Take: print "The spout and pipe are anchored firmly in the wall"; if (flowvalve hasnt general) print ". However, the spout shifts slightly when you tug on it. It feels like you could rotate it"; "."; Turn: if (flowvalve has general) "The pipe is now fixed rigidly in position."; if (self hasnt general) { give self general; "You rotate the spout to the left. It now curves out over the catwalk."; } else { give self ~general; "You rotate the spout back to the right. It now curves out over the ladder."; } Push, Pull, SwitchOn, SwitchOff: <>; ], has static ~general; MaskClass -> redmask with name_wd 'red', name_str "red", count 3, initial [; print "A ", (string) self.name_str, " mask"; if (CisternCatwalkEast.count == 0) " is lying in the trough."; else " is lying on the catwalk."; ], description [; self.MaskClass::description(); "^The face depicted wears a mix of confidence and anger."; ], after [; Take: remove gcistfarmask; give gcistfarmask2 absent; remove gcistfarmask2; ]; CisternLadder cisternladdertop with initial "Just past the end of the catwalk, a ladder runs down the wall.", before [; Climb, Enter: <>; ]; ! ---- CisternCatwalkClass CisternCatwalkNortheast "Cistern Catwalk, Northeast" with number ne_obj, description [; if (self.count == 0) print "You stand in the glass trough, on the northeast side of its arc"; else print "You stand on the black surface which fills the catwalk"; if (self.count ~= 2) print ". It runs northwest and southeast from here"; if (self.count == 2) print ". The blackness stops at this point; the substance seems to dam up and spill over the edges of the catwalk, joining the black column which descends beneath your feet. To the northwest, the catwalk is an empty glass trough"; "."; ], se_to CisternCatwalkEast, s_to CisternCatwalkEast, nw_to CisternCatwalkNorth, w_to CisternCatwalkNorth; Object -> glassshard "large glass slab" with name 'large' 'irregular' 'glass' 'curved' 'slab' 'shard', describe [ loc; if (self has general) { print "^A large, curved slab of glass is leaning in the trough here. It rests on edge, nearly upright, although the way it wedges against the sides keeps it from falling"; if (CisternCatwalkNortheast.count == 2) print ". It is there that the black substance stops"; "."; } ! If loc.count==1, maybe the slab should be buried. But ! I say it floats on goop unless there's a hole under it. Ha. loc = parent(self); if (loc ofclass CisternCatwalkClass && loc.count == 0) "^A large, curved slab of glass is lying in the bottom of the catwalk. It matches the trough's curve exactly."; rfalse; ], description [ ix; print "The glass slab is irregular, a foot wide and a few feet long. It has a gentle, even curve along its length"; if (self has general) { print ". The slab is standing edge-up in the trough, crossing it from side to side"; if (CisternCatwalkNortheast.count == 2) print ". The black substance runs up to this dam and stops there, spilling up over the edges of the catwalk"; "."; } if (location ofclass CisternCatwalkClass) { print " -- as if it were a slice of the catwalk itself"; if (self in location && location.count == 0) print ". In fact, the slab is lying in the bottom of the trough, snug along its surface"; ix = parent(self); if (ix ofclass GumHoleClass) { print ". In fact, the slab is lying in the bottom of the trough, covering the hole snugly"; } } "."; ], before [; Take: if (self has general && CisternCatwalkNortheast.count == 2) "The slab seems to be rigidly embedded in the black substance, which spills around it. You cannot move the slab at all."; if (parent(self) ofclass GumHoleClass) { move self to player; "You lift the slab from the cracked surface."; } Push, Pull, Turn: if (self has general && CisternCatwalkNortheast.count == 2) <>; if (self has general) { give self ~general; "The slab seems somewhat jammed in place. You give it a sharp wrench, though, and it twists free. The slab is now lying in the trough's bottom."; } ], after [; Take: if (self has general) { give self ~general; "The slab seems somewhat jammed in place, but you give a tug and lift it free."; } Drop: if (location ofclass CisternCatwalkClass && location.count == 0) { print "You lay the slab down"; if (location == CisternCatwalkNorth or CisternCatwalkNorthwest or CisternCatwalkWest or CisternCatwalkSouthwest) print " in an undamaged section of"; else print " in"; " the trough."; } ], has general; GumClass -> smallgum "small gum blob" with name 'small' 'thumb' 'thumb-sized', scaleweight 14, description "It's a blob of cloudy brown resin, the size of the end of your thumb."; GumClass -> biggum "big gum blob" with name 'big' 'large' 'fist' 'fist-sized', scaleweight 38, description "It's a blob of cloudy brown resin, a bit larger than your fist."; ! ---- CisternCatwalkClass CisternCatwalkNorth "Cistern Catwalk, North" with number n_obj, description [ ix; if (self.count == 0) print "You stand in the glass trough"; else print "You stand on the black surface which fills the catwalk"; print ", on the north side of the chamber"; if (self.count ~= 2) print ". It runs east and west from here"; if (self.count == 2) print ". The blackness stops at this point; the substance seems to drain right down through the catwalk, joining the black column which descends beneath your feet. To the west, the catwalk is an empty glass trough"; if (self.count == 0) { print ". The catwalk is somewhat cracked at this point. The cracks spiderweb several feet of the glass surface; at their center, a small hole is broken right through"; ix = child(smallhole); if (ix == glassshard) print ".^^A curved slab of glass covers the hole"; if (ix ofclass GumClass) print ".^^The hole is plugged by ", (a) ix; } "."; ], e_to CisternCatwalkNortheast, se_to CisternCatwalkNortheast, w_to CisternCatwalkNorthwest, sw_to CisternCatwalkNorthwest; GumHoleClass -> smallhole "small hole" with name 'small' 'thumb' 'thumb-sized', name_str "your thumb"; ! ---- CisternCatwalkClass CisternCatwalkNorthwest "Cistern Catwalk, Northwest" with number nw_obj, description [ ix; if (self.count == 0) print "You stand in the glass trough"; else print "You stand on the black surface which fills the catwalk"; print ", on the northwest side of the chamber"; if (self.count ~= 2) print ". It runs southwest and northeast from here"; if (self.count == 2) print ". The blackness stops at this point; the substance seems to drain right down through the catwalk, joining the black column which descends beneath your feet. To the southwest, the catwalk is an empty glass trough"; if (self.count == 0) { print ". The catwalk is rather cracked at this point. A web of cracks spreads nearly across the trough; at their center, a large hole is broken right through"; ix = child(bighole); if (ix == glassshard) print ".^^A curved slab of glass covers the hole"; if (ix ofclass GumClass) print ".^^The hole is plugged by ", (a) ix; } "."; ], ne_to CisternCatwalkNorth, e_to CisternCatwalkNorth, sw_to CisternCatwalkWest, s_to CisternCatwalkWest; GumHoleClass -> bighole "big hole" with name 'big' 'large' 'fist' 'fist-sized', name_str "your fist"; ! ---- CisternCatwalkClass CisternCatwalkWest "Cistern Catwalk, West" with number w_obj, description [ ix; if (self.count == 0) print "You stand in the glass trough"; else print "You stand on the black surface which fills the catwalk"; print ", at the west edge of the chamber"; if (self.count ~= 2) print ". It runs south and north from here"; if (self.count == 2) print ". The blackness stops at this point; the substance seems to drain right down through the catwalk, joining the black column which descends beneath your feet. To the south, the catwalk is an empty glass trough"; if (self.count == 0) { print ". The catwalk is heavily cracked at this point. The cracks spiderweb several feet of the glass surface; at their center, a medium-sized hole is broken right through"; ix = child(mediumhole); if (ix == glassshard) print ".^^A curved slab of glass covers the hole"; if (ix ofclass GumClass) print ".^^The hole is plugged by ", (a) ix; } "."; ], n_to CisternCatwalkNorthwest, ne_to CisternCatwalkNorthwest, s_to CisternCatwalkSouthwest, se_to CisternCatwalkSouthwest; GumHoleClass -> mediumhole "medium hole" with name 'medium' 'medium-sized' 'egg' 'egg-sized', name_str "an egg"; ! ---- CisternCatwalkClass CisternCatwalkSouthwest "Cistern Catwalk, Southwest" with number sw_obj, description [; if (self.count == 0) print "You stand in the glass trough, on the southwest side of its arc"; else print "You stand on the black surface which fills the catwalk"; print ". It runs southeast and northwest from here"; "."; ], nw_to CisternCatwalkWest, n_to CisternCatwalkWest, se_to [; <>; ], e_to [; if (self.count == 0) "The glass squeals alarmingly, and you feel sharp-edged splinters shifting under your foot's weight. You hastily step back, fearing that the cracked glass will give way entirely."; return CisternCatwalkSouth; ], before [; Jump: if (self.count == 0) "The cracked glass squeals alarmingly against itself."; ]; Object catwalkweakcracks "cracks" with name 'crack' 'cracks' 'fracture' 'fractures' 'wave' 'waves' 'parallel' 'splinter' 'splinters' 'seam' 'seams', initial "Parallel waves of cracks mar the glass surface. The fractures are even thicker to the east; there the trough seems ready to fall into splinters.", before [; Touch, Rub: "The merest uneven edge cuts your skin -- not even deep enough to draw blood."; Push, Attack: "The cracked glass looks too fragile to support your weight, much less an assault. You'd rather not."; Receive: if (noun == glassshard) "The cracked area is much too large to cover with your slab of glass."; if (noun ofclass GumClass) "The glass is thickly cracked, but no pieces are actually missing; there is no hole to fill."; if (noun == grategauze) "The gauze doesn't seem to want to spread across the glass. It clings to itself, and to your hand, as if the air were driest winter."; rfalse; ], has static pluralname; ! ---- CisternCatwalkClass CisternCatwalkSouth "Cistern Catwalk, South" with number s_obj, description [; if (self.count == 0) print "You stand in the glass trough, on the south side of its arc"; else print "You stand on the black surface which fills the catwalk"; print ". It runs east and west from here"; "."; ], w_to CisternCatwalkSouthwest, nw_to CisternCatwalkSouthwest, e_to CisternCatwalkSoutheast, ne_to CisternCatwalkSoutheast; ! ---- CisternCatwalkClass CisternCatwalkSoutheast "Cistern Catwalk, Southeast" with number se_obj, description [; if (self.count == 0) "[BUG] Southeast catwalk without black."; if (self.count == 1) "[BUG] Southeast catwalk with insufficient black."; "The black catwalk curves around from the southwest, but it bends sharply outward here -- straight into the southeast wall, where it ends."; ], sw_to CisternCatwalkSouth, w_to CisternCatwalkSouth, se_to "The catwalk runs into the outer wall, and stops. You certainly can't get through the grating.", cant_go "You can only follow the catwalk back to the southwest."; CisternGrating -> cisterncatgrating "brass grating" with initial "A brass grate is set into the wall, at the trough's end. The black substance runs up to the grate; but it does not pass through -- it seems to be blocked by a gauzy pale film that coats the brass. Instead, the blackness spills up and over the edges of the catwalk, joining the black column beneath your feet.", description "It's a round slab of rough hammered brass, pierced by finger-sized holes. The surface of the grate is covered with a pale gauzy web. The grating is half-submerged in the black substance, but nothing seems to be flowing through it.", before [; Open: "The grating is securely fastened into the wall, and half-buried in the black substance to boot."; Search: "There is empty space behind the grate, but you cannot tell what might be there."; Receive: if (noun == grategauze) { "The grate is already covered."; } ], has static; Object -> -> cisterncatgauze "film of gauze" with name 'film' 'of' 'gauze' 'pale' 'gauzy' 'weave' 'cobweb' 'circle' 'round', description "The grate appears to be covered with a film of pale gauze. The glinting strands cling to the brass surface like a cobweb to a leaf. The film is delicate, and pierced with holes -- just as the grate beneath it is pierced -- but the black substance nevertheless refuses to pass through.", before [; Pull: <>; Take: "Much of the grate's surface is buried beneath the black tide. You peel away the upper edge of the gauze, but the material below is trapped; you cannot pull it free."; Touch, Rub: "The pale strands are soft as felt."; LookUnder: "Beneath the gauze is a brass grating."; ], has static; Object -> blackchart with name 'crumpled' 'black' 'wad' 'chart' 'material' 'rift' 'lettering', short_name [; print "crumpled black"; if (self hasnt moved) print " wad"; else print " chart"; rtrue; ], description [; if (self hasnt moved) "You'll have to pick it up to see what it is."; "The chart depicts ruling dynasties through time. Its lettering is inhumanly precise, etched in white on an odd black material. The chart's scale is so large that individual names do not appear; single lives are only jogs and serifs in the asterisms of descent.^^ You recognize a few of the family names, a few of the countries and states and kingdoms -- not many, and all seem distant and unimportant. But your eye is drawn to a rift in the middle of the chart. Many lines end there. New lines begin beyond it. Dynasties across the world seem to break or shear from that brief stretch... though ~brief~ is an interval of centuries, if you read the scale correctly.^^ A concise note by the rift reads: ~Colloquially, the Silver Demon Age. Plague? War? Widespread turmoil and political instability. Records unusually rare from this era.~^^ And below that, in a different and familiar scrawl: ~History is larger than any one man: this therefore is no history.~"; ], initial "A crumpled black wad is lying here, barely visible against the catwalk.", before [; Touch, Rub: "The black material feels more like fabric than paper -- but a slick fabric, fantastically fine-grained."; ], after [; Take: if (self hasnt moved) { give self moved; "You pluck the wad from the catwalk, and try to smooth it out. It proves to be a chart, incised with fine white lines and lettering."; } ]; ! ---- Object CisternRising "Cistern, Rising" with description [; print "You are standing within an elliptical chamber, upon a plane of perfect black -- a plane which is rapidly rising, lifting you towards the equally perfect plane of light above"; switch (self.count) { 2: print ". Not far above, you note"; 3: print ". Close above"; 4, 5: print ". Frighteningly close above"; } "."; ], u_to "That's already in progress.", d_to "Up seems more likely.", cant_go "The door is gone, submerged. You see no other way out of the cistern chamber.", invoke [ val; val = false; switch (location) { CisternWest: print "^The black tide rises until the stone floor, and the grating, are covered. Then it is rising beneath your feet"; CisternEast: print "^The black tide rises to the level of the platform. Then it is rising beneath your feet"; CisternBottom: print "^The black tide rises under your feet, bearing you upward. In moments, the platform is covered"; default: val = true; print "^The black tide rises past the glass platform. You stare, trying to grasp the black surface's silent approach... and then the catwalk is submerged as well. The tide lifts you towards the shining roof.^"; } if (~~val) print "; and the catwalk is approaching; and then the catwalk is submerged as well. The tide lifts you towards the shining roof.^"; PlayerTo(self, true); self.count = 0; StartDaemon(self); ], evoke [; print "^The black floor and the white ceiling meet, and merge. The infinitesmal gap, too narrow even for a ray of light or darkness, excludes all possibility; within that moment you see all your own time, moving more swiftly than thought.^^"; print (emph) "Nothing is simpler, for that moment, than to move into it.", "^"; StopDaemon(self); self.count = 0; sweep_movables(self, CisternWest); move greychamberentrance to ConfusingPassage; TransportEffect(); PlayerTo(GreyChamber); ], count 0, daemon [; self.count++; switch (self.count) { 1: print "^The black floor continues to rise, and you along with it.^"; 2: print "^Your ascent continues. The chamber is beginning to seem much less lofty than it once was.^"; 3: print "^The bright glow of the roof is getting closer.^"; 4: print "^The roof is nearly within reach now.^^You glance around in panic. You still can't see any way out.^"; 5: self.evoke(); } ], hinto HintoArtifactArea, coredir "very, very far away"; ! ---- Object GreyChamber "Grey Chamber", with description [; print "This space forms an ellipse around you; but the walls are featureless, and the planes above and below are indistinct, indistinguishable. You do not recognize this world. Even the silence is not the silence of the caverns. Your movements raise no echo.^^"; print "A small gap to the west reveals an opening to more familiar stone and darkness"; "."; ], w_to [; if (~~(torch has light && IndirectlyContains(player, torch))) { print "You venture into the lightless passage...^"; ToDarkness(ConfusingPassage); rtrue; } print "You creep into the gap. The air seems to change around you, to the common cool damp of the caverns"; if (self hasnt general) { give self general; print ". In moments, you emerge -- into a familiar confusion of stone. You look behind you, trying to remember which passage let you free.^"; } else { print ". In moments, you emerge.^"; } return ConfusingPassage; ], out_to [; <>; ], cant_go "The only opening is to the west.", before [; Smell: if (noun == nothing) "You take a startling gasp of a breath. Had you not been breathing?"; Listen: if (noun == nothing) "You hear nothing at all."; ], count 0, each_turn [; self.count++; switch (self.count) { 3: print "^Even your breathing is muffled. If indeed you do breathe, here. You are suddenly unsure.^"; 6: print "^Time seems to thicken and slow around you.^"; } ], hinto HintoArtifactArea, coredir "muted and infinitely far", has ~general; WallObject -> greychamberwall with name 'grey' 'gray' 'featureless' 'plain' 'unmarked', description "The elliptical wall is plain, unmarked, unconstructed.", before [; Climb: "The wall is unclimbable."; ]; FloorObject -> greychamberfloor with name 'grey' 'gray' 'plane' 'indistinct' 'indistinguish', description "The floor below is grey and indistinct."; CeilingObject -> greychamberceiling with name 'grey' 'gray' 'plane' 'indistinct' 'indistinguish', description "The ceiling above is grey and indistinct."; Object -> greychamberexit "gap" with name 'gap' 'opening' 'small' 'passage' 'stone' 'cave' 'darkness', description "To the west, a passage of familiar, water-sculpted stone leads away from this place.", before [; Enter: <>; Search: <>; ], has scenery; Artifact -> shield "buckler" with name 'shield' 'buckler' 'gleaming' 'triangular' 'triangle' 'bright' 'metal', initial "A shield, a gleaming triangular buckler, hangs between floor and roof. Its bright lines are the only sharp edges about this place.", description "The buckler is a small, slightly curved triangle of bright metal. Its face is bossed with the image of three crossed spears. The back is less polished, and lacks the straps you would expect.", before [; Search: "The shield is brightly polished, but not smooth enough to show a reflection."; Wear: "There is no way to strap the shield onto your arm. You'll just have to carry it."; Attack: print "The buckler clanks reassuringly"; if (location == GreyChamber) print ", even in this still place"; "."; Touch: "The metal is sharp and chill."; Rub: "The buckler is already gleamingly polished."; ];