Class CatwalkClass class OutdoorClass, with u_to "The dome is too steep and smooth to climb.", d_to "There's no safe way down off the catwalk.", before [; Jump: "No."; ExamineDown: "The view over the catwalk's edge goes uncomfortably far down."; ], coredir d_obj, coredirmod (DIRMOD_UNCERTAINPATH | DIRMOD_FAR); [ FoundInCatwalk; if (location ofclass CatwalkClass) rtrue; else rfalse; ]; [ FallFromPeak obj dest; dest = random(Garden, GardenWarm, GardenCool); move obj to dest; ]; [ WalkCatwalk dest; print "You edge along the precarious catwalk, moving "; DirIName(dest); print " around the dome.^"; switch (dest) { 0: return CatwalkNorth; 1: return CatwalkEast; 2: return CatwalkSouth; 3: return CatwalkWest; default: "[BUG] WalkCatwalk to where?"; } ]; Object catwalkdome "dome" with name 'translucent' 'white' 'dome', found_in FoundInCatwalk, description [; print "The dome crouches above you to the "; DirIName(location.number, 0, 2); print ". The milky surface prevents you from seeing inside"; switch (weather) { DAYTIME: print "; sunlight diffuses across the dome as if it were mist"; NIGHTTIME: print ", but firelight chases itself across the entire dome, illuminating the catwalk amid the darkness of night"; DREAMTIME: print ", but blue light chases itself across the entire dome, like a cool cabochon jewel beneath this stifling sky"; } if (catwalksilhouette in location) { if (weather == DAYTIME) print ". You can just make out a triangular silhouette within the dome's surface -- the outline of the copper sail"; else print ". A triangular outline is silhouetted against the dome's light -- the shadow of the copper sail"; } if (location == CatwalkSouth) print ". There is an opening in the dome here, and a ladder leading down inside"; "."; ], before [; Search: <>; Touch, Rub: print "Despite its frosted appearance, the dome is as smooth as blown glass"; switch (weather) { NIGHTTIME: print ". The fire within lends a gentle warmth to the surface"; DREAMTIME: print ". The surface radiates a gentle, unnatural chill"; } "."; Enter: if (location == CatwalkSouth) <>; "There is no way into the dome here."; Climb: <>; ], has scenery transparent; FloorObject -> catwalk "catwalk" with name 'narrow' 'catwalk', description "The catwalk rings the dome near its base. It is uncomfortably narrow; and it has no railing. You are backed against the dome, away from the catwalk's outer edge and the drop below."; Object -> catwalkmountain "mountain" with name 'mountain' 'mountaintop' 'peak', description [; print "The mountaintop"; if (location == CatwalkSouth) print " towers to the north, beyond the dome"; else print " towers to the north"; switch (weather) { DAYTIME: print ". The afternoon sunlight burns on the stony heights"; NIGHTTIME: print ". The moonlight graces it, but it is still barely more than a shadow obscuring stars"; DREAMTIME: print ". Carmine and rose light washes slowly over the stony heights"; } "."; ], before [; Examine: rfalse; default: "The mountain is out of reach."; ], has scenery; Object catwalksilhouette "triangular silhouette" with name 'triangle' 'sail' 'copper' 'triangular' 'silhouette' 'outline', found_in [; if (location ofclass CatwalkClass && sail.number == location.number) rtrue; else rfalse; ], description [; print "The top of the copper sail is visible through the dome's surface"; switch (weather) { DAYTIME: print ", as a faint triangular silhouette"; NIGHTTIME: print ", as a triangular silhouette, dark against the firelight"; DREAMTIME: print ", as a triangular silhouette, dark against the blue-violet firelight"; } if (weather ~= DAYTIME) { print ". The sail's shadow falls black across the catwalk. Unusually black: it's a strip of unrelieved darkness which stretches out to the "; DirIName(location.number); print ", into empty space"; } "."; ], before [; Examine: rfalse; default: "The copper sail is inside the dome, out of reach."; ], has scenery; Object catwalkshadow "shadow" with name 'black' 'long' 'shadow' 'strip' 'darkness' 'dark' 'utter' 'path', found_in [; if (location ofclass CatwalkClass && sail.number == location.number && weather ~= DAYTIME) rtrue; else rfalse; ], initial [; if (sail.number ~= location.number) print "[BUG] shadow in wrong place.^"; print "The copper sail inside the dome is visible here, a dark silhouette. It blocks the firelight; a long black shadow falls "; DirIName(location.number); " across the catwalk and out into the empty air."; ], description [; print "The shadow of the sail is an immensely elongated triangle, stretching out to the "; DirIName(location.number); print ", across the catwalk and out into space. It's odd, in fact, how it seems to hang in the air. A strip of utter black beyond the catwalk"; if (location == CatwalkNorth) print ", reaching as far as the mountain face"; "..."; ], before [; Search: <>; Touch, Rub, Push: "You kneel, and tentatively reach toward the blackness, where it hangs in the air beyond the catwalk. And you feel resistance. The shadow is not exactly solid; but you cannot push your hand down through it."; Take, Pull: "You kneel, and tentatively try to seize the edge of the blackness, where it hangs in the air beyond the catwalk. And you feel resistance. The shadow is not exactly solid; but you cannot move it, nor move your hand through it."; Enter, Climb: switch (location) { CatwalkNorth: <>; CatwalkEast: <>; CatwalkSouth: <>; CatwalkWest: <>; } "[BUG] shadow in wrong place for entering."; Receive: "You toss ", (the) noun, " off the catwalk, onto the shadow. It comes silently to rest there. You bend and pick it up again; the shadow seems strong enough to bear weight."; ], has static ~general; [ WalkOnShadow msg; if (catwalkshadow notin location) { if (location == CatwalkNorth) OfferHint(HintoPeak); if (msg) print_ret (string) msg; else "Stepping off the catwalk would be fatal."; } if (weather == DAYTIME) "[BUG] shadow in daytime"; if (catwalkshadow hasnt general) { give catwalkshadow general; print "You edge one foot forward onto the path of black shadow. It feels... not ", (emph) "substantial,", " but somehow resistant to your probing. You gingerly press down. The shadow bears your weight.^^ Clenching your fists -- wishing for a handrail -- you take a step forward.^^ And another"; } else { print "You step out onto the path of black shadow"; } if (location == CatwalkNorth) { print ". In a few strides, you have crossed the ravine.^"; return AtLedge; } else { print ".^"; return ShadowPathNear; } ]; ! ---- Class ShadowPathClass class OutdoorClass, with cant_go "You must keep to the uncertain safety of the shadow-path.", coredir d_obj, coredirmod (DIRMOD_UNCERTAINPATH | DIRMOD_FAR); [ FoundInShadowPath; if (location ofclass ShadowPathClass) rtrue; else rfalse; ]; [ SweepOffShadowPath ix obj next; objectloop (ix ofclass ShadowPathClass) { obj = child(ix); while (obj) { next = sibling(obj); if (obj hasnt static && obj hasnt scenery && obj ~= player) { FallFromPeak(obj); } obj = next; } } ]; FloorObject shadowshadow "shadow" with name 'black' 'long' 'shadow' 'strip' 'darkness' 'dark' 'utter' 'path', found_in FoundInShadowPath, description [; print "The shadow falls from the silhouette on the illuminated dome to the "; DirIName(sail.number, 0, 2); ". It seems heavier, and darker, than any shadow should be... and it lies across the air, beneath your feet, supporting you. You hope it remains... whatever it is."; ], before [; Touch, Push: "Your hand meets resistance."; ]; Object shadowdome "dome" with name 'dome' 'illuminated' 'hemisphere' 'firelit' 'fire-lit' 'blue-lit' 'silhouette' 'triangle' 'triangular' 'copper' 'sail' 'dark', found_in FoundInShadowPath, description [; print "The dome shines "; if (location == ShadowPathFar) print "far "; print "to the "; DirIName(sail.number, 0, 2); switch (weather) { NIGHTTIME: print ", a hemisphere of firelight in the night"; DREAMTIME: print ", a hemisphere of flickering blue in the crimson expanse"; } ". On the side facing you is a dark triangular silhouette; its shadow pours across the air beneath your feet."; ], before [; Examine: rfalse; default: print "The dome is off to the "; DirIName(sail.number, 0, 2); "."; ], has scenery; ! ---- CatwalkClass CatwalkSouth "Catwalk, South" with initial [; if (weather == DREAMTIME) symbolartifproxy.invoke(); ], description [; print "This railless catwalk circles the outer edge of a pale dome"; switch (weather) { NIGHTTIME: print ", which is illuminated from within"; DREAMTIME: print ", which flickers with an inner blue fire"; } print ". You stand at the southern edge of the circle; the catwalk disappears around the dome to the east and west. A few iron steps lead up to an opening in the dome, from which a ladder descends inside.^^ The dome is nestled high on the shoulder of a"; switch (weather) { DAYTIME: print " sunlit mountain peak"; NIGHTTIME: print " moonlit mountain peak"; DREAMTIME: print " carmine mountain peak"; } print ". Below you, a small terrace is filled with knotted and spiralled garden paths. And far below that"; switch (weather) { DAYTIME: print ", green and bright, a lush valley spreads out into the distance"; NIGHTTIME: print ", green and dim, a lush valley spreads away into the night"; DREAMTIME: print ", ash-pale in this light, a tangled valley spreads away into the red distance"; } "."; ], number 2, s_to [; return WalkOnShadow("There is no way down to the garden from here."); ], e_to [; return WalkCatwalk(1); ], ne_to [; return WalkCatwalk(1); ], w_to [; return WalkCatwalk(3); ], nw_to [; return WalkCatwalk(3); ], n_to [; <>; ], in_to [; <>; ], u_to "You're about as up as you can get, unless you want to climb down into the dome.", d_to [; print "You step up to the opening and"; switch (weather) { DAYTIME: print " climb down into the dome.^"; NIGHTTIME: print " climb down into the smoky heat of the dome.^"; DREAMTIME: print " climb down into the welcome coolness of the dome.^"; } return Lighthouse; ], coredirmod DIRMOD_FAR; Object -> catwalkladder "ladder" with name 'ladder' 'opening' 'rough' 'iron' 'step' 'steps' 'stairs', description "Rough iron steps lead up the dome, to a round opening. The top of a ladder is visible through the opening.", before [; Enter, Climb: <>; ], has scenery; Object -> catwalkgarden "garden" with name 'garden' 'terrace' 'paths' 'path' 'spiral' 'spiralled' 'balcony', description [; print "A garden is visible below and to the south"; if (location == ShadowPathNear or ShadowPathFar) { switch (sail.number) { 1: print "west"; 3: print "east"; } } print " -- nestled in a terrace, well below the dome, though still high on the mountain's flank. The paths and plantings are tiny from this vantage. At the far edge of the garden a balcony looks out, as you do, over"; switch (weather) { DAYTIME: print " the green and sunlit valley"; NIGHTTIME: print " the shadowy moonlit valley"; DREAMTIME: print " the unearthly-pale valley"; } "."; ], before [; Examine: rfalse; Enter: "There's no safe way down off the catwalk."; default: "The garden is a long way below you."; ], has scenery; ! ---- CatwalkClass CatwalkEast "Catwalk, East" with description [; print "You are at the eastern edge of a catwalk which circles a pale dome"; switch (weather) { NIGHTTIME: print ". Firelight illuminates the dome from within"; DREAMTIME: print ". Strange blue light illuminates the dome from within"; } print ". The dome rises from the face of a"; switch (weather) { DAYTIME: print " sunlit mountain peak"; NIGHTTIME: print " moonlit mountain peak"; DREAMTIME: print " red-lit mountain peak"; } print ", which towers to the north. To the south, the stone slopes fall to"; switch (weather) { DAYTIME: print " a verdant valley"; NIGHTTIME: print " a valley, shrouded in night and silence"; DREAMTIME: print " a broad valley -- lush, but oddly pale beneath this streaming crimson sky"; } "."; ], number 1, e_to [; return WalkOnShadow(); ], w_to [; <>; ], n_to [; return WalkCatwalk(0); ], nw_to [; return WalkCatwalk(0); ], s_to [; return WalkCatwalk(2); ], sw_to [; return WalkCatwalk(2); ]; ! ---- CatwalkClass CatwalkWest "Catwalk, West" with description [; print "You are at the western edge of a catwalk which circles a pale dome"; switch (weather) { NIGHTTIME: print ". Firelight illuminates the dome from within"; DREAMTIME: print ". Odd blue light illuminates the dome from within"; } print ". The dome rises from the face of a"; switch (weather) { DAYTIME: print " sunlit mountain peak"; NIGHTTIME: print " moonlit mountain peak"; DREAMTIME: print " red-lit mountain peak"; } print ", which towers to the north. To the south, the stone slopes descend to"; switch (weather) { DAYTIME: print " a wide valley, shining green in the afternoon light"; NIGHTTIME: print " a dark valley"; DREAMTIME: print " a wide valley, pale beneath the twisting red sky"; } "."; ], number 3, w_to [; return WalkOnShadow(); ], e_to [; <>; ], n_to [; return WalkCatwalk(0); ], ne_to [; return WalkCatwalk(0); ], s_to [; return WalkCatwalk(2); ], se_to [; return WalkCatwalk(2); ]; ! ---- CatwalkClass CatwalkNorth "Catwalk, North" with initial [; WitnessMask(blackmask); if (blackmask in ledge) SafeMove(catwalkfarmask, self); else SafeMove(catwalkfarmask, nothing); if (weather == DAYTIME) give self general; ], description [; print "You stand on a narrow, railless catwalk, which girdles the translucent dome to the south. To the north, the mountain rises massively above you. But the dome stands on its own promontory; the mountain face is several yards away. The ravine between dome and mountain is deep and jagged.^^"; print "There is a tiny ledge on the face of the mountain"; if (catwalkfarmask in self) { print ". You can just make out ", (a) catwalkfarmask, " balanced on the ledge"; } "."; ], number 0, n_to [; return WalkOnShadow(); ], s_to [; <>; ], e_to [; return WalkCatwalk(1); ], se_to [; return WalkCatwalk(1); ], w_to [; return WalkCatwalk(3); ], sw_to [; return WalkCatwalk(3); ], hinto HintoPeak, has ~general; Object -> catwalkravine "ravine" with name 'deep' 'ravine' 'gap' 'jagged', description [; print "There is a gap, several yards wide, between the body of the mountain and the outcropping that supports the dome. Gazing down, you can see only that the ravine's bottom is very narrow"; switch (weather) { DAYTIME: print "; jagged rocks are mercilessly visible"; NIGHTTIME: print "; shadows hide what are probably jagged rocks"; DREAMTIME: print "; jagged rocks lurk in the bloody shadows"; } "."; ], before [; Examine: rfalse; Search: <>; Enter, Climb: <>; JumpOver: "The ravine is much too wide."; Receive, ThrownAt: FallFromPeak(noun); "If you insist. ", (The) noun, " goes tumbling down the mountainside. You hope you can find it again."; ], has scenery; Object -> catwalkledge "ledge" with name 'thin' 'tiny' 'narrow' 'ledge', description [; print "It's just a narrow ledge which juts from the mountainside, across the ravine from you"; if (catwalkfarmask in CatwalkNorth) { print ". There is ", (a) catwalkfarmask, " balanced on the ledge"; } "."; ], before [; Examine: rfalse; Search: <>; ThrownAt: FallFromPeak(noun); print_ret "You miss wildly. ", (The) noun, " goes tumbling down the mountainside. You hope you can find it again."; default: print_ret "You cannot reach ", (the) self, " from here."; ], has scenery; DistantMaskClass catwalkfarmask with number blackmask, description [; print_ret (The) self, " looks like a ", (string) self.number.name_str, " paper cutout of a human face. It is resting on a thin ledge on the mountainside, across the ravine to the north."; ], before [; Examine: OfferHint(HintoPeak); rfalse; ThrownAt: OfferHint(HintoPeak); <>; default: OfferHint(HintoPeak); print_ret "You cannot reach ", (the) self, " from here."; ]; Object HintoPeak with hint_name catwalkfarmask, hint_suppress [; if (catwalkfarmask notin CatwalkNorth || catwalkfarmask.number has moved) rtrue; ], count 0, description [; if (AtLedge has visited) { print "You've been there already. Just go back."; rtrue; } if (ShadowPathNear has visited) { print "You know that the triangle's shadow can support your weight. You just have to use that fact to cross the ravine to the north."; rtrue; } if (weather ~= DAYTIME) { print "The dome is now illuminated"; if (self.count & $2 == 0) { self.count = self.count | $2; if (sail.number ~= 0) print ". Have you noticed anything strange near it, around the catwalk?"; else print ". Have you noticed anything strange here, by the catwalk?"; if (CatwalkNorth has general) print " (Aside from the fact that it's not daytime any more.)"; return 2; } print ". The copper triangle inside casts a shadow on the dome -- a most unusual shadow. It stretches"; if (sail.number == 0) { print " north across the ravine."; } else { print " out into space to the "; DirIName(sail.number); print ". If you moved the triangle back around to the north, the shadow would cross the ravine."; } rtrue; } if (self.count & $1 == 0) { self.count = self.count | $1; print "There's no obvious way to cross the ravine. You should probably continue searching this area -- look for something you can change, move, or do."; return 2; } return HintoBonfire.description(); ]; ! ---- ShadowPathClass AtLedge "Ledge" with description [ ix; print "You are standing at the end of a long, black tongue of shadow which hangs incomprehensibly in empty air. The strip of darkness bridges a deep ravine between a"; switch (weather) { NIGHTTIME: print " fire-lit dome"; DREAMTIME: print " blue-lit dome"; } print " to the south, and the cliff-face of a towering mountain, to the north.^^"; print "A narrow ledge angles across the mountain face, directly in front of you"; ix = child(ledge); if (ix) { print ". Balanced on the ledge"; WriteListFrom(ix, ISARE_BIT + TERSE_BIT + ENGLISH_BIT + CONCEAL_BIT); } "."; ], s_to [; print "You move gingerly back to the safety of the catwalk.^"; return CatwalkNorth; ], u_to "You cannot climb the sheer rock face.", n_to "The mountain blocks your way."; Object -> ledge "ledge" with name 'tiny' 'thin' 'narrow' 'ledge', description [ ix; print "The ledge is just a shelved crack in the stone, a few inches wide, which slopes across several feet of the mountain face"; ix = child(ledge); if (ix) { print ". Balanced on the ledge"; WriteListFrom(ix, ISARE_BIT + TERSE_BIT + ENGLISH_BIT + CONCEAL_BIT); } "."; ], before [; Climb, Enter: "You could probably climb up onto the ledge, if you leaned in and stood on your toes. But there would be little point; the cliff above that is too sheer to climb."; ], after [; Receive: if (LargeObject(noun)) "You balance ", (the) noun, " carefully on the ledge."; "You put ", (the) noun, " on the ledge."; ], has scenery supporter; MaskClass -> -> blackmask with name_wd 'black', name 'torn', name_str "black", short_name [; print "torn black mask"; rtrue; ], count 7, description [; self.MaskClass::description(); "^This mask is torn. The left part of the black face, through the eye, has been ripped away. What remains has a worn expression of irritation -- and perhaps, far below, doubt."; ]; Object -> shadowmountain "mountain" with name 'mountain' 'mountaintop' 'peak' 'cliff' 'face' 'cliff-face', description [; print "The mountaintop towers above you"; switch (weather) { NIGHTTIME: print ". The moonlight graces it, but it is still barely more than a shadow obscuring stars"; DREAMTIME: print ". Carmine and rose light washes slowly over the stony heights"; } "."; ], before [; Climb, Enter: <>; ], has scenery; Object -> shadowravine "ravine" with name 'deep' 'ravine' 'gap' 'jagged', before [; Examine, Search: <>; Enter, Climb: <>; Receive, ThrownAt: FallFromPeak(noun); "If you insist. ", (The) noun, " goes tumbling down the mountainside. You hope you can find it again."; ], has scenery; ! ---- [ WalkAlongPath dir val reg; val = sail.number - dir; if (val == 0) { if (location == ShadowPathNear) { print "You venture farther from the dome.^"; return ShadowPathFar; } if (weather ~= DREAMTIME || sail.number ~= 3) "The path will take you no further."; reg = Regalia(); if (reg == 0) "The ringed moon hovers before you; but the path will take you no further."; if (reg == 1) "The ringed moon hovers before you; but you cannot move towards it. All is nearly in order, you sense, but the picture is not quite right."; deadflag = 2; "The ringed moon hovers before you. You settle your regalia about yourself, and step forward.^^ For a moment, the voices of the stars are a thousandfold rushing whisper. And then the portal opens; and you can understand every word and note.^^ Somewhere, a child runs through a moonlit forest, gazing up at a bright-marked figure which has always shone, will always shine beyond the Doorstep. It is only within your mind that the song begins at this moment... The stars are welcoming you home."; } if (val == 2 or -2) { if (location == ShadowPathFar) { return ShadowPathNear; } print "You step gingerly back to the safety of the catwalk.^"; switch (sail.number) { 0: return CatwalkNorth; 1: return CatwalkEast; 2: return CatwalkSouth; 3: return CatwalkWest; } } return 0; ]; ShadowPathClass ShadowPathNear with short_name [; print "Shadow Path, "; DirIName(sail.number, 1, 0); print " of Dome"; switch (weather) { NIGHTTIME: print "; Night"; DREAMTIME: print "; Unearthly"; } rtrue; ], description [; print "You are standing on a long, black tongue of shadow which hangs impossibly in empty air. To the "; DirIName(sail.number, 0, 2); print " stands the"; switch (weather) { NIGHTTIME: print " fire-lit dome"; DREAMTIME: print " blue-lit dome"; } print "; the path stretches away to the "; DirIName(sail.number, 0, 0); if (sail.number == 2) print ". The mountain towers behind the dome"; else print ". To the north side of the path, the mountain towers"; print ", a black shape against"; switch (weather) { NIGHTTIME: print " the starry fields"; DREAMTIME: print " the crimson currents overhead"; } if (sail.number == 2) print ". Directly beneath you"; else print ". On the other side"; print ", the garden"; switch (weather) { NIGHTTIME: print " slumbers in green"; DREAMTIME: print " glows unearthly-pale"; } "; and below that, the valley."; ], n_to [; return WalkAlongPath(0); ], e_to [; return WalkAlongPath(1); ], s_to [; return WalkAlongPath(2); ], w_to [; return WalkAlongPath(3); ], hinto HintoArtifactArea; ShadowPathClass ShadowPathFar with short_name [; print "Shadow Path, Far "; DirIName(sail.number, 1, 0); print " of Dome"; switch (weather) { NIGHTTIME: print "; Night"; DREAMTIME: print "; Unearthly"; } rtrue; ], description [; print "The shadow path narrows as it runs; a few yards farther "; DirIName(sail.number, 0, 0); print ", it converges to a point and is gone. The dome is a"; switch (weather) { NIGHTTIME: print " red"; DREAMTIME: print " blue"; } print " bauble to the "; DirIName(sail.number, 0, 2); if (sail.number == 2) print ". The mountain towers above the dome"; else print ". To one side, the mountain towers"; print ", a black shape against"; switch (weather) { NIGHTTIME: print " the stars"; DREAMTIME: print " the streaming red overhead"; } if (sail.number == 2) print ". Directly beneath you"; else print ". On the other side"; print " falls the"; switch (weather) { NIGHTTIME: print " dim green"; DREAMTIME: print " strange pale"; } print " valley"; if (weather == DREAMTIME) { print ".^^The crimson sky runs disturbingly low -- or you are disturbingly high, close to its rippling currents"; if (sail.number == 3) print ". The ringed moon seems to hang directly before you"; } "."; ], n_to [; return WalkAlongPath(0); ], e_to [; return WalkAlongPath(1); ], s_to [; return WalkAlongPath(2); ], w_to [; return WalkAlongPath(3); ], hinto HintoArtifactArea; Object shadowpathmountain "mountain" with name 'mountain' 'mountaintop' 'peak', found_in ShadowPathNear ShadowPathFar, description [; catwalkmountain.description(); rtrue; ], before [; Examine: rfalse; default: "The mountain is out of reach."; ], has scenery transparent; Object -> shadowpathgarden "garden" with name 'garden' 'terrace' 'paths' 'path' 'spiral' 'spiralled' 'balcony', description [; catwalkgarden.description(); rtrue; ], before [; Examine: rfalse; Enter: "There's no safe way down."; default: "The garden is a long way below you."; ], has scenery;