! ---- Object Shed "Dim Shed" with description [; print "This room looks like nothing so much as a small, windowless garden shed. The floor is bare dirt; the walls are unfinished planks."; if (torch has light && IndirectlyContains(self, torch)) print " Light falls in through the archway to the west. The dimness is otherwise relieved only by the flickering of your torch."; else print " The only light falls in through the archway to the west."; print " A narrow opening to the"; if (self.number == n_obj) print " south"; else if (self.number == s_obj) print " north"; " leads to a steep stairway, which climbs away into darkness."; ], before [; Smell: if (noun == nothing) "Old mud and not enough sunlight."; ], number s_obj, fore_link Landing1, w_to Hall4, n_to [; if (self.number == s_obj) <>; ], s_to [; if (self.number == n_obj) <>; ], u_to [; print "You set foot on the narrow stairway.^"; StairContext.number = u_obj; return self.fore_link; ], cant_go [; print "The only ways out are west and"; if (self.number == n_obj) print " south"; else if (self.number == s_obj) print " north"; "."; ], each_turn [; if (self has general) { give self ~general; ! reminisce print "^", (emph) "~To stand in a dreamhold is to be no more than a thought in a wizard's dream.~ Or so it is said... somewhere. Certainly this stairway is changeable as a dream.", "^"; self.each_turn = 0; } ], coredir w_obj, has ~general; FloorObject -> shedfloor with name 'bare' 'dirt' 'earth', description "The floor of the shed is bare, hard-packed earth.", before [; Take, Dig: "The ground is too hard to dig in."; ]; WallObject -> shedwall with name 'unfinished' 'plank' 'planks', description "The shed walls are weathered, rough planks.", before [; Touch: <>; ], has pluralname; SceneryObject -> shedscenery with name 'garden' 'shed'; Object -> glove "glove" with name 'single' 'gardening' 'right' 'glove', parse_name [ wd num gotit; wd = NextWord(); while (WordInProperty(wd, self, name)) { if (wd == 'glove' or 'gardening') gotit = true; num++; wd = NextWord(); } if (~~gotit) return 0; return num; ], initial "A single glove is lying in the corner, lost and alone.", description "It's a single glove -- the right. From the heavy palm padding and the ground-in dirt, you guess it's a gardening glove.", before [; Remove: if (self in player) <>; ], after [; Take: GuideGloveUsageMessage.invoke(); ], has clothing ~worn; Object GuideGloveUsageMessage with invoke GuideInvokeOnce, description [; print "To wear an item of clothing, such as this glove, use the ", (helpcmdobj) "wear", " or ", (helpcmdobj) "put on", " command. To take it off again, try ", (helpcmdobj) "remove", " or ", (helpcmdobj) "take off", "."; ], has ~general; ! ---- Object StairContext with number u_obj, ! last direction of movement count -1, ! morph phase invoke [ dest ix obj next; if (self.count % 2 == 0) { if (dest == Shed) print "[BUG] Stair went to wrong destination.^"; } else { if (dest == Garden) print "[BUG] Stair went to wrong destination.^"; } if (dest ~= 0) { objectloop (ix ofclass StairLanding) { obj = child(ix); while (obj) { next = sibling(obj); if (obj hasnt static && obj hasnt scenery && obj ~= player) { move obj to StairHolder; } obj = next; } } } if (dest == Shed) { give Shed general; StairHolder.invoke(); } self.count++; if (self.count >= 4) self.count = 0; switch (self.count) { 0: Shed.number = s_obj; Shed.fore_link = Landing1; Landing1.fore_link = Landing2; Landing1.back_link = 0; Landing1.number = n_obj; Landing2.fore_link = Landing3; Landing2.back_link = Landing1; Landing2.number = s_obj; Landing3.fore_link = 1; Landing3.back_link = Landing2; Landing3.number = n_obj; Garden.back_link = 0; 1: Garden.back_link = 1; Shed.number = n_obj; 2: Shed.number = n_obj; Shed.fore_link = Landing1; Landing1.fore_link = Landing2; Landing1.back_link = 0; Landing1.number = s_obj; Landing2.fore_link = 1; Landing2.back_link = Landing1; Landing2.number = n_obj; Garden.back_link = 0; 3: Garden.back_link = Landing1; Landing1.fore_link = 1; Landing1.back_link = 0; Landing1.number = n_obj; Shed.number = s_obj; } ]; Object StairHolder with invoke [; self.count = 0; StartDaemon(self); ], count 0, daemon [ ix; self.count++; if (self.count >= 2) { StopDaemon(self); ix = child(self); if (ix && location == Shed) { print "^With no particular fuss, "; WriteListFrom(ix, TERSE_BIT + ENGLISH_BIT + DEFART_BIT); if (sibling(ix)) print " come tumbling down the stairs, and land at your feet.^"; else print " comes tumbling down the stairs, and lands at your feet.^"; } while (child(self)) { ix = child(self); move ix to Shed; } } ]; [ FoundInStair; if (location ofclass StairLanding) rtrue; else rfalse; ]; Object stairstairs "stairway" with name 'narrow' 'cramped' 'stair' 'stairs' 'stairway', description "The stairs run up and down.", found_in FoundInStair, before [; Take, Enter, Climb: "Do you want to go up or down?"; ClimbUp: <>; ClimbDown: <>; ], has scenery; SceneryObject stairscenery with name 'landing', found_in FoundInStair; WallObject stairwall with description "The walls are coarse stone.", found_in FoundInStair; Class StairLanding with short_name "Landing", number 0, fore_link 0, back_link 0, description [; print "The cramped stair reaches a landing here; it reverses and continues"; if (StairContext.number == u_obj) print " upward"; else print " downward"; print " to the"; if (self.number == n_obj) print " south"; else if (self.number == s_obj) print " north"; else print " [BUG]"; ". The walls are close and dark."; ], before [; Smell: if (noun == nothing) "The air is close, enclosed, mineral."; ], n_to [; if (self.number == s_obj) { if (StairContext.number == u_obj) <>; else <>; } ], s_to [; if (self.number == n_obj) { if (StairContext.number == u_obj) <>; else <>; } ], u_to [ ix prevdir; prevdir = StairContext.number; StairContext.number = u_obj; if (StairContext.count % 2 == 0) ix = self.fore_link; else ix = self.back_link; if (ix == 0 or 1) { if (ix) StairContext.invoke(Garden); print "You emerge into open air"; if (weather ~= DREAMTIME) { print " -- chill and fair-scented.^"; } else { print ", beneath an alien sky.^"; gardenskydream.modetext(); } return Garden; } else { if (prevdir == u_obj) print "You continue climbing.^"; else print "You turn and begin climbing.^"; return ix; } ], d_to [ ix prevdir; prevdir = StairContext.number; StairContext.number = d_obj; if (StairContext.count % 2 == 0) ix = self.back_link; else ix = self.fore_link; if (ix == 0 or 1) { if (ix) StairContext.invoke(Shed); print "You emerge into the dimness of the shed.^"; return Shed; } else { if (prevdir == d_obj) print "You continue descending.^"; else print "You turn and descend.^"; return ix; } ], coredir w_obj, coredirmod (DIRMOD_BELOW | DIRMOD_FOLLOWVERT); StairLanding Landing1; StairLanding Landing2; StairLanding Landing3; ! ---- Class OutdoorClass with short_name [; print (object) self; switch (weather) { NIGHTTIME: print "; Night"; DREAMTIME: print "; Unearthly"; } rtrue; ]; [ FoundOutdoors; if (location ofclass OutdoorClass) rtrue; else rfalse; ]; Object gardenmountain "mountain" with name 'mountain' 'cliff' 'peak', found_in GardenCenter GardenBalcony GardenWarm GardenCool, description [; switch (weather) { DAYTIME: "The mountain stands proud, drenched with afternoon sunlight. High on its face you can see a blank white dome."; NIGHTTIME: "The mountain stands tall and quiet, a dark shape against stars. High on its face you can see a translucent dome; firelight flickers within."; DREAMTIME: "The mountain stands tall, blood-stained against the lurid streaming sky. High on its face you can see a translucent dome; blue light flickers within."; } ], before [; Examine: rfalse; default: "The mountain is high above you, to the north."; ], has scenery transparent; Object -> gardendome "white dome" with name 'white' 'translucent' 'featureless' 'firelit' 'fire-lit' 'blue-lit' 'dome' 'catwalk', description [; print "To the north, high on the mountain above you -- not far below the highest peak -- a featureless dome seems to survey the landscape"; switch (weather) { DAYTIME: print ". The surface is matte white and unreadable; but"; NIGHTTIME: print ". The surface is unmarked, but firelight dances inside the translucent bubble, and"; DREAMTIME: print ". The surface is unmarked, but blue and indigo light dances inside the translucent bubble, and"; } " you can see a catwalk running around the dome's outer edge."; ], before [; Examine: rfalse; default: "The dome is high above you, up the mountainside to the north."; ], has scenery; CeilingObject gardenskynight with name 'night' 'dark' 'starry' 'vast' 'wide' 'sky' 'air', short_name "sky", found_in FoundOutdoors, description "The sky is black, but clear, hung thickly with stars. You find, with calm surprise, that you can recognize constellations. The moon is well risen, and surrounded by a halo.", react_before [; Smell: if (noun == nothing) <>; ], before [; Smell: "The air is sharp, pure, cold with the mountain night. It clears from your throat the faint stuffiness -- you only now realize it -- of the underground passages."; ], has transparent absent; Object -> gardenmoon "moon" with name 'moon' 'moonlight' 'halo', description "The moon is full, rising in the southeast. A trace of unseen cloud must ride the air, for a halo of pale light circles the moon's face.", before [; Examine: rfalse; default: "It's really not within reach."; ], has scenery; Object -> gardenstars "stars" with name 'familiar' 'star' 'stars', description [; print "The sky is filled with familiar stars. "; NameStars(); if (self hasnt general) { give self general; print "^^The stars, it seems, are in your memory. Even if your life is not."; } new_line; rtrue; ], before [; Examine: rfalse; Search: <>; default: "They're not within reach."; ], has scenery transparent pluralname ~general; SkyConstellation -> -> skyconstcloak with number constcloak; SkyConstellation -> -> skyconstmoth with number constmoth; SkyConstellation -> -> skyconstcows with number constcows; SkyConstellation -> -> skyconstwall with number constwall, has proper; SkyConstellation -> -> skyconstgate with number constgate; SkyConstellation -> -> skyconstgalley with number constgalley, has proper; SkyConstellation -> -> skyconstcrutch with number constcrutch; SkyConstellation -> -> skyconstaxe with number constaxe; Class DreamMoon with name 'huge' 'vast' 'disk' 'disc' 'moon' 'disks' 'moons', before [; Examine: rfalse; default: "It's really not within reach."; ], has scenery; CeilingObject gardenskydream with name 'nightmare' 'sky' 'air' 'racing' 'red' 'crimson' 'fluid' 'stream' 'streams' 'strand' 'strands' 'striation' 'current' 'currents', short_name "sky", found_in FoundOutdoors, description [; "The sky is an endlessly racing nightmare: streams of scarlet, carmine, rust, magenta, and every other shade flood across the heavens. You can see no sun -- the world is lit only in harsh red -- but moons sprawl indolently, untouched and unmoving beyond the crimson striations. ", (emph) "Four", " moons, if such swollen and lurid disks can be called moons; a violet, a green, a blue, and a tan one ringed in brilliant white.^^ Though the fluid strands are in constant motion overhead, the air around you is silent. A dry, stifling heat oppresses each breath."; ], modetext [; if (self hasnt general) { give self general; "^Heavy, breathless heat presses down on you, down from the red clouds overhead. Or -- not clouds. ", (emph) "Something", " streams by overhead, fluid strands racing like a flood of blood or wine -- streams of every hue of red and rose and scarlet that you can name. Neither stars nor sun are visible; but vast disks of light, like impossible moons, hang behind the striated sky."; } else { "^The stifling heat bears down upon you, down from the racing, striated red sky."; } ], react_before [; Smell: if (noun == nothing) <>; ], before [; Smell: "The air is thick and hot. An indefinable scent hangs in the stillness -- something acid, or oily, or curdled like old cream."; Touch, Push: if (location == ShadowPathFar) print_ret (The) self, " seems just barely out of reach."; print_ret (The) self, " is out of reach."; ], has transparent absent ~general; DreamMoon -> violetmoon "violet moon" with name 'violet' 'purple' 'streaked' 'immense', description "An immense violet disk looms in the northwest sky -- a great moon whose purple glow is marred by harsh streaks of grey, bone-white, and glittering ivory."; DreamMoon -> greenmoon "green moon" with name 'green' 'huge' 'phosphoresc' 'scarred', description "Low above the southeast horizon, a huge and phosphorescent green moon glares in menace. Its face is pitted and marred, scarred like the moon you know, but far more fiercely."; DreamMoon -> tanmoon "ringed tan moon" with name 'tan' 'fat' 'beige' 'brown' 'ringed' 'ring' 'rings' 'band' 'hoop' 'white' 'brilliant', description [; if (location == ShadowPathFar && sail.number == 3) print "A fat moon hangs just above the western horizon -- and, at the same time, just before your outstretched hand. It is"; else print "Just above the western horizon, a fat moon hangs,"; " soft beige with hazy brown and tan stripes. Its gentle colors are cut by a brilliant white band that swoops across its face, twice as wide as the moon itself. It is as if a child's hoop were set in the sky to girdle the tan disk."; ], before [; if (~~(location == ShadowPathFar && sail.number == 3)) rfalse; switch (action) { ##Examine: rfalse; ##Enter: <>; ##Touch, ##Push, ##Take: "You reach towards the tan moon. It must be an illusion that your hand is passing within and beyond it..."; } ]; DreamMoon -> bluemoon "blue moon" with name 'blue' 'cool' 'blue-tinged' 'tinged', description "A cool blue-tinged moon glows high in the south, above you. Its overlarge face is streaked and whorled with white; beneath the white markings you can see faint brown and tan shadows, like islands in a distant sea."; CeilingObject gardenskyday with name 'blue' 'vast' 'wide' 'sky' 'air', short_name "sky", found_in FoundOutdoors, description "The sky is unclouded blue. It stretches with the broad perfection of its mountain domain. The sun is an exuberant early-afternoon glare.", react_before [; Smell: if (noun == nothing) <>; ], before [; Smell: "The air is sharp, cool, pure. It clears from your throat the faint stuffiness -- you only now realize it -- of the underground passages."; ], has transparent ~absent; Object -> gardensun "sun" with name 'sun' 'sunlight', description "The sun is strong and bright. Its warmth touches you now and again, welcome in this brisk afternoon air.", before [; Examine: rfalse; Touch: "The sunlight is warm."; default: "It's really not within reach."; ], has scenery; Object gbowershrubs "shrubs" with name 'small' 'shrub' 'shrubs' 'flower' 'flowers' 'flowerbed' 'bloom' 'blooms' 'bed' 'beds', parse_name [ wd num; wd = NextWord(); while (WordInProperty(wd, self, name) || (wd == 'scarlet' or 'tangflower' or 'copperfeather' or 'sunbreaker' or 'hot' or 'iris' or 'irises' or 'bluebalm' or 'snowbrush' or 'violetta' or 'grey' or 'lily' or 'lilies')) { num++; wd = NextWord(); } return num; ], description [; print "Pleasingly irregular shrubs stand around the bower, interspersed with dense beds of"; switch (location) { GardenWarm: print " scarlet tangflower, copperfeathers, sunbreakers, and hot irises"; GardenCool: print " bluebalm, snowbrush, violetta, and grey lily"; default: print " cultivated blooms"; } ". The arrangement is not crowded, but it forms a distinct border to this part of the garden."; ], found_in GardenWarm GardenCool, before [; Search: "You find nothing amid the shrubs and flowerbeds."; Take, Pull: "The shrubs and flowers don't interest you enough to be worth collecting."; Enter, JumpOver: <>; Smell: "The odors are sweet and varied."; ], has pluralname scenery; Object gbalconyvalley "valley" with name 'valley' 'green' 'verdant' 'lush' 'vista' 'slopes' 'mountainside' 'tree' 'trees' 'bracken' 'pine' 'pines' 'forest', found_in GardenBalcony GardenWarm GardenCool CatwalkSouth CatwalkEast CatwalkWest ShadowPathNear ShadowPathFar, description [; print "The valley is infinite in detail, though bounded by stone"; switch (weather) { DAYTIME: ". The trees are spread in afternoon sunlight."; NIGHTTIME: ". The trees sleep, almost invisible in the night's gloom."; DREAMTIME: ". The trees seem pale as ash beneath the lurid red striation of the sky."; } ], before [; Examine: rfalse; default: "The valley is far, far below you."; ], has scenery transparent; Object -> gbalconywater "lake" with name 'bright' 'thread' 'stream' 'lake' 'water' 'silver' 'arc', description [; if (weather ~= DAYTIME) "You can barely make out the streams and the distant lake."; "Water, in streams and rills, threads from the mountain slopes and across the valley. In the distance a small lake gleams."; ], before [; Examine: rfalse; default: <>; ], has scenery; ! ---- OutdoorClass Garden "Mountain Path" with initial [; if (weather == DREAMTIME) symbolartifproxy.invoke(); ], description [; print "You stand at the foot of a low rocky cliff. It squats above you, but it obscures little of the"; switch (weather) { DAYTIME: print " vast blue sky that stretches all around"; NIGHTTIME: print " vast starry sky that stretches all around"; DREAMTIME: print " vast crimson expanse that streams by overhead"; } ". Mossy boulders hem you in on either side; a tidy path winds to the south between them. To the north the path enters a crack in the cliff, meeting stairs which vanish down into enclosed darkness."; ], back_link 0, d_to [; <>; ], n_to [ ix; StairContext.number = d_obj; ix = self.back_link; if (ix == 0) "[BUG] Garden stairway detached."; print "You enter the narrow stairway"; if (weather == DREAMTIME) print ", breathing gratefully in respite from the oppressive red-lit heat. You"; else print " and"; if (ix == 1) { StairContext.invoke(Shed); print " begin to descend. After only a few steps, you find yourself at the bottom. Odd....^"; return Shed; } else { print " begin to descend.^"; return ix; } ], s_to [; print "The boulders open out as you follow the path.^"; return GardenCenter; ], cant_go "You can go south, or descend the stairs to the north.", coredir d_obj, coredirmod DIRMOD_FAR; Object -> gpathstairs "stairs" with name 'crack' 'stairs' 'stair' 'stairway' 'narrow', description "The stairs which you climbed here emerge through a narrow crack in the cliff, north of you. A path begins there and runs southward.", before [; Search: "You cannot see far down the stairs."; Enter, Climb, Take: <>; ], has scenery; Object -> gpathboulders "boulders" with name 'mossy' 'moss' 'boulder' 'boulders' 'rock' 'rocks', description "Tall mossy boulders are arranged to either side of the path. They form a pleasant promenade which seems to lead you south.", before [; Enter, Climb: "The boulders are too closely spaced to squeeze between, and too slippery to climb."; ], has scenery pluralname; FloorObject -> gpathpath "tidy path" with name 'tidy' 'path', description "The path runs south from here, between the boulders.", before [; Enter, Climb, Take: <>; ]; WallObject -> gpathcliff with name 'low' 'rocky' 'cliff', description "The cliff rises about twice your height. But you see taller peaks behind and above it.", before [; Climb: "You cannot climb the cliff."; Enter: <>; ]; ! ---- OutdoorClass GardenCenter "Mountain Garden" with initial [; self.number = 0; ], description [; print "A tiny pleasance-garden is nestled here, high on a mountainside. Odd bits of statuary stand among the sculpted slopes and hillocks; small marble pillars mark the borders of the knotted paths. The lawn is perfectly trimmed. The mountain towers above you to the north; high on its face you see"; switch (weather) { DAYTIME: print " a featureless white dome"; NIGHTTIME: print " a firelit dome"; DREAMTIME: print " a blue-lit dome"; } switch (weather) { DAYTIME: print ". Above that, the sun shines in a wide blue mountain's sky"; NIGHTTIME: print ". Above that, stars hang high and wide across a vast dark sky. The moon watches silently from the southeast"; DREAMTIME: print ". Above that, crimson and scarlet and magenta race across the sky in brilliant fluid streams. And beyond the red striation, vast moons silently look down upon you"; } print ".^^ A tidy path runs north between mossy boulders. A wider path curves west, down a grassy slope, and up to the east. To the south, a few marble steps lead to a balcony, which looks out over a verdant valley"; if (gbalstatuestanding in GardenBalcony) print ". You can see a particularly tall statue on the balcony"; "."; ], n_to Garden, se_to [; <>; ], sw_to [; <>; ], ne_to [; <>; ], nw_to [; <>; ], s_to [; print "You step up to the balustrade and look out, to the south...^"; return GardenBalcony; ], u_to [; <>; ], d_to [; <>; ], e_to [; print "You climb the path, fog trailing around your feet.^"; return GardenCool; ], w_to [; print "As you descend the path, you see a thread of smoke rising ahead.^"; return GardenWarm; ], number 0, each_turn [; self.number++; switch (self.number) { 2: if (weather ~= DREAMTIME) print "^Cool mountain air brushes your face.^"; else print "^The hot, dead air swirls slowly, although it affords you no relief.^"; 4: if (weather == NIGHTTIME) print "^The night breeze stills.^"; else print "^The breeze stills.^"; 5: if (self hasnt general) { give self general; print "^Odd -- a wisp of fog is rolling down the eastern path, hugging the ground. Perhaps there is snow on the slope above?"; if (weather ~= DREAMTIME) print " But it does not seem so cold.^"; else print " But it's so hot.^"; } else { print "^A wisp of fog rolls down the eastern path.^"; } 7: print "^A breath of"; if (weather == DREAMTIME) print " blood-warm"; print " wind moves through the garden, tattering the fog.^"; 8, 9, 10: if (random(101) <= 50) self.number = 0; 11: self.number = 0; } if (gbalstatuestanding notin GardenBalcony && (warmberries has general || coolberries has general)) { ReminisceGarden.invoke(); } ], coredir d_obj, coredirmod (DIRMOD_FAR | DIRMOD_UNCERTAINPATH), has ~general; SceneryObject -> gardenscenery with name 'garden' 'pleasance'; FloorObject -> gardenfloor with name 'lawn' 'trimmed' 'grass' 'turf' 'slopes' 'slope' 'hill' 'hills' 'hillock' 'hillocks', description "The lawn rolls around you in neatly-sculpted slopes and hills.", before [; Enter, Climb: <>; ]; Object -> gardenpaths "paths" with name 'knot' 'knotted' 'paths' 'spiral' 'spirals' 'spiralled', description "The paths of the pleasance-garden run in neat spirals, across the slopes and around the hillocks. Most go nowhere in particular.", before [; Enter, Climb, Take: print "You wander the smaller paths for a few moments. The garden has a contemplative mood"; if (weather == DREAMTIME) print ", even under this red racing nightmare of a sky"; "."; ], has scenery pluralname; Object -> gardennorthpath "tidy path" with name 'tidy' 'path' 'boulder' 'boulders' 'mossy', description "A tidy path runs north, between mossy boulders, towards the mountain face.", before [; Examine: rfalse; Enter, Take: <>; default: "The tidy path between the boulders lies to the north."; ], has scenery; Object -> gardensidepath "wide path" with name 'wide' 'wider' 'path', description "A wide path runs from east to west across the garden. To the east, it angles up along the mountainside; to the west, it slopes down.", before [; Enter, Climb, Take: "Do you want to follow the wide path to the east or the west?"; ], has scenery; Object -> gardencenterfog "fog" with name 'wisp' 'layer' 'of' 'chill' 'fog', description "A layer of chill fog slides slowly down the eastern slope. At moments the breeze playfully tears it apart, or lets it roll on, to dissipate in the garden's turf.", before [; Examine: rfalse; Touch: print "The fog is damp and icy cool --"; if (weather == DREAMTIME) print " far"; " colder than the air here should be."; Smell: "You lean down and inhale the chill fog. It smells of bitter clean ice."; Blow: "Your breath ripples the fog."; default: "The fog is immaterial."; ], has scenery; Object -> gardenstatues "statuary" with name 'small' 'odd' 'bits' 'marble' 'tall' 'statue' 'statues' 'statuary' 'pillar' 'pillars', description "The garden is marked with marble. The corners and intersections of the spiralled paths are picked out by small pillars; statues stand here and there, on hillocks and stretches of turf. The style of carving is strange to you.", before [; Take, Push, Pull: "All of the statuary nearby is firmly anchored."; ], has scenery; Object -> gardencenterbalcony "balcony" with name 'marble' 'steps' 'balcony', description "To the south, a marble balcony looks out over the valley.", before [; Examine: rfalse; Enter, Climb: <>; default: "The balcony is off to the south."; ], has scenery; Object -> gardencentervalley "valley" with name 'verdant' 'valley', before [; "You can't get good view of the valley from the center of the garden."; ], has scenery; ! ---- OutdoorClass GardenBalcony "Marble Balcony" with initial [; if (gbalstatuefallen in self) give gbalstatuefallen general; WitnessMask(gbalfarmask.number); ], description [; print "Below this gently curved balcony, the world drops away into"; switch (weather) { DAYTIME: print " a green vista"; NIGHTTIME: print " a moonlit vista"; DREAMTIME: print " an unearthly vista"; } print ". The stony slopes of the mountainside beneath you crumble, invaded by bracken and tree, until the mountain pines merge into verdant forest and a lush valley floor"; switch (weather) { DAYTIME: print ". A bright thread marks a stream; a distant valley lake is a silver arc"; DREAMTIME: print ". A dim thread marks a stream; a distant valley lake is a bloody arc"; } print ". Beyond the valley, and around it, taller mountains stand like patient shadows"; switch (weather) { DAYTIME: print " in the blue air"; NIGHTTIME: print " against the stars"; DREAMTIME: print " against the streaming red sky"; } "."; ], n_to GardenCenter, out_to GardenCenter, sw_to [; <>; ], se_to [; <>; ], d_to [; <>; ], s_to "The balustrade protects you from a fall which you would certainly not survive. From here, you can only return to the north.", cant_go "From here, you can only return north to the garden.", hinto HintoStatue, coredir d_obj, coredirmod (DIRMOD_FAR | DIRMOD_UNCERTAINPATH); FloorObject -> gbalconybalcony with name 'marble' 'balcony' 'tile' 'tiles', short_name "balcony", description "It's a broad balcony, tiled in white marble, at the southern edge of the garden.", before [; Enter: "You're already standing on the balcony."; ]; Object -> gbalconybalustrade "balustrade" with name 'marble' 'balustrade' 'rail' 'railing', description "The balustrade is carved in a decorative pattern of arches... although, now that you look, it seems to have been carved from a single immense piece of marble.", before [; Climb, JumpOver: "That would be a bad idea."; ], has scenery; Object -> gbalstatuestanding "marble statue" with name 'white' 'marble' 'statue', initial [; print "In the center of the balcony, looking out"; if (self hasnt general) { give self general; print " -- as you are --"; } " over the valley, a white marble statue towers over you. Incongruously, you can see a small ", (string) gbalfarmask.number.name_str, " mask balanced on the statue's face."; ], description [; "The statue is twice life size; it dwarfs you. Its form is curiously abstract. You can make out no gender, no personality in the marble curves. But... the statue gazes out from the balcony. Its weight is forward, its head turned, as if something in the distant valley had just caught its attention. Or... something rising from the valley, perhaps. For the chin is raised; the eyes, if you could see them, would be level.^^ Those eyes are hidden by an absurdly small ", (name) gbalfarmask, ". The mask would not fit a child, and is unusually flat besides. It's not so much worn as balanced on the statue's brow."; ], before [; Take: "Don't be fantastical."; Climb, Enter: HintoStatue.count = true; "You try to swing yourself up on the marble knee, but the statue shifts unsteadily beneath your weight. You'd best not."; Blow: <>; Pull: "Are you nuts? What if it fell on top of you?"; Push: if (ExpertMode) { if (self.count == 0) { StartDaemon(self); self.count = self.count + 3; "You brace yourself against the statue and heave. It's heavy... but it tips, slowly..."; } else { if (self.number == 0) { self.count = self.count + 2; if (self.count >= 5) { StopDaemon(self); self.number = 0; self.count = 0; self.invoke(); "You shove against the statue again, tipping it farther... and then ", (emph) "bang", " it smacks down on the tiles. ", (The) gbalfarmask, " flutters gently down beside it."; } "You shove against the statue again, tipping it farther."; } else { self.count = self.count - 1; "You shove against the statue, fighting its weight as it sways towards you."; } } } else { self.invoke(); "You brace yourself against the statue and heave. It's heavy... but it tips, slowly... and then ", (emph) "bang", " it smacks down on the tiles. ", (The) gbalfarmask, " flutters gently down beside it."; } ], number 0, count 0, daemon [; if (~~ExpertMode) { StopDaemon(self); "[BUG] statue daemon running in nonexpert mode."; } if (self.count <= 0) self.number = 0; if (self.number == 0) { self.count--; if (self.count <= 0) { self.count = 0; self.number = 0; StopDaemon(self); if (self in location) print "^The statue sways heavily to a stop.^"; return; } self.number = 1; if (self in location) print "^The statue rocks"; switch (self.count) { 0, 1: print " mildly"; 2: print " far"; 3: print " wildly"; default: print " crazily"; } print " forward.^"; } else { self.number = 0; if (self in location) { print "^The statue rocks"; switch (self.count) { 0, 1: print " slightly"; 2: print " distinctly"; 3: print " dramatically"; default: print " crazily"; } print " back towards you.^"; } } ], invoke [ ix; if (parent(self) == nothing) "[BUG] statue fell over twice."; ix = gbalfarmask.number; move ix to parent(self); move gbalstatuefallen to parent(self); remove self; ], has static ~general transparent; DistantMaskClass -> -> gbalfarmask with name 'small', number goldmask, description [; print_ret (The) self, " rests on the statue's brow, high above you. It looks like a paper cutout of a human face, half life size. Balanced on the immense statue, it looks rather silly."; ], helpmode 0, before [; Examine: OfferHint(HintoStatue); rfalse; ThrownAt: if (noun has worn) "But you're wearing ", (the) noun, "."; if (noun notin player) "You aren't holding ", (thatorthose) noun, "."; move noun to location; GuideStatueThrowMessage.invoke(); OfferHint(HintoStatue); "You miss."; Blow: OfferHint(HintoStatue); "A good thought. But if the intermittent mountain breeze hasn't dislodged the mask, your puffing from below will not do it."; default: OfferHint(HintoStatue); print_ret "You cannot reach ", (the) self, "."; ]; Object HintoStatue with hint_name gbalfarmask, count false, number 0, hint_suppress [; if (gbalstatuestanding notin GardenBalcony) rtrue; ], description [; switch (self.number) { 0: print (The) gbalfarmask, " is on top of the statue, and the statue is twice as tall as you. So the mask is too high for you to touch it directly. How else might you affect it?"; self.number++; return 2; 1: if (~~self.count) { print "Maybe you can climb up the statue. Try ", (helpcmd) "climb statue", "."; rtrue; } else { print "You can't climb the statue -- but you've learned that it's unsteady. Maybe you can get at the mask by toppling the statue."; self.number++; return 2; } 2: print "Since the statue is unstable, you can probably knock it down. Try ", (helpcmd) "push statue", " or ", (helpcmd) "move statue", "."; rtrue; } ]; Object GuideStatueThrowMessage with count 0, invoke [; self.count++; switch (self.count) { 2: GuideEnqueue(self); 4: GuideEnqueue(self); 5: self.count = 3; } ], description [; print "Apparently your aim is very bad."; if (self.count > 2) print " You should probably try a different approach."; ]; Object gbalstatuefallen "marble statue" with name 'white' 'marble' 'statue', initial [; if (self hasnt general) "An immense marble statue lies fallen on the tiles. Its light, graceful pose is awkward now; knees and elbows jut against the ground."; else "An immense marble statue reclines gracefully on the tiles."; ], description [; if (self hasnt general) "The statue now measures its length on the balcony. It seems to be undamaged -- but the pose it held while standing serves it ill now. It's balanced awkwardly on knee, elbow, and forehead."; else "The statue reclines full-length on the balcony, lying on its side. Its head is propped easily on one hand, and it seems to gaze thoughtfully out past the balustrade."; ], before [; Take: "Don't be fantastical."; Push, Pull: "The statue is not moving any farther."; ], has static ~general; MaskClass goldmask with name_wd 'gold', name_str "gold", count 2, initial [; print_ret (The) self, " is lying by the statue's head."; ], description [; self.MaskClass::description(); "^The face depicted is young, with an impression of strength overlaid by exhaustion."; ]; ! ---- OutdoorClass GardenWarm "Warm Bower" with description [; print "This corner of the garden is cozily tucked into a natural alcove, surrounded by stone bluffs on three sides"; if (warmsmoke.count <= 1 && weather == DAYTIME) print ". The sun is hot on your face"; else print ". The air is warm and dry"; if (weather == NIGHTTIME) print ", despite the darkness"; if (weather == DREAMTIME) print " -- or hot, even for this stifling red world"; ". To the south, the ground drops away, revealing a lush valley far below. The path back to the garden curves up around an outcropping to the east."; ], u_to [; <>; ], e_to GardenCenter, s_to "Low shrubs keep you away from the cliff's edge. Probably this is for the best.", cant_go "The only way is back to the east.", hinto HintoBower, coredir d_obj, coredirmod (DIRMOD_FAR | DIRMOD_UNCERTAINPATH); WallObject -> gwarmbluff with name 'stone' 'bluff' 'bluffs' 'outcrop' 'outcropping', short_name "stone outcropping", description "Bluffs and high stone outcroppings surround this bower to the north, east, and west."; Object -> warmbush "bush" with name 'tall' 'wild' 'bush' 'black' 'branch' 'branches' 'stem' 'stems', initial [; print "Small shrubs dot this garden bower, but a single tall and wild bush dominates the space. Its branches twist in intricate profusion, then leap chaotically upward, spraying gold-veined leaves through the air"; if (warmsmoke.count > 1) print ". Heat radiates from the bush, as if from a brazier"; "."; ], description [; print "The wild bush is not broad, but it is taller than you. Its leaves are narrow, glossy, many-pointed, and veined with gold amid a yellow blush. Clusters of brilliant orange berries hang half-concealed amid the tangled black branches"; if (warmsmoke.count > 1) print ".^^Heat radiates from the heart of the bush, warming the bower"; "."; ], before [ ix; Search, LookUnder: "You can see nothing amid the foliage but branches and a few clusters of berries."; Take, Push, Pull: "You seize a heavy branch. It's incongruously warm, nearly hot. It's also clear that the bush is deeply rooted."; Enter: "The branches twist too thickly to permit entry."; Touch: if (glove has worn) "Even through the glove, you can feel the warmth of the branches."; "The leaves are oddly warm, and the branches nearly hot."; Smell: <>; Receive: if (RunRoutines(warmcluster, before)) rtrue; TouchWith: ix = noun; noun = second; if (RunRoutines(warmcluster, before)) { noun = ix; rtrue; } noun = ix; BerryFreeze: <>; BerryBurn: <>; ], has static; Object -> warmsmoke "thread of smoke" with name 'grey' 'gray' 'thread' 'ribbon' 'trail' 'wisp' 'wisps' 'of' 'smoke' 'woodsmoke', description [; if (self.count <= 1) "You're not sure where the source is."; "Deep inside the bush, wisps of smoke curl from coal-black branches and stems. They rise, buoyed on their own heat, and join into a smooth grey ribbon, vanishing into the sky."; ], before [; Examine: rfalse; Touch: "Smoky heat breathes from the foliage."; Smell, Taste: "The odor is sharp and vivid."; Blow: "Your breath ripples the smoke."; default: "The smoke is immaterial."; ], count 0, each_turn [; self.count++; switch (self.count) { 2: print "^You catch a whiff of woodsmoke -- the same smoke you saw while descending the path. You glance around for the fire...^^ ...And realize that the smoke is drifting from the bush. You see no flames, nor even ember-glow; but grey wisps curl from the coal-black stems and branches. The smoke trails up from the bush, buoyed on its own heat, and vanishes upward in a wind-tossed ribbon.^"; 4: print "^The taste of smoke catches you again.^"; 7: print "^The thread of smoke ripples above the bush.^"; 8, 9, 10: if (random(101) <= 50) self.count = 3; 11: self.count = 3; } ], has scenery; Object -> warmleaves "leaves" with name 'leaf' 'leaves' 'gold' 'gold-vein' 'veined' 'foliage' 'narrow' 'glossy', description "The bush's leaves are narrow, glossy and many-pointed. Their dark green is touched with yellow at the center, and veined with gold.", before [; Search, LookUnder: <>; Take, Pull: "The leaves cling obdurately to the bush. They are also, you notice, oddly warm."; Touch: if (glove has worn) rfalse; "The leaves are strangely warm to the touch."; Smell: <>; ], has scenery pluralname; Object -> warmcluster "cluster of orange berries" with name 'cluster' 'of' 'bright' 'brilliant' 'orange' 'berry' 'berries', description "Bright orange berries hang in clusters amid the narrow leaves.", before [; Take, Pull: if (glove hasnt worn) <>; if (parent(warmberries)) { if (IndirectlyContains(location, warmberries)) "You have already taken a handful of the berries."; remove warmberries; } move warmberries to player; PronounNotice(warmberries); if (warmberries hasnt general) { give warmberries general; "You reach into the bush, and -- with your gloved hand -- carefully strip a handful of berries from a branch.^^After a few moments, their orange color dulls slightly, and the heat you feel through the glove diminishes. Gingerly you prod a berry with your bare finger. It's warm, but no longer scalding."; } "You reach into the bush, and carefully strip a handful of berries from a branch."; Taste, Eat: if (glove hasnt worn) <>; "You want to put one of those berries in your ", (emph) "mouth?", " You can't even imagine how much that might hurt."; Squeeze: <>; Touch: if (glove hasnt worn) { if (self hasnt general) { give self general; "You reach for a berry... ", (emph) "ow!", "^^ You snatch back your hand, shaking it. Your fingertip is scalded red."; } OfferHint(HintoBower); print "The berries on the bush are scalding hot. You're not about to touch them again"; if (warmberries has general) print ", not without putting the glove back on"; "."; } "A definite warmth seeps through the glove, but it seems to protect your skin well enough."; BerryFreeze: <>; BerryBurn: <>; TouchWith: <>; Receive: if (noun == torch && torch hasnt light) { give noun light; "You shove the straw torch into a cluster of orange berries. They burst, spattering juice that immediately flashes to flame. Sparks lodge throughout the straw... which crackles in response. In seconds the torch is burning brightly."; } "You shove ", (the) noun, " into a cluster of orange berries. They burst, spraying juice which immediately flares into a shower of sizzling embers."; ], has scenery ~general; Object warmberries with name 'warm' 'handful' 'of' 'dull' 'orange' 'berry' 'berries', description "It's a small handful of dull orange berries.", short_name [; if (location ofclass DarknessRoom) print "handful of warm berries"; else print "handful of orange berries"; rtrue; ], before [; Touch: "You touch one of your berries gently with a bare finger. It is warm -- a sense of great heat contained, fiery juices within a fragile skin."; Squeeze: print "You squeeze an orange berry gently. Juice leaks out... and flashes instantly to flame"; if (glove has worn) ". You shake the crackle-flash-sparking droplets from your glove."; else ". You whip your hand wildly, trying to shake off the crackle-flash-sparking droplets. That ", (emph) "hurt."; Eat, Taste: print "You stare at the things, trying to decide if they could possibly be edible. "; ; "^Best not to eat them, you conclude."; Insert, PutOn: if (second ofclass FloorObject) rfalse; <>; ThrowAt: if (self notin player) "You're not holding ", (the) self, "."; <>; TouchWith: <>; BerryBurn: "You drop one orange berry onto another. Both burst, scattering flaming droplets everywhere."; BerryFreeze: "Somewhat nervously, you press a white and an orange berry together. There is only a faint hiss; both berries shrivel instantly into tatters of brittle skin."; ], has expendable ~general; ! ---- OutdoorClass GardenCool "Cool Bower" with description [; print "You stand on a small promontory which juts out of the face of the mountain. Shrubs and raised flowerbeds lie around you, except for the path which slopes down to the west. To the south and east, a sharp dropoff looks out over"; if (weather ~= DREAMTIME) print " a lush green"; else print " a dust-pale"; " valley."; ], d_to [; <>; ], w_to GardenCenter, s_to "Low shrubs keep you away from the promontory's edge. Probably this is for the best.", e_to [; <>; ], se_to [; <>; ], cant_go "The only way is back to the west.", hinto HintoBower, coredir d_obj, coredirmod (DIRMOD_FAR | DIRMOD_UNCERTAINPATH); SceneryObject -> coolbowerscenery with name 'promontory'; Object -> coolbush "bush" with name 'bush' 'broad' 'dense' 'branch' 'branches' 'sullen' 'dark', initial "In the center of the bower, a single dense bush squats, sullen and dark. Its branches knot heavily around each other, then spread into sprays of delicate, blue-green needles. Strangely, a chill fog seems to spread out from under the bush; it rolls across the ground and spills from the edges of the promontory.", description [; "The bush is broad and squat. Its blue-tinged needle-like leaves grow profusely, hiding heavy branches and small clusters of translucent white berries."; ], before [ ix; Search, LookUnder: "You can see nothing amid the foliage but branches, a few clusters of berries, and a layer of chill fog."; Take, Push, Pull: "You seize a heavy branch. It's incongruously cold. It's also clear that the bush is deeply rooted."; Enter: "The branches twist too thickly to permit entry."; Touch: if (glove has worn) "Even through the glove, you can feel the chill of the branches."; "The leaves are oddly cool, and the branches uncomfortably cold."; Smell: <>; Receive: if (RunRoutines(coolcluster, before)) rtrue; TouchWith: ix = noun; noun = second; if (RunRoutines(coolcluster, before)) { noun = ix; rtrue; } noun = ix; BerryFreeze: <>; BerryBurn: <>; ], has static; Object -> coolleaves "leaves" with name 'leaf' 'leaves' 'needle' 'needles' 'delicate' 'blue' 'green' 'blue-green' 'tinged', description [; print "The bush's leaves are delicate needles, with a blue-green cast"; switch (weather) { DAYTIME: " -- particularly in the sunlight."; NIGHTTIME: ". In the moonlight, they seem almost to sparkle like frost."; DREAMTIME: "."; } ], before [; Search, LookUnder: <>; Take, Pull: "The leaves cling obdurately to the bush. They are also, you notice, oddly cool."; Touch: if (glove has worn) rfalse; "The leaves are strangely cool to the touch."; Smell: <>; ], has scenery pluralname; Object -> coolfog "layer of fog" with name 'wisp' 'wisps' 'layer' 'of' 'chill' 'fog' 'mist', description [; print "Deep inside the bush, wisps of fog fall gently from the branches. They pool on the ground, spreading out into a layer of mist that brushes silently around your feet"; if (weather == NIGHTTIME) print ".^^In the darkness and moonlight, the fog shines like fluid silver"; if (weather == DREAMTIME) print ". You cannot imagine how mist is possible in this deathly heat, but it remains, and even retains a hint of chill"; "."; ], before [; Examine: rfalse; Touch: "The fog is cool and damp."; Smell: "The odor is bitter and clean, like glacial ice."; Blow: "Your breath ripples the fog."; default: "The fog is immaterial."; ], count 0, each_turn [; self.count++; switch (self.count) { 3: print "^The fog ripples gently on the ground, caught by a breath of breeze.^"; 6: print "^The fog rolls smoothly, endlessly, over the cliff-edge and down the slopes.^"; 8, 9, 10: if (random(101) <= 50) self.count = 2; 11: self.count = 2; } ], has scenery; Object -> coolcluster "cluster of white berries" with name 'cluster' 'of' 'translucent' 'glossy' 'white' 'berry' 'berries', description "Clusters of berries hang amid the bush's foliage. They are white and glossy, pale -- indeed, nearly translucent.", before [; Take, Pull: if (glove hasnt worn) <>; if (parent(coolberries)) { if (IndirectlyContains(location, coolberries)) "You have already taken a handful of the berries."; remove coolberries; } move coolberries to player; PronounNotice(coolberries); if (coolberries hasnt general) { give coolberries general; "You reach into the bush, and -- with your gloved hand -- carefully strip a handful of berries from a branch.^^After a few moments, their translucency dulls to a cloudy white, and the chill you feel through the glove diminishes. Gingerly you prod a berry with your bare finger. It's cool, but no longer burning-cold."; } "You reach into the bush, and carefully strip a handful of berries from a branch."; Taste, Eat: if (glove hasnt worn) <>; "You want to put one of those berries in your ", (emph) "mouth?", " You can't even imagine how much that might hurt."; Squeeze: <>; Touch: if (glove hasnt worn) { if (self hasnt general) { give self general; "You reach for a berry... ", (emph) "ow!", "^^ You snatch back your hand, rubbing frost from your finger. The cold was intense enough to blanch your skin."; } OfferHint(HintoBower); print "The berries on the bush are bitter cold. You're not about to touch them again"; if (coolberries has general) print ", not without putting the glove back on"; "."; } "A definite coolness seeps through the glove, but it seems to protect your skin well enough."; BerryFreeze: <>; BerryBurn: <>; TouchWith: <>; Receive: if (noun == torch && torch has light) { give noun ~light; "You shove the burning torch into a cluster of white berries. An odd blue light crackles through the flame, and for a moment you feel a lancing chill. Then the fire is quenched."; } "You shove ", (the) noun, " into a cluster of white berries. They burst, spraying juice which immediately crackles into a fine, sparkling frost."; ], has scenery ~general; Object coolberries with name 'cool' 'cold' 'handful' 'of' 'dull' 'white' 'cloudy' 'berry' 'berries', description "It's a small handful of dull white berries.", short_name [; if (location ofclass DarknessRoom) print "handful of cool berries"; else print "handful of white berries"; rtrue; ], before [; Touch: "You touch one of your berries gently with a bare finger. It is cold, and you sense a deeper chill within -- a burning cold, like iron in winter, barely contained within the fragile skin."; Squeeze: print "You squeeze a white berry gently. Juice leaks out... and crackles instantly to dry frost"; if (glove has worn) ". You shake white powder from your glove."; else ". You massage your fingers, trying to rub away bitter chill."; Eat, Taste: print "You stare at the things, trying to decide if they could possibly be edible. "; ; "^Best not to eat them, you conclude."; Insert, PutOn: if (second ofclass FloorObject) rfalse; <>; ThrowAt: if (self notin player) "You're not holding ", (the) self, "."; <>; TouchWith: <>; BerryFreeze: "You drop one white berry onto another. Both burst, scattering ice crystals everywhere."; BerryBurn: "Somewhat nervously, you press an orange and a white berry together. There is only a faint hiss; both berries shrivel instantly into tatters of brittle skin."; ], has expendable ~general; Object HintoBower with hint_name "getting the berries", hint_suppress [ berry; if (location == GardenWarm) { berry = warmberries; } else { berry = coolberries; } if (berry has general) rtrue; ], count 0, description [ berry oberry cluster ocluster; if (location == GardenWarm) { berry = warmberries; cluster = warmcluster; oberry = coolberries; ocluster = coolcluster; } else { berry = coolberries; cluster = coolcluster; oberry = warmberries; ocluster = warmcluster; } if (berry has general) { print "You already know how to get the berries."; rtrue; } if (oberry has general) { print "You've already gotten ", (the) oberry, ". The glove will probably protect you here as well."; rtrue; } if (cluster hasnt general && ocluster hasnt general && (self.count & $1) == 0) { self.count = self.count | $1; print "Have you tried to take the berries?"; return 2; } if (glove in player && glove has worn) { print "You are wearing a gardening glove, which should protect you."; rtrue; } if ((self.count & $2) == 0) { self.count = self.count | $2; print "The berries are too "; if (berry == warmberries) print "hot"; else print "cold"; print " to touch. What"; if (IndirectlyContains(location, glove)) print " do you have"; else print " have you seen"; print " which could protect your hand?"; return 2; } if ((self.count & $4) == 0) { self.count = self.count | $4; print "Put on the gardening glove"; if (~~IndirectlyContains(location, glove)) print " which you saw in the Shed downstairs"; print "."; return 2; } print "The command is ", (helpcmd) "wear glove", " or ", (helpcmd) "put on glove", "."; rtrue; ];