[ DirName dir cap inc ix; switch (dir) { n_obj: ix = 0; e_obj: ix = 1; s_obj: ix = 2; w_obj: ix = 3; 0: if (cap) print "Center"; else print "center"; return; default: print "[BUG] DirName(", dir, ")"; return; } ix = (ix+inc) % 4; if (cap) { switch (ix) { 0: print "North"; 1: print "East"; 2: print "South"; 3: print "West"; } } else { switch (ix) { 0: print "north"; 1: print "east"; 2: print "south"; 3: print "west"; } } ]; [ DirIName ix cap inc; ix = (ix+inc) % 4; if (cap) { switch (ix) { 0: print "North"; 1: print "East"; 2: print "South"; 3: print "West"; } } else { switch (ix) { 0: print "north"; 1: print "east"; 2: print "south"; 3: print "west"; } } ]; Class StellariumRoom with short_name [ ix; if (projector hasnt open) { if (sphere.number == 7) ix = -1; else ix = 0; } else { ix = sphere.number; } switch (ix) { -1: print "Starry"; 1: print "Lit"; 2: print "Gold-Lit"; 3: print "Red-Lit"; 4: print "Brown-Lit"; 5: print "Green-Lit"; 6: print "Blue-Lit"; 7: print "Strangely-Lit"; default: print "Dark"; } print " Dome, "; DirName(self.number, true); rtrue; ], roomtext [; print "You stand at the "; DirName(self.number, false); if (self.number) print " edge"; print " of a vast round space"; if (self.number) { print ". It stretches out to the "; DirName(self.number, false, 2); print ", arching into an immense dome"; } else { print ". An immense dome arches above you"; } if (sphere.number == 0) { print ". A diffuse illumination spreads across the lower reaches, barely bright enough to see by."; } else { if (projector has open) { print "; it is filled with "; if (sphere.number == 7) print "strange dark"; else ColorString(sphere.number); print " light."; } else { print ". The dome is filled with ", (DomeText) (sphere.number), "."; if (sphere.number == 7) { if (self.number) { print "^^Among the stars in the "; DirName(self.number); print "ern sky, you see the"; if (CountStars(location) == 1) print " constellation"; else print " constellations"; print " of "; ListStars(location); print "."; } else { print "^^"; NameStars(); } } } } ], number 0, before [; Smell: if (noun == nothing) "The space beneath the dome has an odor of dust, and of distant thunder."; ], u_to "You can't go that way.", d_to "You can't go that way.", cant_go "The dome wall stands in that direction.", coredir d_obj, coredirmod DIRMOD_UNCERTAINPATH; [ DomeText ix; switch (ix) { 1: print "flickering, jittering sparks of patternless white light"; 2: print "tumbling bubbles, each surrounded by a whirling cloud of gold light"; 3: print "shapeless blobs of red light -- each filled with smaller speckles and spots. The blobs flow slowly across the dome, like droplets of red wax in a hot sea"; 4: print "spiralled nets of light, hung with beads in every shade of brown, ochre, and tan. The beads spark and flash, flinging light at each other. The flashing patterns form slow waves that surge and crest across the dome"; 5: print "overlapping disks and lines of green light. They are in constant motion, growing, shrinking, moving apart, collapsing together. Sometimes several link rigidly together, move as one; and then drift apart. Occasionally a disk flares up, or vanishes entirely"; 6: print "blue spheres of light, whirling in the darkness. Each sphere is marked with brown and grey patterns, like maps of an island archipelago"; 7: print "familiar stars"; } ]; Object stellariumfarladder "ladder" with name 'ladder', found_in [; if (location ofclass StellariumRoom) { if (location == StellariumNorth) rfalse; rtrue; } rfalse; ], description "You can see little from here. The ladder is at the north edge of the dome.", before [; Examine: rfalse; default: "The ladder is at the north edge of the dome, far from you."; ], has scenery; Object stellariumfardoorway "doorway" with name 'doorway' 'archway' 'door', found_in [; if (location ofclass StellariumRoom) { if (location == StellariumEast) rfalse; rtrue; } rfalse; ], description "You can see little from here. The doorway is at the east edge of the dome.", before [; Examine: rfalse; default: "The doorway is at the east edge of the dome, far from you."; ], has scenery; CeilingObject stellariumdome with name 'immense' 'dome', short_name "dome", description [; if (sphere.number == 0) { "The dome is a dim blank expanse. Only its edges are washed by a faint colorless light."; } if (projector has open) { print "The dome is filled with "; if (sphere.number == 7) print "strange dark"; else ColorString(sphere.number); " light."; } print "The dome is filled with ", (DomeText)(sphere.number), "."; if (sphere.number == 7) { print " "; 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; ], found_in [; if (location ofclass StellariumRoom) rtrue; rfalse; ], has scenery transparent ~general; Class Constellation with name 'constellation', article "the", before [; Examine: rfalse; default: <>; ], has scenery; Class SkyConstellation with article "the", number 0, short_name [; print (name) self.number; rtrue; ], parse_name [ wd num; if (parser_action == ##TheSame) { return -2; } wd = NextWord(); while (WordInProperty(wd, self.number, name)) { num++; wd = NextWord(); } return num; ], description [; self.number.description(); rtrue; ], before [; Examine: rfalse; default: "It's not within reach."; ], has scenery; Object stellariumstars "stars" with name 'familiar' 'star' 'stars', before [; Examine, Search: <>; default: "The dome's stars are closer than the stars of true night, but you are no more able to reach them."; ], has scenery transparent pluralname; Constellation -> constcloak "Cloak of Night" with name 'cloak' 'of' 'night' 'ragged' 'patch' 'cloth', number StellariumSouth, description [; print "The Cloak of Night is a ragged patch of starless dark, low in the south, just above the horizon. The Lady of Summer leaves it lying there half the year, while she dances. In winter she takes up her cloak to wrap herself, as she sits by the fire to tell stories.^"; if (location == self.number) { print "^The Cloak is low on the dome, just above your head. It seems low enough to touch.^"; } rtrue; ], before [; Search: if (location == self.number) <>; Touch: if (location == self.number) "You reach up, and feel heavy soft cloth."; Take, Pull: if (location == self.number) { remove self; remove skyconstcloak; move cloak to player; PronounNotice(cloak); "You reach up and pull. Heavy, black cloth flows silently down into your arms."; } ]; Constellation -> constcrutch "Crutch" with name 'crutch', number StellariumCenter, description "The Crutch is a bright zig-zag of stars high overhead. King Maijnir the Farsighted quarrelled with his son Walking Boy. He wounded Walking Boy's foot, and then exiled him to walk the boundaries of his kingdom, bearing only rags, tatters, and a crutch of gold."; Constellation -> constmoth "Iron Moth" with name 'iron' 'moth' 'antenna', number StellariumNorth, description "The stars of the Iron Moth hang high in the northern sky. The Moth never sets; it flutters constantly around and around the Utter North, which is always near its bright left antenna. Lodestones are dust from the Moth's wing."; Constellation -> constgalley "Parhu's Galley" with name 'parhu' 'parhu^s' 'galley' 'ruby', number StellariumEast, description "Parhu's Galley is visible to the east. A row of dim stars mark the oars of the galley slaves. Parhu flung himself into the sea and drowned, but he did not rescind his oath, and so his slaves are bound to row forever after Parhu's Ruby, the red star beyond the Galley's prow.", has proper; Constellation -> constgate "Doorstep of Heaven" with name 'doorstep' 'of' 'heaven' 'gate', number StellariumWest, description "The Doorstep of Heaven is a near-perfect circle of stars in the western sky. It marks the gate, or guards the gate, through which the dead travel to the All-Place. Funereal ceremonies always begin when the Doorstep rises, day or night."; Constellation -> constaxe "Southern Axe" with name 'southern' 'ax' 'axe' 'torcova^s' 'hero^s', number StellariumSouth, description [; "An irregular double-curve of stars, high in the south, the Axe takes the form of the traditional southern weapon. The Hero of Torcova lived so close to his axe that the storymongers called it his wife. (Fortunately for them, he ", (emph) "was", " a hero.) When he was mortally wounded at Deven, the axe agreed to die in his place. The Hero remained nameless in Torcova, awaiting the greatest battle to come, and the axe moved towards Heaven."; ]; Constellation -> constwall "Juinua's Wall" with name 'juinua' 'juinua^s' 'wall' 'junorr', number StellariumEast, description "The stars of Juinua's Wall run high above the eastern horizon. Juinua of Junorr was given a prophecy, that her blood would stain the walls of Junorr before her thirtieth year. Instead of tearing down the city wall, she ordered it built higher -- a new course of great stones every year. In her twenty-ninth year, she was crushed by a stone as she supervised the work on the wall. Or, depending who tells the tale, she died giving birth to a stone; or she was murdered by the master builder; or she died of the flux in an overcrowded city street.", has proper; Constellation -> constcows "Bull-and-Cow" with name 'cow' 'bull' 'cows' 'and' 'bull-and-cow' 'jernos' 'seroa', number StellariumCenter, description [; print "The Bull and Cow are small star-groups near the zenith. Jernos desired Seroa, the wife of the Southern king. She turned herself into a sparrow and fled; he turned himself into a horhawk and followed her. Seroa hid herself in many other shapes, but each time Jernos changed into something that could find her. Finally she turned herself into a bull. Jernos turned into a cow, but a cow was too stupid to chase Seroa further. Seroa-the-bull mounted the Jernos-the-cow and sired eight brass calves.^"; if (self hasnt general) { give self general; print "^You've never been quite sure what the moral of that story was supposed to be.^"; } ], has ~general; [ CountStars loc obj count; count = 0; objectloop (obj in stellariumstars) { if (obj ofclass Constellation && obj.number == loc) count++; } return count; ]; [ ListStars loc obj count ix; count = CountStars(loc); ix = 0; objectloop (obj in stellariumstars) { if (obj ofclass Constellation && obj.number == loc) { if (ix > 0) { if (ix < count-1 && count > 2) print ", "; if (ix == count-1) print " and "; } ix++; print (the) obj; } } ]; [ NameStars ix; if (location == StellariumNorth or StellariumSouth or StellariumEast or StellariumWest) { ix = CountStars(location); print "On this side of the sky, you can see the"; if (ix == 1) print " constellation"; else print " constellations"; print " of ", (ListStars) location, ". You can also see"; } else { print "Among the constellations, you can see"; } if (location ~= StellariumNorth) print " ", (ListStars) StellariumNorth, " to the north;"; if (location ~= StellariumEast) print " ", (ListStars) StellariumEast, " to the east;"; if (location ~= StellariumSouth) print " ", (ListStars) StellariumSouth, " to the south;"; if (location ~= StellariumWest) print " ", (ListStars) StellariumWest, " to the west;"; print " and ", (ListStars) StellariumCenter; if (location == StellariumCenter) print " directly above you"; else print " at the zenith"; print "."; ]; [ AdjustStars; if (sphere.number == 7 && projector hasnt open) { if (sphere notin projectorbasket) print "[BUG] adjusting stars without sphere^"; safemove(stellariumstars, stellariumdome); } else { safemove(stellariumstars, nothing); } ]; Artifact cloak "night cloak" with name 'cloth' 'bundle' 'heavy' 'black' 'cloak' 'of' 'night', description [; if (self hasnt worn) print "It's a heavy armful of"; else print "It's an encircling breadth of heavy"; " black cloth. Black, blacker -- blacker than that. But light, like twinkling dust, drifts in the deepest folds."; ], before [; Touch: "You run the heavy cloth through your fingers."; Remove: if (self in player) <>; ], after [; Wear: "You swing the cloak around yourself. It is not so heavy on your shoulders; but warm, very warm."; Disrobe: "You unwrap yourself from the cloak, and fold it into a manageable bundle."; ], has clothing ~worn; ! ---- StellariumRoom StellariumNorth with number n_obj, description [; self.roomtext(); "^^A ladder reaches both upwards and downwards from here, passing through openings in the floor and in the dome's skirt. You can also see a doorway off in the distance, at the far east edge of the dome."; ], d_to [; print "You climb down through a narrow shaft...^"; return OrrerySouth; ], u_to [; print "You climb up, through the dome, and a long way farther...^"; give Lighthouse general; return Lighthouse; ], e_to StellariumEast, se_to StellariumEast, w_to StellariumWest, sw_to StellariumWest, s_to StellariumCenter; Object -> stellariumladder "ladder" with name 'iron' 'bar' 'bars' 'ladder', description "It's a bare ladder, apparently forged from plain bars of iron. It runs down through a hole in the floor, and up through an opening in the dome above you.", before [; Push, Pull, Take, Turn: "The ladder is immovably anchored."; Enter, Climb: "Do you want to go up or down?"; ClimbUp: <>; ClimbDown: <>; ], has scenery; StellariumRoom StellariumEast with number e_obj, description [; self.roomtext(); "^^There is an open archway to the east; beyond it, stairs descend. You can also see a ladder in the distance, at the north edge of the dome."; ], e_to [; if (hall4door hasnt open) { give hall4door open; print "You descend the narrow stairs to a white door, which you push open.^"; } else { print "You descend the narrow stairs.^"; } return Hall4; ], d_to [; <>; ], n_to StellariumNorth, nw_to StellariumNorth, s_to StellariumSouth, sw_to StellariumSouth, w_to StellariumCenter; Object -> stellariumdoorway "doorway" with name 'doorway' 'archway' 'door' 'stair' 'stairs' 'stairway', description "Beyond the archway, stairs descend into darkness.", before [; Enter, Climb: <>; ], has scenery; StellariumRoom StellariumSouth with number s_obj, description [; self.roomtext(); "^^At the east edge of the dome, off in the distance, you can see a doorway. All the way across the dome to the north, a ladder is barely visible."; ], e_to StellariumEast, ne_to StellariumEast, w_to StellariumWest, nw_to StellariumWest, n_to StellariumCenter; StellariumRoom StellariumWest with number w_obj, description [; self.roomtext(); "^^At the north edge of the dome, off in the distance, you can see a ladder. All the way across the dome to the east, a doorway is barely visible."; ], n_to StellariumNorth, ne_to StellariumNorth, s_to StellariumSouth, se_to StellariumSouth, e_to StellariumCenter; StellariumRoom StellariumCenter with number 0, description [; self.roomtext(); "^^In the distance to the east, you can see a doorway; a ladder is visible far to the north."; ], n_to StellariumNorth, s_to StellariumSouth, e_to StellariumEast, w_to StellariumWest, cant_go "You can approach the dome's perimeter to the north, south, east, or west."; Object -> projector "pyramid", with name 'metal' 'low' 'pyramid' 'handle' 'hinge' 'hinges' 'cover', initial [ ix; if (self has open) { print "In the center of the floor sits an odd basket of coiled silver wire"; ix = child(projectorbasket); if (ix) print ". The basket contains ", (a) ix; ". The metal pyramid that covered the basket lies open, leaning to one side."; } "A low metal pyramid stands in the center of the floor. Its surface shines with a dim, oddly shifting gleam. Its base has hinges along one edge, and a handle opposite."; ], description [ ix; print "It's a six-sided pyramid, perhaps a yard across and standing higher than your knee. It seems to be made of metal, but it has a strange sheen -- as if the surface were engraved with countless parallel lines"; if (self hasnt open) { ". Hinges at the base of one edge, and a handle, imply that the pyramid could be pulled open."; } else { print ". The pyramid is leaning open, revealing a basket of silver wire"; ix = child(projectorbasket); if (ix) print ", which in turn contains ", (a) ix; "."; } ], before [; Pull: <>; Push: <>; Take: "The pyramid is fastened to the floor."; Touch, Rub: "The metal seems to hum as you run your fingers across it."; Search: if (self has open) <>; "You cannot see through the pyramid's surface."; Receive: if (receive_action == ##Insert) { if (self hasnt open) print_ret (The) self, " is closed."; <>; } "You can't put anything on ", (the) self, "."; ], after [ ix; Open: AdjustStars(); print "You crouch, seize the handle, and pull. The pyramid swings smoothly to the side, and falls open"; if (self hasnt general) { give self general; print ". It seems to be hollow... strange, then, how heavy it felt.^^Revealed within"; } else { print ". Revealed within"; } print " is a conical basket of coiled wire"; ix = child(projectorbasket); if (ix) print ". The basket contains ", (a) ix; if (ix == sphere) { print "; "; LongColorString(sphere.number); print " light floods out, illuminating the dome and obliterating its images"; } "."; Close: AdjustStars(); print "You heave the pyramid back upright, covering the basket"; ix = child(projectorbasket); if (ix == sphere) { print ". The "; ColorString(sphere.number); print " light from the sphere is cut off; but gradually you see patterns in the darkness above you"; if (sphere.number == 7) print ".^^The dome is now"; else print ". The dome is"; print " filled with "; DomeText(sphere.number); if (sphere.number == 7) { print ". "; NameStars(); new_line; rtrue; } } "."; ], has static container openable ~open ~general; Object -> -> projectorbasket "silver basket" with name 'silver' 'wire' 'coil' 'coiled' 'basket' 'conical' 'cone', description [ ix; print "It's a small construction of silver wire -- a spiralled cone, mouth-up"; ix = child(self); if (ix) print ". The basket contains ", (a) ix; else print ". The basket is empty"; "."; ], before [ ix; Search: <>; Take: "The silver wire vanishes into the floor, fastening the basket down."; Touch, Rub: if (sphere.number) { if (glove hasnt worn) "Ow! You yank back your hand and rub stinging fingers. The silver wire isn't exactly ", (emph) "hot,", " but touching the basket is a burning, humming sensation, which would surely turn to pain if prolonged a moment more."; rfalse; } "The silver wire is inert."; Receive: if (LargeObject(noun)) print_ret (The) noun, " won't fit into the basket."; ix = child(self); if (ix) "There's no room, since ", (the) ix, " is already occupying the basket."; LetGo: if (noun == sphere) { if (glove hasnt worn) <>; } Empty, EmptyT: "I'm not sure what you mean."; ], after [; Receive: if (noun == sphere) { if (sphere.number ~= 0) print "[BUG] sphere improperly nonzero^"; sphere.number = 1; give self general; StartDaemon(self); print "As you drop the grey sphere into the basket, its glassy surface flares with a brilliant white light"; if (glove hasnt worn) print ". A humming sensation stings your fingers, and you hastily jerk them back"; "."; } LetGo: if (noun == sphere) { if (sphere.number == 0) print "[BUG] sphere improperly zero^"; sphere.number = 0; StopDaemon(self); "With your gloved hand, you pluck the sphere from the basket. Almost immediately, its light fades, leaving a dim grey glassiness.^^ The great dome sinks into darkness."; } ], daemon [; if (self has general) { give self ~general; } else { sphere.number = sphere.number+1; AdjustStars(); if (sphere.number >= 7) StopDaemon(self); } if (location ofclass StellariumRoom) { if (sphere.number == 1) { if (projector hasnt open) print "^The dome shimmers with light.^"; else print "^You shield your eyes as the dome is flooded with light.^"; return; } if (projector hasnt open) { print "^The images above you slowly change. The dome now contains ", (DomeText) (sphere.number), "."; if (sphere.number == 7) { print " "; NameStars(); } new_line; } else { print "^The light from"; if (location == StellariumCenter) print " the sphere"; else print " the center of the dome"; print " fades smoothly to a "; if (sphere.number == 7) print "strange, eye-hurting darkness"; else LongColorString(sphere.number); print ".^"; } return; } ], has scenery container open ~general; ! ---- Object Lighthouse "Translucent Dome" with description [; print "You are in a small round dome"; if (self has general) { give self ~general; print ", much smaller than the vast dark space below"; } print ". The curving surface is translucent"; if (bonfire.number) { print "; the light outside seems to be shifting rapidly"; } else { switch (weather) { DAYTIME: print ", bright with the daylight filtering in from outside"; NIGHTTIME: print ", but unlit; the world outside seems to be dark"; DREAMTIME: print ", lit with an eerie red glow"; } } print ". The floor beneath your feet is a harsh metal grating. The ladder runs from a hole in the grating, near the south side, up to a matching opening in the dome above"; "."; ], u_to [; if (bonfire.number) { switch (weather) { DAYTIME: print "Light returns to the sky as you climb.^"; NIGHTTIME: print "The sky fades to night as you climb.^"; DREAMTIME: print "A peculiar red glow spreads across the sky as you climb.^"; } bonfire.number = 0; } else { switch (weather) { NIGHTTIME: print "You climb up and out, into the night.^"; DREAMTIME: print "You climb up and out, into an alien sky.^"; gardenskydream.modetext(); default: print "You climb up and out.^"; } } return CatwalkSouth; ], d_to [; print "You descend.^"; return StellariumNorth; ], out_to [; <>; ], s_to "The ladder is at the south edge of the dome, but the only ways out are up and down.", cant_go "The only ways out are up and down.", before [; Smell: if (noun == nothing) <>; ], hinto HintoBonfire, coredir d_obj, coredirmod DIRMOD_FAR, has general; FloorObject -> lighthousefloor with short_name "grating", name 'harsh' 'metal' 'grating' 'grate'; CeilingObject -> lighthousedome with short_name "white dome", name 'translucent' 'dome' 'white', description [; if (bonfire.number) "The light outside the dome is shifting, unnaturally fast."; switch (weather) { DAYTIME: "Daylight gives the dome a soft white glow, although you can see nothing outside."; NIGHTTIME: "The dome is dimmed now. Firelight snaps its reflections within the curved surface; but behind that is a quiet darkness."; DREAMTIME: "An eerie, shifting red light penetrates the dome from outside. The blue radiance of the bonfire flickers in reflection within the curved surface. The contrast is nothing you have ever before seen."; } ], before [; Search: <>; ]; Object -> lighthouseladder "ladder" with name 'iron' 'bar' 'bars' 'ladder', before [; Examine: <>; Push, Pull, Take, Turn: "The ladder is immovably anchored."; Enter, Climb: "Do you want to go up or down?"; ClimbUp: <>; ClimbDown: <>; ], has scenery; Object -> lighthouseplatform "low platform" with name 'low' 'platform', before [; Examine, Search: <>; Receive, Enter: "There's no room; the platform is entirely filled with wood."; LookUnder: "The platform rests directly on the floor."; BerryBurn: <>; BerryFreeze: <>; ], has scenery; Object -> bonfire with name 'bonfire' 'pile' 'heap' 'of' 'wood' 'firewood' 'split' 'length' 'lengths', short_name [; if (weather == NIGHTTIME) print "burning "; if (weather == DREAMTIME) print "blazing "; print "heap of wood"; rtrue; ], parse_name [ wd num; wd = NextWord(); while (WordInProperty(wd, self, name) || (weather ~= DAYTIME && (wd == 'fire' or 'flame' or 'burning' or 'blazing' or 'blaze'))) { num++; wd = NextWord(); } return num; ], initial [; print "A low platform fills the center of the floor"; switch (weather) { DAYTIME: ". The platform is piled high with split lengths of wood."; NIGHTTIME: ". Upon it is a blazing bonfire. Its heat fills the dome, hot enough to sting on the skin."; DREAMTIME: ". Upon it is a bonfire, blazing in strange shades of blue. An icy chill radiates from the flames."; } ], description [; switch (weather) { DAYTIME: "The wood is laid out in an immense, semicircular heap. It looks like nothing so much as a bonfire, ready for the spark."; NIGHTTIME: "The wood blazes away, filling the dome with light, heat, and smoke."; DREAMTIME: "The wood blazes with blue and indigo flames. The cerulean light radiates through the dome, carrying a lancing, numbing chill. Wisps of white fog roll slowly from the platform."; } ], before [; Touch: switch (weather) { NIGHTTIME: "You cannot even approach the heat of the fire."; DREAMTIME: "You cannot even approach the numbing cold of the bonfire."; } Smell: switch (weather) { NIGHTTIME: "The air is filled with woodsmoke."; DREAMTIME: "The air is filled with a sharp, raw chill."; } Take, Push, Pull: if (weather ~= DAYTIME) <>; "The lengths of wood are cut too long and heavy to move easily."; Receive: if (noun == torch) { switch (weather) { DAYTIME: if (torch has light) { ChangeWeather(NIGHTTIME); self.invoke(); "You thrust the torch into the heaped wood. The wood crackles, slow to catch... but, after a few moments, a tongue of flame is licking up through the pile.^^ A few moments more, and the heap is a roaring bonfire. You blink, turning from the intense heat."; } NIGHTTIME: if (torch has light) { "The torch's flame has no effect on the blazing bonfire."; } give torch light; "You thrust the torch into the bonfire. The straw catches alight instantly."; DREAMTIME: if (torch has light) { give torch ~light; "You thrust the torch into the blue blaze. The straw crackles and is instantly extinguished."; } "You thrust the torch into the blue blaze. Frost crackles on the straw, but it does not seem able to catch the strange fire."; } } if (weather == DAYTIME) "There's no good place on the heap of wood to place anything."; else "Burning ", (the) noun, " would be a waste."; LookUnder, Search: "You can't see anything under the wood except the platform."; Blow: if (weather == DAYTIME) rfalse; "Your breath has no effect on the roaring fire."; BerryBurn: switch (weather) { DAYTIME: ChangeWeather(NIGHTTIME); self.invoke(); "You toss the orange berry into the heaped wood. It bursts and flares, spattering sparks of fiery juice. The wood crackles, slow to catch... but, after a few moments, a tongue of flame is licking up through the pile.^^ A few moments more, and the heap is a roaring bonfire. You blink, turning from the intense heat."; NIGHTTIME: "You toss an orange berry into the fire. It explodes violently, even before it reaches the first glowing length of wood."; DREAMTIME: ChangeWeather(NIGHTTIME); self.invoke(); "You toss a orange berry into the flickering blue flames. It bursts in their chill touch, spattering sparks of fiery juice. The wood crackles for a moment... but then honest yellow flames are spreading through the indigo.^^ A few moments more, and the heap is roaring with ordinary fire. The heat quickly banishes the air's chill."; } BerryFreeze: switch (weather) { DAYTIME: rfalse; NIGHTTIME: ChangeWeather(DREAMTIME); self.invoke(); "You toss a white berry into the bonfire. An odd blue light crackles across the burning wood. And the fire ", (emph) "changes.", "^^Blue and indigo flames dance across the wood, snap in the air, flash as high as the dome's apex. The embers burn turquoise and emerald. The heart of the bonfire is a dim, aching violet. And a piercing, insistent ", (emph) "chill", " radiates from the flames -- numbing your skin and frosting your breath."; DREAMTIME: "You toss a white berry into the flickering blue flames. It seems to crackle, clear as ice for just a moment, before snapping into a cloud of colorless motes of light. They dance in the blue fire and are gone."; } ], number 0, invoke [; self.number = 4; StartDaemon(self); ], daemon [; self.number--; if (self.number <= 0) { self.number = 0; StopDaemon(self); } if (location == Lighthouse) { switch (weather) { NIGHTTIME: switch (self.number) { 2: print "^The quality of the light outside changes subtly.^"; 1: print "^The light which filters through the dome is fading.^"; 0: print "^The illumination outside the dome has gone entirely. Only the bright yellow firelight remains.^"; } DAYTIME: switch (self.number) { 2: print "^The quality of the light outside changes subtly.^"; 1: print "^Normal daylight begins to filter through the dome.^"; 0: print "^The dome is brightly lit now, as if it were full day outside.^"; } DREAMTIME: switch (self.number) { 2: print "^The quality of the light outside changes subtly.^"; 1: print "^An eerie red light begins to filter through the dome.^"; 0: print "^The dome is lit from outside by an unsettling, shifting crimson glow.^"; } } } ], has static; Object -> sail "tall copper triangle" with name 'beaten' 'copper' 'tall' 'triangle' 'curved' 'sail' 'sheet', description [; print "It is a thin sheet of hammered copper, as wide at the base as your outstretched arms. The sheet tapers as it rises, curving inward as it hugs the dome's inner surface. Its peak is halfway up the dome. The shape reminds you of a billowing sail.^^ The copper triangle stands to the "; DirIName(self.number); if (self.number == 2) print ", behind the ladder"; ", but its base rests in a narrow track that runs all the way around the dome."; ], number 0, initial [; print "A tall triangle of beaten copper rises along the "; DirIName(self.number); " side of the dome."; ], before [; Take: "The triangle is much taller than you. Besides, it seems to be secured in its track."; Push, Turn: return self.invoke((self.number+1) % 4); Pull: return self.invoke((self.number+3) % 4); Transfer, Insert, PushDir: switch (second) { n_obj: return self.invoke(0); e_obj: return self.invoke(1); s_obj: return self.invoke(2); w_obj: return self.invoke(3); } Attack: "The copper resonates dully."; Touch: switch (weather) { DAYTIME: print "Cool"; NIGHTTIME: print "Warm"; DREAMTIME: print "Icy"; } ", faintly oily metal."; LookBehind: "There is nothing in the narrow space between the copper and the dome."; ], invoke [ pos; if (pos < 0 || pos >= 4) "[BUG] moving triangle to ", pos, ".^"; if (pos == self.number) { print "The triangle is already on the "; DirIName(self.number); " side of the dome."; } self.number = pos; SweepOffShadowPath(); if (self hasnt general) { give self general; print "You reach wide to grasp the sail's edge, and give an experimental shove. You were right -- it slides along the track, although the motion is stiff and the track squeals painfully. With some effort, you"; } else { print "You"; } print " drag the triangle sideways around the dome, until it stands on the "; DirIName(self.number); " side."; ], has static ~general; Object -> lighthousetrack "track" with name 'narrow' 'circular' 'track', description [; print "A narrow circular track runs around the room, a bare finger's width from the dome's lower edge. The copper sail rests in this track on the "; DirIName(sail.number); " side of the dome."; ], before [; Search: "The track is shallow; you can see nothing inside."; ], has scenery; Object lighthousesmoke "smoke" with name 'smoke' 'woodsmoke', description "Smoke courses from the bonfire and pools at the top of the dome. But now that you look, there does seem to be less smoke than you would expect, for a fire this large.", before [; Examine: rfalse; Search: <>; Smell: <>; default: "The smoke is impalpable."; ], has scenery; Object lighthousefog "fog" with name 'wisp' 'wisps' 'white' 'fog' 'mist', description "White fog rolls slowly from the bonfire, spreads across the platform, and pours in faint wisps down to the floor.", before [; Examine: rfalse; Search: <>; Smell: <>; default: "The fog is impalpable."; ], has scenery; Object HintoBonfire with hint_name "igniting the wood", hint_suppress [; if (weather ~= DAYTIME) rtrue; ], count 0, description [; if (self.count & $1 == 0) { self.count = self.count | $1; print "The unlit pile of wood"; if (location ~= Lighthouse) print " inside the dome"; print " is, at the very least, an attractive nuisance."; return 2; } if (GardenWarm hasnt visited) { print "You have not yet found the means to solve this puzzle. Keep exploring, and come back here later."; rtrue; } if (warmberries has general || torch has light) { print "Any portable source of intense heat will serve to light the wood on fire."; rtrue; } print "The orange berries you found in the garden are a source of extreme heat. They'll serve to light the wood on fire, if you can carry the berries -- or their heat -- to the dome."; rtrue; ];