[ FoundInHall; if (location == Hall1 or Hall2 or Hall3 or Hall4) rtrue; else rfalse; ]; WallObject hallwall with name 'plaster' 'cracked' 'mold' 'moldering', short_name "plaster walls", description "The walls are thick with old plaster, roughly applied.", found_in FoundInHall, before [; Rub, Touch, Attack, Take, Push, Pull: "Despite its apparent age and decay, the plaster resists your attempts to break through it."; ]; SceneryObject hallscenery with name 'hall' 'hallway' 'curving', found_in FoundInHall; FloorObject hallfloor with name 'worn' 'wood' 'wooden' 'board' 'boards' 'floorboard', description "The floor is worn wooden boards, unevenly laid.", found_in FoundInHall; CeilingObject hallceiling with description "High overhead, the plaster arches to a crude vault.", found_in FoundInHall; Object hallcandles "candles" with name 'candle' 'candles' 'spark' 'tiny' 'flickering' 'flower' 'flowers' 'bloom' 'blooms', description [; "High on the walls are tiny candles shaped like flowers... or perhaps they ", (emph) "are", " flowers. You can see no wicks, and the spark that flickers above each open bloom seems too starry-white for candlefire."; ], found_in FoundInHall, before [; Examine: rfalse; default: "The candles are out of reach."; ], has scenery pluralname; Object harpmusic "music" with name 'music' 'sound' 'sounds' 'harp' 'source' 'playing' 'note' 'notes' 'melody', react_before [; Listen: if (noun == nothing) <>; ], before [; Examine, Search: "You cannot find the source of the music."; Listen: "The notes are passionless and gentle, and precise, and sad. You do not recognize the melody. Indeed, it does not seem like a melody at all."; default: "That's clearly impossible."; ], count 4, number false, invoke [ val; self.number = true; if (self hasnt general) { val = ((Atelier has visited) && (Garden has visited) && (StellariumNorth has visited) && (CisternWest has visited) && (Orrery has visited) && (HarpRoom has visited)); if (val) { give self general; StartDaemon(self); } } ], daemon [ newpos oldpos; self.count--; if (self.count == 0) { oldpos = parent(self); switch (oldpos) { Hall1: newpos = Hall2; Hall2: newpos = Hall3; Hall3: newpos = Hall4; Hall4: newpos = nothing; default: newpos = Hall1; } if (newpos == nothing) self.count = 6; else self.count = 3; if (location == oldpos && (~~self.number)) print "^The music drifts imperceptibly away.^"; if (newpos) move self to newpos; else remove self; if (location == newpos) print "^You abruptly hear the sound of harp music, although you can see no source.^"; self.number = false; } else { if (self.number && self in location) { print "^Harp music is playing somewhere nearby.^"; } self.number = false; } ], has scenery ~general; ! ---- Object Hall1 "Curving Hall, West End" with initial [; harpmusic.invoke(); ], description [; print "The curving corridor ends here, in a blank plaster wall relieved by a single window. The window looks out on a strange subterranean prospect to the west. You can return east, pass through the archway to the north"; if (hall1door hasnt open) print ", or try the closed door to the south"; else print ", or take the stairs which descend to the south"; "."; ], before [; Swim: <>; ], n_to Arboretum, e_to Hall2, d_to [; if (hall1door has open) <>; "You see no way down."; ], u_to "You see no way up.", s_to [; if (hall1door hasnt open) { give hall1door open; print "You push the door open, revealing a narrow flight of stairs descending out of sight. You follow them down.^"; } else { print "You descend the stairs.^"; } return hall1door; ], w_to [; <>; ], out_to [; <>; ], cant_go "You can go north or south, or follow the corridor east.", coredir se_obj; Object -> hall1door "white door" with name 'door' 'white' 'white-painted' 'dingy' 'painted', description [; print "It's a plain door, painted a slightly dingy white"; if (self hasnt open) print ". The door is closed"; else print ". The door is open; beyond it narrow stairs descend"; "."; ], door_dir s_to, door_to OrreryNorth, before [; Attack: if (self has open) print_ret (The) self, " is open."; "No answer."; ], after [; Open: "You push the door open, revealing a narrow flight of stairs descending out of sight."; ], has door openable ~open scenery; Object -> hall1window "window" with name 'window' 'prospect' 'glass' 'pane' 'outside' 'subterranean' 'natural' 'cave' 'cavern' 'column' 'columns' 'cascade' 'cascades' 'flowstone', description [; "A broad glass pane -- inhumanly smooth and flawless -- looks out over a dark cavern.^^ This end of the corridor seems to be deep underground. A natural cave spreads out below; its mammoth columns and cascades of flowstone are only dimly picked out by the candlelight behind you. The farther reaches are hidden in darkness. But the shining waterfall before you is easily visible. A stream pours in from your right, tumbles from a ledge, and plummets into a pit beneath the window. The water seems to sparkle with some natural phosphorescence."; ], before [; Search: <>; Enter: "The window is sealed by a pane of glass, and you see no way to open it."; Open: "You see no way to open the glass of the window."; Close: "The window is already closed."; Attack, Push: "The glass ignores your assault."; Touch, Rub: "The glass is utterly smooth."; ], has scenery; Object -> hall1waterfall "waterfall" with name 'waterfall' 'stream' 'water' 'phosphoresce' 'shining', description "A stream flows into the cavern along a passage to your right -- the cave's north side. The stream's passage is only a little way below you; but the main cave is much deeper, and the water arcs from the edge in a glittering fall. The stream flashes and tumbles down a series of ledges before vanishing into the darkness far below.", before [; Examine: rfalse; Search: <>; default: "The waterfall is out of reach, on the other side of the window."; ], has scenery; ! ---- Object Arboretum "Arboretum" with initial [; give arboretumplant general; ], description [; if (arborwallplain in Arboretum) { print "The walls here are painted white and are utterly undecorated"; } else { print "The walls of the room are painted in green slashes, like the trunks of uncounted trees, and splashed with gold"; } ". An archway leads south."; ], s_to Hall1, count 1, each_turn [; self.count++; if (self.count >= 4 && random(101) < 40) { self.count = 0; print "^A hint of sweet-rank perfume touches you as you breathe.^"; } ], coredir se_obj; Object -> arboretumplant "potted plant" with name 'earthenware' 'tub' 'pot' 'potted' 'edge' 'broad' 'fan' 'leaf' 'leaves' 'tangle' 'vine' 'vines' 'golden' 'flower' 'plant' 'growth', initial [; print "In the center of the room stands an earthenware tub. From it sprout a tangle of vines, broad fan-like leaves, and an enormous golden flower"; if (arborwallplain in Arboretum && self has general) print ". The luxuriant growth clashes, you think, with the room's stark emptiness"; give self ~general; "."; ], description "The plant sits alone in its pot, in the center of the empty room. The golden flower is nearly the size of your head. It rises from a tangle of vines and leaves that would better suit an unexplored south-coast swamp than someone's home.", react_before [; Smell: if (noun == nothing) { "The air is touched with a heavy sweetness -- from the flower, no doubt. The scent is somehow familiar -- you are (of course) unable to draw out the memory."; } ], before [; Search: <>; Take: "The plant's stems look too thick to break, and it's certainly too large to lift."; Push, Pull: "The tub of earth is too heavy to move."; Receive: "The tub is quite full with its vines and leaves."; Smell: print "You lean forward and take a deep breath of the flower's aroma.^"; if (~~Enlightened) print "^Memory nearly bursts through.^"; TransportEffect(); PlayerTo(arborpot); rtrue; ], has static ~general; Object -> arboretumscent "sweet scent" with name 'sweet' 'sweetness' 'heavy' 'rank' 'scent' 'smell' 'aroma' 'perfume', before [; Examine, Search: <>; Smell: <>; default: "The sweet scent is insubstantial."; ], has scenery; KeyClass -> labkey "iron key" with article "an", name 'long' 'iron' 'key', initial "An iron key is balanced neatly on the edge of the tub.", description "It's a long crudely-cut iron key.", scaleweight 57, after [; Take: if (self hasnt general) { give self general; GuideEnqueue("Another key -- always a pleasant find. Remember that it could unlock either a door you have not yet found, or one you have already tried and found locked."); } ], has ~general; WallObject -> arborwallplain with name 'bare' 'white' 'painted', description "The walls are bare and white.", has pluralname; WallObject arborwallfancy with name 'painted' 'slash' 'slashes' 'splash' 'splashes' 'green' 'gold', description "The walls are painted with vivid vertical green slashes and splashes of gold.", before [; Touch: "It's just paint."; ]; ! ---- Object Arbor "Dank Jungle" with description "You are standing waist-deep in an empty earthenware tub, in the midst of a trackless jungle.^^ Heavy, entangled trunks and vines loom in every direction, as far as you can see -- and you can't see far. The sky is entirely obscured by layers of vegetation. Only a murky green light filters down to you. But golden flowers dot the trees, like bursts of sun.", cant_go "You'll have to get out of the tub first.", hinto HintoArtifactArea, coredir "very, very far away"; Object -> arborpot "earthenware tub" with name 'earthenware' 'empty' 'pot' 'tub', react_before [; Exit: print "You swing your legs out of the tub, and find the world swinging around you...^"; if (arborwallplain in Arboretum) { remove arborwallplain; move arborwallfancy to Arboretum; } TransportEffect(); PlayerTo(Arboretum); rtrue; ], before [; Push, Pull, Take: "You're standing ", (emph) "in", " the tub."; ], has scenery container open enterable; Object -> arborplants "plants" with name 'trunk' 'trunks' 'vine' 'vines' 'vegetation' 'plant' 'plants' 'tree' 'trees' 'green' 'jungle', description "Green vegetation surrounds you.", react_before [; Smell: if (noun == nothing) <>; ], before [; Examine: rfalse; Search: "You cannot see far into the jungle."; Smell: "The air is rankly thick with life and sap."; default: "No vines hang near enough to seize from the pot."; ], has scenery pluralname; Object -> arborflowers "golden flowers" with name 'gold' 'golden' 'flower' 'flowers' 'blossom' 'blossoms' 'bloom' 'blooms', description "The flowers must be large, but they are high overhead, hanging from the vines that twist around every tree in sight. The jungle canopy is spotted with gold, amid the green dimness.", before [; Examine: rfalse; default: "The flowers are high above."; ], has scenery pluralname; Object -> arborground "ground" with name 'ground' 'soil' 'dirt' 'earth', description "Damp soil surrounds the tub.", before [; Examine: rfalse; default: "You can't reach the soil from inside the tub."; ], has scenery; ! ---- Object Hall2 "Curving Hall at Pedestal" with initial [; harpmusic.invoke(); ], description [; print "The dingy plaster walls of this corridor curve out of sight to the west and southeast"; if (torch has light && IndirectlyContains(self, torch)) print ". Aside from your torch, tiny candles"; else print ". Tiny candles"; " provide the only illumination. Archways lead north and northeast."; ], w_to Hall1, se_to Hall3, ne_to [; if (HarpRoom has visited && torch notin HarpRoom && random(97) < 10) return StoneSpire; return HarpRoom; ], n_to [; if (torch has light && (IndirectlyContains(player, torch) || IndirectlyContains(CavePassage, torch))) { print "Torchlight flickers on limestone walls as you step through the arch.^"; } else { print "You blink into the dimming light as you step through the arch.^"; } return CavePassage; ], cant_go "You can follow the corridor to the west or southeast; or you can go north or northeast.", coredir se_obj; Object -> hallpedestal "pedestal" with name 'short' 'pedestal' 'black' 'marble', initial "A short pedestal of black marble stands by the inner wall.", description [; print "A short, square pedestal of black marble stands here. It's entirely out of place; you get the impression the owner just shoved it against a wall one day, and never bothered to move it"; if (child(self)) { print ".^^"; <>; } "."; ], before [; Enter: "The pedestal is too narrow to sit on comfortably."; Take, Pull, Push, Turn: "The pedestal is far too heavy to budge."; LookBehind: "You don't see anything between the pedestal and the wall."; LooKUnder: "The pedestal seems to be resting directly on the floorboards."; ], has static supporter; ! ---- Object HarpRoom "Harp Chamber" with description "Broad golden pillars march around the edge of this circular chamber. The walls between the pillars are deeply set, painted in variegated shades of blue and sea-green, and lit from some hidden source. An archway leads southwest, and there is a door to the east. The eastern door is closed; blinding light seeps out around its edges.", sw_to Hall2, e_to "The door is closed.", cant_go "The only exits are southwest and east.", each_turn [; if (StoneSpire has visited) ReminisceSpireGone.invoke(); ], coredir s_obj; Object -> lightdoor "door" with name 'door' 'light' 'brilliance' 'latch' 'plain', description "Intolerable brilliance seeps around the edges of the closed door. You can see no keyhole, only a simple latch.", door_dir e_to, door_to [; "[BUG] Can't go through light door."; ], before [; Open, Push, Pull: "The door is jammed fast against its latch; you can move neither of them. It feels as if a mountain's weight leans against the other side of the door."; Touch: "The door is faintly warm."; Close: "The door is already closed."; LookUnder, LookBehind: "A blinding light seeps out past the edges of the door. You can see nothing else through the cracks, no matter how you squint."; Attack: "No answer."; ], has scenery door ~open; Object -> harppillars "pillars" with name 'pillar' 'pillars' 'broad' 'gold' 'golden' 'gilt' 'painted' 'gold-painted', description "The pillars seem to be wood, in fact -- floridly carved and painted with gilt. Ten of them are evenly spaced around the perimeter of the room.^^ The overall effect is bombastic, and rather absurd.", before [; Take, Push, Pull: "The pillars cannot be moved."; Climb: "Useless."; Attack: print_ret (emph) "Thump."; LookBehind: "You can see nothing behind the pillars, despite the light that apparently shines on the walls."; ], has scenery pluralname; WallObject -> harpwall with name 'painted' 'source' 'panel' 'panels', description "The ten wall panels are stippled in shades of blue and green. They are framed by the golden pillars; and somehow lit from the sides, as if invisible lights shone behind each pillar.^^ The overall effect is bombastic, and rather absurd."; FloorObject -> harpfloor; Object -> harp "burnt harp" with name 'harp' 'remains' 'tall' 'burned' 'burnt' 'pillar' 'frame' 'soundbox', initial "In the center of the room, the remains of a tall harp stand in proud ruin.", description [ val; val = false; print "This once-proud instrument looks as if it was destroyed in inferno -- although the room shows no other signs of a fire. The harp's pillar and frame are blackened and cracked; the soundbox is split apart. The few remaining strings are curled knots of ash"; if (~~Enlightened) { if (self hasnt general) { give self general; print ".^^", (emph) "~What is this,~", " you wonder, ", (emph) "~in a wizard's house?~"; val = true; } } else { print ".^^", (emph) "~What was this?~", " you wonder. The memory has not yet come clear."; val = true; } if (val) { ! reminisce print " A failed spell? A defeated enemy? A strayed memory? Or a warning, or a word of past or prophecy. Or a splinter of charred wood"; } "."; ], before [; Take, Push, Pull: "The harp is too large to move."; Play: "No one will ever play this harp again."; Blow: "A faint, eerie wail rises from the harp, as if you blew across the ghosts of burnt strings. You stop, unnerved. The sound is bitter and hungry."; Listen: "You hear nothing."; BerryBurn: "It's already burnt."; ], has static transparent ~general; Object -> -> harpstrings "harpstrings" with name 'string' 'strings' 'harpstring' 'harpstrings' 'knot' 'knots' 'ash', description "The few remaining harpstrings are curled knots of ash.", before [; Take, Pull: "You tug on a harpstring, but it crumbles to nothing."; Blow: <>; Play: <>; ], has scenery pluralname; Object -> torch "straw torch" with name 'torch' 'short' 'bundle' 'of' 'straw', short_name [; if (self has light) { print "burning straw torch"; rtrue; } ], parse_name [ wd num accept; accept = (self has light); wd = NextWord(); while (WordInProperty(wd, self, name) || (accept && (wd == 'lit' or 'burning' or 'flaming'))) { num++; wd = NextWord(); } return num; ], invent [; if (inventory_stage == 2) rtrue; ], partinvent [; if (inventory_stage == 2) rtrue; ], initial [; if (self in CavePassage) { give self moved; give self ~light; "Something turns under your foot. You glance down... and see the torch you left behind. That's... unexpected."; } if (self in CavePit1) { give self moved; "Your torch, thankfully, has landed nearby."; } "Off to one side, lying on the floor, you see something that looks like a short bundle of straw."; ], description [; if (self hasnt moved && self hasnt light) { print "You take a closer look at the bundle of straw. Your best guess is that it's a torch of some sort. "; } give self moved; print "The straw is tied tightly at one end, forming a handle"; if (self hasnt light) "; the other end is splayed, and seems to be slightly charred."; else ". The other end is burning merrily... although the straw does not seem to be consumed nearly as fast as it ought."; ], before [; Blow, Wave: if (self has light) "The flame roars and streams."; Smell: if (self has light) "The harsh sooty smell of burning straw licks from the torch."; else "You can smell a lingering hint of harsh smoke."; Untie: "You can't loosen the straw."; Touch: if (self has light) "It's on fire. What do you expect?"; Receive: if (self has light) "Burning ", (the) noun, " would be a waste."; PutOn, Insert: if (self has light) { if (self notin player) rfalse; ! I ought to shift all these cases to a TorchBurn action if (second == bonfire or fireplace or basket or sphereheap or caveriver or artmtnpool or warmcluster or coolcluster or warmbush or coolbush) rfalse; if (second == warmberries) <>; if (second == coolberries) <>; "Burning ", (the) second, " would be a waste."; } TouchWith: if (second == bonfire) <>; BerryBurn: if (self has light) "The berry pops in a shower of flaming droplets."; give self light; give self moved; print "You thrust the orange berry into the straw bundle. It bursts, spattering juice that immediately flashes to flame. Sparks lodge throughout the straw... which crackles in response. In seconds the torch is burning brightly"; if (location ofclass DarknessRoom) { if (location == Subterrane) print ".^^Agony lances through your eyes, and you stumble against hard stone. When true sight returns, the world seems smaller.^"; else print ".^^You blink away dazzle-veils, and look around, trying to orient yourself.^"; ToLight(); rtrue; } "."; BerryFreeze: if (self has light) { give self ~light; print "You drop a white berry into the burning straw. An odd blue light crackles through the flame, and for a moment you feel a lancing chill"; if (RoomIsDark(location)) { print ". Then the fire is quenched -- and all light drains away in an instant.^"; ToDarkness(); rtrue; } ". Then the fire is quenched."; } ], after [; Take: if (self hasnt moved) "You pick up the bundle of straw, and look it over. Your best guess is that it's a torch of some sort. The straw is tied tightly at one end, forming a handle; the other end is splayed, and seems to be slightly charred."; if (self has light) "You pick up the flaming torch."; Drop: if (self has light) "You carefully set down the torch. It gutters, but does not go out."; ], has ~light; ! ---- Object StoneSpire "On Stone Spire" with initial "You nearly shriek as you stumble for balance. The world has changed without warning.", description "You are on top of a precarious spire of stone, hundreds of feet above roaring, tumbling waves. Far to the east, the seas smash and smash again, beating against a cliff of the same black stone that supports you. But your footing is barely two paces across. You can feel the spire vibrate with every crash of wave at its base.", sw_to [; sweep_movables(self, HarpRoom); print "The roar and sea-smell vanish as you step through the arch. You blink in the hallway's quiet candlelight.^"; return Hall2; ], cant_go "A step in any direction would be fatal.", hinto HintoArtifactArea, coredir "very, very far away"; Object -> spirearch "archway" with name 'arch' 'archway', initial "A familiar archway hangs in the air, just southwest of the spire.", description "The archway is unsupported. It is just southwest of the spire, and level with you; a step would take you through. But the view through the arch is the same as the view around it: empty air, falling to a violent and tempestuous sea.", before [; Search: <>; Enter: <>; ], has static; FloorObject -> spirespire with name 'black' 'stone' 'spire' 'precarious' 'needle', short_name "spire", description "The spire's top is nearly flat -- fortunately -- but only two yards across. Below, the spire is a vertical needle of black stone, descending to the roaring waves below.", before [; Climb: "Utterly impossible."; Touch: "You can feel it shudder with every wave."; ]; Object -> spirecliff "cliff" with name 'black' 'stone' 'cliff' 'cliffs', description "The cliffs to the east are fissured into black columns -- no doubt your spire was once part of them, before the sea drove between. The thought is not comforting.", before [; Examine: rfalse; default: "The cliffs must be a half-mile to the east."; ], has scenery; Object -> spiresea "ocean" with name 'ocean' 'sea' 'seas' 'wave' 'waves' 'water' 'violent', description "The sea is a cruel grey-green, which pales towards the cliffs to the east. Long heaves roll toward you, shake the stone beneath your feet, and curl up to smash on the cliffs.", before [; Examine: rfalse; Enter: "You would have to be mad. (Are you mad? You hastily drop the thought.)"; Smell: "You can smell salt and the tide-wrack of tiny dead things."; Listen: "The sea is deafening."; Receive: "You would certainly never, ever get it back. Better not."; BerryBurn, BerryFreeze: "You toss a berry over the edge of the spire. But whatever effect it has on the sea is lost in the tumult."; default: "The sea is far, far below you."; ], react_before [; Jump, Swim: <>; Smell: if (noun == nothing) <>; Listen: if (noun == nothing) <>; ], has scenery; ! ---- Object Hall3 "Curving Hall" with initial [; harpmusic.invoke(); ], description [; print "You are in a high, dim corridor, walled in cracked and moldering plaster"; if (torch has light && IndirectlyContains(self, torch)) print ". Aside from your torch, the only light"; else print ". The only light"; print " comes from tiny flickering candles above. The hall curves gently around from the south to the northwest. You see a"; if (hall3door has open) print "n open"; else print " closed"; print " door to the west; archways open to the northeast and east"; "."; ], nw_to Hall2, s_to Hall4, ne_to Atelier, e_to MosaicRoom, w_to [; if (hall3door hasnt open) { print "The white door is closed"; if (hall3door has locked) print " and locked"; "."; } return hall3door; ], cant_go "You can follow the corridor to the south or northwest; or you can try going west, northeast, or east.", coredir s_obj; Object -> hall3door "white door" with parse_name ParseNameClone, parse_name_clone sittingdoor, description [ fn; fn = sittingdoor.description; return fn(); ], door_dir w_to, door_to SittingRoom, with_key hallkey, before [; Lock, Unlock: if (second == labkey) { print_ret (The) second, " is too large to fit the door's small lock."; } if (second ~= self.with_key) { print_ret (The) second, " is unlikely to lock or unlock anything."; } if (action == ##Lock && self has locked) "The door is already locked."; if (action == ##Unlock && self hasnt locked) "The door is already unlocked."; Turn: <>; Receive: if (noun ofclass KeyClass && receive_action == ##Insert) { <>; } Attack: if (self has open) print_ret (The) self, " is open."; "No answer."; Search: if (self has open) print_ret (The) self, " is open."; "You can't see through the keyhole."; ], after [; Unlock: give self open; "The copper key unlocks the door. You turn the knob and swing it open."; ], has door openable open ~locked lockable scenery; ! ---- Object Hall4 "Curving Hall, South End" with initial [; harpmusic.invoke(); ], description [; print "The curving corridor ends here. The blank plaster wall to the south features a large window"; switch (weather) { DAYTIME: print "; sunlight pours in, brightening this end of the hall"; NIGHTTIME: print "; outside, stars gleam in a night sky"; DREAMTIME: print "; a hellish red light pours in"; } print ". You can go through the archway to the east, take the"; if (hall4door hasnt open) print " closed door to the west"; else print " stairs which ascend to the west"; ", or return north along the corridor."; ], n_to Hall3, e_to Shed, d_to "You see no way down.", u_to [; if (hall4door has open) <>; "You see no way up."; ], w_to [; if (hall4door hasnt open) { give hall4door open; print "You pull the door open, revealing a narrow flight of stairs ascending out of sight. You follow them up.^"; } else { print "You ascend the stairs.^"; } return hall4door; ], s_to [; <>; ], out_to [; <>; ], cant_go "You can go east or west, or follow the corridor north.", coredir nw_obj; Object -> hall4door "white door" with name 'door' 'white' 'white-painted' 'dingy' 'painted', description [; print "It's a plain door, painted a slightly dingy white"; if (self hasnt open) print ". The door is closed"; else print ". The door is open; beyond it narrow stairs ascend"; "."; ], door_dir w_to, door_to StellariumEast, before [; Attack: if (self has open) print_ret (The) self, " is open."; "No answer."; ], after [; Open: "You pull the door open, revealing a narrow flight of stairs ascending out of sight."; ], has door openable ~open scenery; Object -> hall4window "window" with name 'window' 'prospect' 'glass' 'pane' 'outside' 'world' 'mountain' 'mountains' 'valley' 'cliff' 'slopes' 'stream' 'greenery' 'sill' 'windowsill', description [; print "A broad glass pane -- inhumanly smooth and flawless -- looks out over"; switch (weather) { DAYTIME: print " a sunlit, mountainous world.^^ You must be looking out of a sheer cliff, for you can see no ground below the windowsill. Far below, stone slopes break and crumble into a verdant valley. Sunlight glints off water -- threads of stream amid the greenery"; NIGHTTIME: print " a world of dreaming, starlit mountains.^^ You must be looking out of a sheer cliff, for you can see no ground below the windowsill. Far below, stone slopes break and crumble into a night-shadowed valley. A few threads of water catch starlight"; DREAMTIME: print " a world of jagged mountains under a racing red sky.^^ You must be looking out of a sheer cliff, for you can see no ground below the windowsill. Far below, stone slopes break and crumble into a valley, whose vegetation seems strangely pale in the lurid light"; } print ". Beyond the valley, the mountains rise again, and mountains beyond that"; if (self hasnt general && (~~Enlightened)) { give self general; ! reminisce print ".^^You stand for a moment, wondering at the view. ", (emph) "~If I were a wizard,~", " you think, ", (emph) "~I would build a house overlooking...~", " But the thought frays, wanders, and is lost"; } "."; ], before [; Search: <>; LookWith: if (second == self) <>; Enter: "The window is sealed by a pane of glass, and you see no way to open it."; Open: "You see no way to open the glass of the window."; Close: "The window is already closed."; Attack, Push: "The glass ignores your assault."; Touch, Rub: "The glass is utterly smooth."; ], has scenery ~general; Object -> hall4sky "sky" with name 'sky' 'sun' 'sunlight' 'moon' 'moons' 'star' 'stars', description [; switch (weather) { DAYTIME: "The sky outside is unclouded blue. It stretches with the broad perfection of its mountain domain. The sun is an exuberant early-afternoon glare."; NIGHTTIME: "The sky outside is black, but clear, hung thickly with stars. The moon is well risen, and surrounded by a halo."; DREAMTIME: "The sky outside 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."; } ], before [; Examine: rfalse; Search: <>; default: "The sky is outside the window."; ], has scenery; ! ---- Object Atelier "Atelier" with description [; "This cramped, boxy room appears to have been an artist's studio. The walls and floor are splattered with paints of many colors. Strangely, the room is nearly empty; you see no stacks of canvas or bottles of pigment. The exit is southwest."; ], before [; Smell: if (noun == nothing) "Traces of dust, oil, and kerosene whisper the air."; ], sw_to Hall3, cant_go "The only way out is the archway to the southwest.", hinto HintoTelescope, coredir sw_obj; SceneryObject -> atelierscenery with name 'atelier' 'studio' 'room'; WallObject -> atelierpaint with name 'paint' 'paints' 'paint-splat' 'splattered' 'streak' 'streaks' 'splatter' 'splatters' 'color' 'colors', short_name "paint-splattered walls", description "Streaks and splatters of paint encrust the walls. There must be six dozen colors, or nearly.", before [; Touch, Rub: "The paint on the walls is quite dry."; Smell: <>; ], has scenery pluralname; Object -> easel "easel" with name 'easel' 'rough' 'wood' 'wooden' 'frame' 'lath' 'laths', article "an", initial [ ix; print "A rough wooden easel is set up at one end of the room"; ix = child(self); switch (ix) { nothing: break; mountainpainting: print ". Displayed upon it is a painting -- a bright mountain landscape"; desertpainting: print ". Displayed upon it is a painting -- a stark desert landscape"; default: print ". Lying on the easel is ", (a) ix; } "."; ], description [ ix; print "It's just a frame, nailed together from a few spare laths"; ix = child(self); if (ix == nothing) print ". Nothing is resting on the easel"; else print ". Resting on the easel is ", (a) ix; "."; ], before [ ix; Search: <>; Take, Push, Pull: "The easel is nailed to the floor... or possibly just painted in place."; Receive: ix = child(self); if (ix) "There's no room, since ", (the) ix, " is already on the easel."; ], has static supporter; Object -> -> mountainpainting "mountain landscape painting" with name 'bright' 'mountain' 'pool' 'landscape' 'painting' 'picture', describe [; if (ExpertMode && mountainpainting hasnt moved) { if (palette hasnt moved) rtrue; else "^Sitting in a corner is a painting -- a bright mountain landscape."; } ], description [; print "The painting shows a tiny rock pool amid jagged mountain peaks. The landscape is harsh and unforgiving, but the pool seems a respite. It is rimmed with bright moss, and a few fish-like shadows are visible in its depths.^"; MaskPaintingDesc(ArtMountain, "on the pool's shore"); rtrue; ], before [; Search: <>; ], has transparent; DistantMaskClass -> -> -> distantscopemask with number brownmask, description [; WitnessMask(distantscopemask.number); "Just a smudge of paint, representing a ", (string) self.number.name_str, " mask."; ], before [; Examine: HintoTelescope.invoke(); rfalse; Search: <>; default: HintoTelescope.invoke(); "It's only paint."; ]; Object -> telescope "telescope" with name 'small' 'telescope' 'scope' 'tube' 'tripod' 'lens' 'eyepiece' 'black' 'leather' 'silver' 'ring' 'rings', initial "At the other end of the room, a tripod props up what looks like a small telescope.", description [; GuideTelescopeUsageMessage.invoke(); "The telescope is a tiny, handmade instrument, all old black leather and beaten silver rings. It is aligned precisely horizontally -- pointing straight at the easel."; ], before [; Search: print "You bend and peer into the telescope's lens. You see a tiny dot of light in the distance... and then the... world turns... sideways....^"; TransportEffect(); PlayerTo(MetalCulvert); rtrue; Enter: if (MetalCulvert has visited) <>; "You can't imagine how to do that."; LookWith: if (second == easel || IndirectlyContains(easel, second)) <>; "The telescope points only at the easel."; Take, Push, Pull, Turn: "The telescope's tripod is locked in place."; ], has static; Object -> palette "palette" with name 'palette' 'board' 'pigment' 'pigment-daub' 'daub' 'daubed', initial [; print "A pigment-daubed board, no doubt the artist's palette, is sitting in a corner"; if (ExpertMode && mountainpainting hasnt moved) print ". Next to it is a painting -- a bright mountain landscape"; "."; ], description "It's a warped old board, crusted with every color you can imagine, in no order at all.", before [; Touch, Rub: "The paint on the palette is crusted and dry."; ]; Object GuideTelescopeUsageMessage with invoke [; if (MetalCulvert has visited) return; self.count++; switch (self.count) { 2: GuideEnqueue(self); 3: self.count = 0; } ], count 0, description [; print "The ", (helpcmd) "x", ", ", (helpcmd) "examine", ", or ", (helpcmd) "look at", " commands give you a close look at something. However, if you want to look through the telescope, you would type ", (helpcmd) "look through telescope", " or ", (helpcmd) "look into telescope", "."; ]; Object HintoTelescope with hint_name distantscopemask, invoke [ obj; obj = nothing; if (location provides hinto) { obj = location.hinto; } if (obj == nothing or self) OfferHint(HintoTelescope); ], hint_suppress [; if (distantscopemask notin mountainpainting) rtrue; ], count 0, description [; if (~~distantscopemask.number.witnessed) { print "Have you taken a close look at the mountain landscape?"; rtrue; } if (self.count & $1 == 0) { self.count = self.count | $1; print "You've found a painting of ", (a) distantscopemask.number, ", but that's not the same as finding the mask itself. Nor have you found the location which the painting depicts."; return 2; } if (player notin Atelier) { if (location == MetalCulvert && mountainpainting in easel) { print "Keep exploring."; rtrue; } if (location == ArtEmpty or MetalCulvert) { print "You found the painting near the telescope, and the telescope certainly has some sorcerous effects. (Consider where you are right now.) When you get back to the Atelier, the telescope is worth experimenting with further."; rtrue; } if (MetalCulvert has visited) { print "Recall the telescope you found near the painting -- it certainly had some sorcerous effects. It's worth experimenting with."; rtrue; } if (self.count & $100 == 0) { self.count = self.count | $100; print "It's worth going back to the room where you ", (emph) "found", " the painting -- perhaps it was kept there for a reason."; return 2; } print "It's worth going back to the Atelier, where you found the painting. Perhaps it was kept there for a reason."; rtrue; } if (MetalCulvert has visited) { if (ArtDesert has visited) { print "You've travelled to the scene of the desert landscape, and that's what was resting on the easel when you looked into the telescope. Travelling to the mountain landscape should be easy."; rtrue; } if (ArtPalette has visited) { print "The telescope took you to a pretty strange place -- after you put the palette on the easel. But wasn't the mountain landscape on the easel when you got here?"; rtrue; } print "The telescope took you to a pretty strange place -- a wooden platform in a void. But that was after you took the mountain landscape off the easel. What if you put it back, and tried again?"; rtrue; } if (self.count & $2 == 0) { self.count = self.count | $2; print "It's worth searching this room further. Perhaps the painting is kept here for some reason -- or perhaps something else here is relevant to the painting."; return 2; } if (self.count & $4 == 0) { self.count = self.count | $4; print "The telescope is pointing straight at the easel"; if (mountainpainting notin easel) print ", which is where you found the painting"; print "."; return 2; } if (self.count & $8 == 0) { self.count = self.count | $8; print "Have you examined the telescope?"; return 2; } print "Have you tried ", (helpcmd) "look through telescope", "?"; rtrue; ]; ! ---- Object MosaicRoom "Mosaic Room" with initial [; mosaic.number++; if (mosaic.number > 7) mosaic.number = 1; ], description [; print "The walls and ceiling of this room are entirely covered with"; switch (mosaic.number) { 1: print " tiny blue tiles. On the east wall, a few black and grey tiles seem to depict birds on the horizon of a mosaic sky."; 2: print " tiny blue tiles. On the east wall, black and grey tiles seem to depict a flock of birds on the horizon of a mosaic sky."; 3: print " tiny tiles. Rising up the east wall, black and grey tiled birds seem to stream towards you, into a mosaic sky of perfect blue."; 4: print " tiny tiles. The mosaic depicts a flock of black and grey birds which stream up the east wall into a blue tile sky."; 5: print " tiny tiles. The mosaic depicts a flock of black and grey birds which stream across the blue ceiling and down the west wall."; 6: print " tiny blue tiles. On the west wall, black and grey tiles seem to depict a flock of birds on the horizon of a mosaic sky."; 7: print " tiny blue tiles. On the west wall, a few black and grey tiles seem to depict birds on the horizon of a mosaic sky."; default: print " [BUG] Mosaic.number = ", self.number, "."; } " The only exit is an archway to the west."; ], w_to Hall3, cant_go "The only exit is to the west.", coredir sw_obj; Object -> mosaic "mosaic" with name 'black' 'white' 'grey' 'gray' 'blue' 'tile' 'tiles' 'mosaic' 'mosaics' 'sky' 'birds' 'flock' 'horizon' 'wall' 'walls', description [; switch (self.number) { 1: "The mosaic seems to represent a perfect blue sky, rising up the walls and across the ceiling. A few mosaic birds circle above the eastern horizon."; 2: "The mosaic seems to represent a perfect blue sky, rising up the walls and across the ceiling. A flock of mosaic birds swirls above the eastern horizon."; 3: "The mosaic seems to represent a perfect blue sky. The eastern sky is thick with tiled birds; they stream up the east wall, as if a migration were approaching."; 4: "The mosaic seems to represent a perfect blue sky. Tiled birds rise up the eastern wall and stream across the ceiling."; 5: "The mosaic seems to represent a perfect blue sky. Tiled birds flock across the ceiling, and stream into the distance on the western wall."; 6: "The mosaic seems to represent a perfect blue sky, rising up the walls and across the ceiling. A flock of mosaic birds swirls above the western horizon."; 7: "The mosaic seems to represent a perfect blue sky, rising up the walls and across the ceiling. A few mosaic birds circle above the western horizon."; default: print_ret "[BUG] Mosaic.number = ", self.number, "."; } ], number 0, before [; Take, Pull: "The tiles are fixed to the walls."; Touch, Rub, Push, Search: "You run your fingers along the multitudes of tiny tiles, but discover nothing."; Enter: "You know no way to enter the mosaic."; ], each_turn [; if (self.number == 3) { if (self hasnt general) { give self general; print "^You frown at the mosaics which cover the walls and ceiling. Were there so many birds before?^"; } } ], has scenery ~general; CeilingObject -> mosaicceiling with before [; Examine, Search: <>; ]; Object -> cage "brass cage" with name 'delicate' 'brass' 'wire' 'mesh' 'cage' 'stand' 'curved' 'door', initial [ ix; print "A delicate cage of brass wire hangs from a curved stand in the center of the room."; if (apple in self) { if (self has open) print " [BUG] cage open with apple."; " Within the cage is a single ripe apple."; } if (self hasnt open) print " The cage is closed"; else print " The cage is open"; ix = child(self); if (~~ix) { print " and empty"; } else { print "; it contains "; WriteListFrom(ix, TERSE_BIT + ENGLISH_BIT + CONCEAL_BIT); } "."; ], description [ ix; print "You've seen -- you might have seen -- such cages in the market, holding songbirds in their shining wire embrace"; if (apple in self) { ". This one, however, contains a ripe and perfect apple. You cannot imagine why. The cage door is closed."; } ix = child(self); if (~~ix) { print ". But this cage is empty"; } else { print ". This cage contains "; WriteListFrom(ix, TERSE_BIT + ENGLISH_BIT + CONCEAL_BIT); } print ". The cage door is"; if (self hasnt open) print " closed"; else print " open"; "."; ], before [; Take: "The cage's stand is bolted to the floor."; Push, Pull: "The cage rocks gently."; Enter: print "The cage is only big enough for a small bird, not for yourself"; if (self hasnt open) print ". Besides, it's closed"; "."; Receive: if (self hasnt open) "You cannot put anything into the cage while it is closed. The mesh is too fine."; if (LargeObject(noun)) print_ret (The) noun, " won't fit into the cage."; Smell: if (apple in self) <>; if (badapple in self) <>; ], after [; Open: if (apple in self) { remove apple; move badapple to self; if (GuideContext.just_undid) GuideEnqueue(GuideOpenedCageUndoMessage); else GuideEnqueue(GuideOpenedCageMessage); "You pull open the wire door. Then you jerk back; something invisible seems to burst from the cage. It rolls across the room like lightning or dessicated time. It echoes.^^ The apple spots, rots, and sinks into itself in a single instant. Within a heartbeat, the fruit is a withered husk -- as if it had sat in that cage for decades."; } ], has static ~open openable container transparent; Object -> -> apple "apple" with article "an", name 'apple' 'fruit' 'single' 'ripe' 'red', description "The apple looks ripe and fresh; it might have been plucked moments before you entered the room.", before [; Taste: print "(first taking ", (the) self, ")^"; <>; Smell: "The apple smells like summer cooling to autumn."; ], after [; Take: "[BUG] Took ripe apple."; ]; Object badapple "withered apple" with name 'apple' 'withered' 'rotten' 'rotted' 'decayed' 'dry' 'dried' 'husk', description "It's a withered, dried husk of an apple.", before [; Taste: <>; Eat: "The apple is years beyond edibility."; Smell: "The apple smells of winey rot and mold."; ], scaleweight 31; ! ----