Object OrreryNorth "North Alcove" with description "This is a small, curved alcove, off a large chamber to the south. An archway to the north reveals a flight of ascending stairs.", n_to [; if (hall1door hasnt open) { give hall1door open; print "You ascend the narrow stairs to a white door, which you pull open.^"; } else { print "You ascend the narrow stairs.^"; } return Hall1; ], u_to [; <>; ], s_to Orrery, in_to Orrery, cant_go "The only ways out are south, into the main chamber, and up the stairs.", each_turn [; if (orrerymaskobj in player) ReminisceOrreryMask.invoke(); ], coredir u_obj, coredirmod DIRMOD_UNCERTAINPATH; Object -> orrerynorthdoorway "doorway" with name 'doorway' 'archway' 'door' 'stair' 'stairs' 'stairway', description "Beyond the archway, stairs ascend into darkness.", before [; Enter, Climb: <>; ], has scenery; Object OrrerySouth "South Alcove" with description "This is a small, curved alcove, off a large chamber to the north. A plain iron ladder leads up through a shaft.", u_to [; print "You swing onto the ladder and climb.^"; return StellariumNorth; ], n_to Orrery, in_to Orrery, cant_go "The only ways out are north, into the main chamber, and up the ladder.", each_turn [; if (orrerymaskobj in player) ReminisceOrreryMask.invoke(); ], coredir u_obj, coredirmod DIRMOD_UNCERTAINPATH; Object -> orrerysouthladder "ladder" with name 'iron' 'bar' 'bars' 'ladder' 'plain' 'shaft' 'opening', description "It's a bare ladder, apparently forged from plain bars of iron. It runs up through an opening in the ceiling.", before [; Enter, Climb: <>; ], has scenery; Object orrerydistantchamber "chamber" with name 'main' 'chamber', found_in OrrerySouth OrreryNorth, before [; Enter: if (location == OrrerySouth) <>; else <>; default: print "The chamber is to the "; if (location == OrrerySouth) print "north"; else print "south"; "."; ], has scenery; Object orrerydistantmachine "orrery" with name 'machine' 'orrery' 'vast' 'engine' 'great' 'brass' 'disc' 'disk', article "an", found_in OrrerySouth OrreryNorth, description "A huge gleaming engine, centered around a great brass disk, rotates in the main chamber. You cannot see it well from the alcove.", before [; Examine: rfalse; Listen: <>; default: print "The machine is in the chamber to the "; if (location == OrrerySouth) print "north"; else print "south"; "."; ], each_turn [ ix; if (self hasnt general) { give self general; print "^A vast machine spins endlessly in the chamber to the "; if (location == OrrerySouth) print "north"; else print "south"; print ".^"; } else { ix = random( "The machine continues its turning.", "The machine clatters and whirrs.", "The machine spins on.", "The machine hums through new configurations.", "The machine revolves." ); print "^", (string) ix, "^"; } ], has scenery ~general; ! ---- Class GlobeClass with name 'globe' 'sphere' 'glass', before [; Search: "The globe seems to be hollow."; ], has scenery; Class CloneGlobeClass with 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(); if (self.modetext) self.modetext(); rtrue; ], modetext 0, has scenery; Class DistantGlobeClass class CloneGlobeClass, with cant_go [; print_ret (The) self, " is not within reach."; ], before [; Examine: rfalse; Search: "The globe seems to be hollow."; default: return self.cant_go(); ]; CeilingObject orreryceiling with found_in OrreryOnSilver OrreryOnBlue OrreryOnGreen, description [; print "The vault above the machine is lost in shadow.^"; if (distantbelt in self) { if (location == Orrery) { print "^You can make out something grey hanging above the machine.^"; } else { new_line; distantbelt.description(); } } rtrue; ], has transparent; Object -> distantbelt "grey strip" with name 'grey' 'gray' 'strip' 'belt' 'cord' 'hanging' 'of' 'soft' 'material' 'leather', description [; give self general; print "A strip of some grey material is hanging above the upper edge of the rotating brass disk"; if (location == OrreryOnSilver && brassmachine.number == 3) { print ", just out of reach"; } if (location == OrreryOnGreen && brassmachine.number == 0) { if (copperwheel.number ~= 2 or 3) print ", just out of reach"; else print ", just within reach"; } "."; ], before [; if (action == ##Examine) rfalse; if (location == Orrery) { "The grey strip is above you, far out of reach."; } if (location == OrreryOnSilver && brassmachine.number == 3) { print "The silver wheel is passing just below the grey strip. But the ring you cling to is"; if (silverwheel.number == 3) print " not yet at the machine's outer edge"; else print " no longer at the machine's outer edge"; ". The strip remains out of reach."; } if (location == OrreryOnSilver && brassmachine.number == 2) { "The silver wheel has not yet reached the highest part of the machine. You cannot reach the strip."; } if (location == OrreryOnSilver && brassmachine.number == 4) { "The silver wheel is no longer at the highest part of the machine. You cannot reach the strip."; } if (location == OrreryOnBlue) { "The grey strip hangs above the top edge of the brass disk. It is well out of reach from your perch at the center."; } if (location == OrreryOnGreen) { if (brassmachine.number == 5 or 1) { print "The copper wheel"; if (brassmachine.number == 5) print " has not yet reached"; else print " is no longer at"; " the highest part of the machine. You cannot reach the strip."; } if (brassmachine.number == 0) { if (copperwheel.number ~= 2 or 3) { print "The copper wheel is passing just below the grey strip. But the sphere you cling to is not at the machine's outer edge"; ". The strip remains out of reach."; } switch (action) { ##Touch, ##Pull, ##Take: if (parent(belt)) "[BUG] Belt already present."; remove self; move belt to player; PronounNotice(belt); "From your unstable perch, you reach up... and touch soft, heavy leather. It comes free with no effort at all. You snatch wildly, and manage to keep the grey strip from slithering away from you."; } rfalse; } } "The grey strip is above you, well out of reach."; ], each_turn [; if (self hasnt general) { if (location == OrreryOnSilver && (brassmachine.number == 0 or 1 or 5)) return; give self general; print "^You catch sight of something hanging in the gloom above the machine. It looks like a grey cord, or strip, of some soft material. It dangles directly over the topmost edge of the great, inclined brass disk.^"; } ], has scenery ~general; Artifact belt "grey leather belt" with name 'grey' 'gray' 'strip' 'belt' 'heavy' 'of' 'soft' 'material' 'leather', description [; if (self has worn) print "You are wearing"; else print "It's"; " a belt of soft, heavy, worn grey leather. Tiny dark stitches trace a pattern of curved feathers, or perhaps scales, across the leather -- frayed in places, but still visible."; ], before [; Touch: "Ancient, napped, mouse-soft leather."; Tie: if (second == player or nothing) <>; Untie: <>; Remove: if (self in player) <>; ], after [; Wear: print "You wrap the belt around your waist"; if (cloak has worn) print ", under the cloak"; ", and tie the ends loosely."; Disrobe: "You untie the grey belt."; ], has clothing ~worn; ! ---- Object Orrery "Orrery" with initial [; WitnessMask(orrerymaskobj); if (brassmachine hasnt general) { give brassmachine general; StartDaemon(brassmachine); } give orreryfarmaskeasy general; give orreryfarmaskhard general; ], description "You stand in a wide, tall, and dimly lit chamber. It has six sides; smaller alcoves open to the north and south.", n_to OrreryNorth, s_to OrrerySouth, cant_go "The only ways out are the alcoves to the north and south.", before [; Listen: if (noun == nothing) <>; ], hinto HintoOrrery, coredir u_obj, coredirmod DIRMOD_UNCERTAINPATH; CeilingObject -> orreryfloorceiling with description "The vault above the machine is lost in shadow."; Object -> brassmachine "orrery" with name 'machine' 'orrery' 'vast' 'engine' 'great' 'brass' 'disc' 'disk', article "an", initial [; "The chamber is dominated by a vast machine: an engine of gears, shafts, and clattering motion. It is primarily a great stately disk of brass which turns on a tilted axis. Smaller wheels pirouette on the disk's face, bearing globes of delicate glass in their complicated courses."; ], description [; print "The brass disk nearly fills the room. It rises at a sharp angle; its lower edge is a few inches above the floor, but the opposite edge approaches the high roof. Intricate arcs and lines are engraved across its surface, measuring you know not what. The disk turns with a slow, steady rotation.^^"; print "A large globe of blue glass is embedded at the disk's center. The globe bears a delicate pattern of brown and white, like a map of islands in an impossible curved sea. The globe is fixed; the disk rotates around it.^^"; print "A silver wheel makes its own revolutions on the "; self.modetext(self.number); print " side of the disk. Opposite it, on the "; self.modetext(self.number, 3); print " side, a copper wheel turns. The wheels are also carried slowly around with the great disk's motion. Each wheel bears its own colored globes"; "."; ], before [; Take: "It must weigh tons."; Turn, Pull, Push: "You cannot stop, or even slow, the engine's motion."; SwitchOn, SwitchOff: "You have no idea how to turn the machine off."; Touch: "The brass brushes ceaselessly past your fingers."; Listen: "The engine clanks, clatters, whirrs."; Enter, Climb: "The brass disk is too steeply angled and too smooth to climb. Even if it were still, you could not find a grip."; ], number 0, ! of 6 modetext [ pos inc; if (pos < 0) { pos = pos+6; } pos = (pos+inc) % 6; switch (pos) { 0: print "lower"; 1: print "lower left"; 2: print "upper left"; 3: print "upper"; 4: print "upper right"; 5: print "lower right"; default: print "[BUG]"; } ], daemon [ ix; self.number = (self.number+1) % 6; silverwheel.number = (silverwheel.number+1) % 4; copperwheel.number = (copperwheel.number+1) % 5; if (location == Orrery) { switch (self.number) { 0: print "^The copper wheel spins past the highest point of the great disk. The silver wheel is at the lowest"; if (silverwheel.number == 0) { print ". The tan globe, at the nadir of its own revolution around that wheel, is sweeping just inches above the floor"; if (orreryfarmaskeasy in Orrery) { give HintoOrrery general; print ". The mask, fluttering from the tan globe, is now within reach"; } } print ".^"; 1: print "^The great brass disk continues its revolution. The silver wheel is borne out of reach.^"; 3: print "^The silver wheel whirls past the top of its orbit. The copper wheel, opposite it, is at its lowest.^"; 4: print "^The great brass disk continues its revolution. The copper wheel is borne out of reach.^"; default: print "^The great brass disk continues its revolution.^"; } } else if (location == OrreryOnBlue) { ix = 0; switch (self.number) { 0: print "^The copper wheel spins past the highest point of the brass disk, directly above you. The silver wheel, opposite it, is directly below"; ix = 1; 3: print "^The silver wheel spins past the highest point of the brass disk, directly above you. The copper wheel, opposite it, is directly below"; ix = 1; } if (silverwheel.number == 2 || copperwheel.number == 0) { if (ix == 0) print "^"; else print ". "; if (silverwheel.number == 2 && copperwheel.number == 0) print "The tan globe and the green globe are both swinging past the heart of the machine"; else if (silverwheel.number == 2) print "The tan globe, carried on the silver wheel's rotation, is swinging past you"; else if (copperwheel.number == 0) print "The green globe, carried on the copper wheel's rotation, is swinging past you"; else print "[BUG]"; ix = 1; } if (ix == 0) print "^The brass machine revolves remorselessly around you"; print ".^"; } else if (location == OrreryOnSilver) { switch (self.number) { 0: print "^The silver wheel swings past the lowest point of the great disk"; if (silverwheel.number == 0) print "; your feet touch the floor"; else print "; but the tan globe is turned inwards, holding you above the floor"; print ".^"; 1: print "^The silver wheel swings away from the floor.^"; 2: print "^The silver wheel bears you higher.^"; 3: print "^The silver wheel swings past the highest point of the great disk"; if (silverwheel.number == 1) print ". You are not quite at the upper edge, however; the tan globe is rotating towards the center"; if (silverwheel.number == 3) print ". You are not quite at the upper edge, however; the tan globe is still rotating away from the center"; print ".^"; 4: print "^The silver wheel swings away from the ceiling.^"; 5: print "^The silver wheel continues its descent.^"; } } else if (location == OrreryOnGreen) { switch (self.number) { 3: print "^The copper wheel swings past the lowest point of the great disk"; if (copperwheel.number == 2 or 3) print "; you are just above the floor"; else print "; but the green globe is turned inwards, holding you above the floor"; print ".^"; 4: print "^The copper wheel swings away from the floor.^"; 5: print "^The copper wheel bears you higher.^"; 0: print "^The copper wheel swings past the highest point of the great disk"; if (copperwheel.number == 2 or 3) { print ". The green globe is at its outer edge -- nearly at the chamber's roof"; if (distantbelt in orreryceiling) print ". The grey strip may be within reach..."; } else { print ". You are not quite at the upper edge, however; the green globe is turned towards the center"; } print ".^"; 1: print "^The copper wheel swings away from the ceiling.^"; 2: print "^The copper wheel continues its descent.^"; } } ], has static ~general; Object -> silverwheel "silver wheel", with name 'silver' 'wheel', number 0, ! of 4 description [; print "The silver wheel is engraved with spiralling moir@'e metrics. At its center, a globe of violet glass rotates slowly. A smaller globe of tan is carried around the silver wheel's rim with its motion. The tan globe is itself circled with heavy rings of frosted glass.^^"; print "The silver wheel now occupies the "; brassmachine.modetext(brassmachine.number); print " side of the great brass disk, as the engine continues its stately revolution"; switch (self.number) { 0: print ". The ringed tan globe is passing the outermost edge of the brass disk"; if (brassmachine.number == 0) print ", just inches above the floor"; 2: print ". The ringed tan globe is swinging past the center of the brass disk"; if (location ~= OrreryOnBlue) print ", and the blue globe which rests there"; else print ", where you are"; } "."; ], before [; if (action == ##Examine) rfalse; if (brassmachine.number ~= 0) { if (brassmachine.number == 1) "The silver wheel has swung out of reach."; else "The silver wheel is out of reach."; } switch (action) { ##Turn, ##Push, ##Pull: <>; ##Climb, ##Enter: "The silver wheel does not offer enough of a grip to climb."; } ], has scenery; Object -> copperwheel "copper wheel", with name 'copper' 'wheel', number 0, ! of 5 description [; print "The copper wheel is incised with precise radial lines. At its center is a banded globe of red glass. There is a small green globe at the wheel's rim, circling slowly as the wheel turns"; if (location == OrreryOnGreen) print ". You are clinging to the green globe"; print ".^^"; print "The copper wheel now occupies the "; brassmachine.modetext(brassmachine.number, 3); print " side of the great brass disk, as the engine continues its stately revolution"; switch (self.number) { 2: print ". The green globe is approaching the outermost edge of the brass disk"; 3: print ". The green globe has passed the outermost edge of the brass disk"; 0: print ". The green globe is swinging past the center of the brass disk"; if (location ~= OrreryOnBlue) print ", and the blue globe which rests there"; else print ", where you are"; } "."; ], before [; if (action == ##Examine) rfalse; if (brassmachine.number ~= 3) { if (brassmachine.number == 4) "The copper wheel has swung out of reach."; else "The copper wheel is out of reach."; } switch (action) { ##Turn, ##Push, ##Pull: <>; ##Climb, ##Enter: "The copper wheel does not offer enough of a grip to climb."; } ], has scenery; GlobeClass -> blueglobe "blue globe" with name 'blue' 'brown' 'island' 'islands' 'archipelago' 'mottled', description [; print "The blue globe rests, unmoving, at the center of the great brass machine. It is mottled with delicate brown and white patterns -- as if the map of an island archipelago had been painted on a sphere"; if (orreryfarmaskhard in Orrery) { print ". You can see ", (a) orreryfarmaskhard, " sitting jauntily on the globe"; } "."; ], before [; Examine, Search: rfalse; #ifdef ZDEBUG; Zap: rfalse; #endif; default: "The blue globe is at the center of the brass disk, out of reach."; ]; GlobeClass -> violetglobe "violet globe" with name 'violet' 'swollen' 'glittering' 'streaked', description "At the center of the silver wheel is a swollen globe of glittering violet glass, streaked with silver and black.", before [; Examine, Search: rfalse; default: print "The violet globe is at the center of the silver disk"; if (brassmachine.number == 0) ". The silver disk has spun within reach, but its center is too far away."; else ", out of reach."; ]; GlobeClass -> redglobe "red globe" with name 'red' 'banded' 'band' 'large' 'crimson', description "At the center of the copper wheel is a large globe of red glass. It is banded in every shade and tint -- crimson, rust, scarlet, magenta, rose.", before [; Examine, Search: rfalse; default: print "The red globe is at the center of the copper disk"; if (brassmachine.number == 3) ". The copper disk has spun within reach, but its center is too far away."; else ", out of reach."; ]; GlobeClass -> greenglobe "green globe" with name 'green' 'pocked' 'cratered' 'crater', description [; print "A globe of green glass revolves around the edge of the copper wheel. The green surface is irregularly pocked and cratered"; if (location == OrreryOnGreen) print "; you are hanging on to it as best you can"; print ". The globe is currently"; switch (copperwheel.number) { 0: print " passing the center of the brass disk"; if (location == OrreryOnBlue) print ", where you crouch"; 1: print " swinging outward from the center of the brass disk"; 2: print " approaching the outer edge of the brass disk"; 3: print " receding from the outer edge of the brass disk"; 4: print " approaching the center of the brass disk"; } "."; ], before [; if (action == ##Examine or ##Search) rfalse; #ifdef ZDEBUG; if (action == ##Zap) rfalse; #endif; if (brassmachine.number ~= 3) "The green globe is mounted on the copper wheel, which is out of reach."; if (copperwheel.number ~= 2 or 3) "The copper wheel is within reach, but the green globe is on the wheel's upper side, out of reach."; switch (action) { ##Touch, ##Push, ##Pull: "You brush the rough green glass with your fingers."; ##Climb, ##Enter, ##Take: "You reach up and seize the green globe. But you cannot grasp it firmly enough; it whirls from your grip."; } ]; GlobeClass -> tanglobe "tan globe" with name 'tan' 'ring' 'rings' 'ringed' 'frosted' 'frosty' 'white', description [; print "A globe of tan glass revolves around the edge of the silver wheel. It is currently"; switch (silverwheel.number) { 0: print " passing the outer edge of the brass disk"; if (brassmachine.number == 0 && location == Orrery) print ", near the floor -- within reach"; 1: print " swinging inwards towards the center of the brass disk"; 2: print " passing the center of the brass disk"; if (location == OrreryOnBlue) print ", where you crouch"; 3: print " swinging outward from the center of the brass disk"; } print ". The tan globe is circled by heavy rings of frosty white"; if (orreryfarmaskeasy in Orrery) { print "; you can see ", (a) orreryfarmaskeasy, " caught in the rings"; } else if (location == OrreryOnSilver) { print ", to which you cling"; } "."; ], before [ ix; if (action == ##Examine or ##Search) rfalse; #ifdef ZDEBUG; if (action == ##Zap) rfalse; #endif; if (brassmachine.number ~= 0) "The tan globe is mounted on the silver wheel, which is out of reach."; if (silverwheel.number ~= 0) "The silver wheel is within reach, but the tan globe is on the wheel's upper side, out of reach."; switch (action) { ##Touch, ##Push, ##Pull: "The glass is smooth and warm."; ##Climb, ##Enter, ##Take: print "You grab hold of one of the globe's rings"; if (orreryfarmaskeasy in Orrery) { print ". Your hand knocks ", (the) orreryfarmaskeasy, " loose, and it falls to the floor.^^But the"; remove orreryfarmaskeasy; ix = orreryfarmaskeasy.number; move ix to Orrery; GuideEnqueue("Great... the mask is lying on the floor now, but you're up in the air and rising higher every second. You might want to release the ring, slide down to the floor, and take the mask. Or maybe you want to continue your ride. Up to you."); } else { print ". The"; } print " silver wheel continues merrily on its way... and in seconds your feet leave the floor. You are swinging higher into the air, sprawled across the wheel.^"; PlayerTo(OrreryOnSilver, 1); PronounNotice(onsilvertanglobe); rtrue; } ]; DistantMaskClass -> orreryfarmaskeasy with number orrerymaskobj, description [; print_ret (The) self, " looks like a ", (string) self.number.name_str, " paper cutout of a human face. It seems to be caught in the rings that circle the tan glass globe."; ], before [ ix; Examine: OfferHint(HintoOrrery); rfalse; Take, Touch, Push, Pull: if (brassmachine.number == 0 && silverwheel.number == 0) { remove self; ix = self.number; move ix to Orrery; PronounNotice(ix); "You snatch at ", (the) ix, " as it whips by. You can't get a grip, but you manage to knock the mask free with the tips of your fingers. It flutters silently to the floor."; } OfferHint(HintoOrrery); <>; default: OfferHint(HintoOrrery); print_ret "You cannot reach ", (the) self, " from here."; ], each_turn [; if (self has general) { give self ~general; print "^You notice ", (a) self, " fluttering from one of the glass globes on the machine's wheels.^"; } ], has general; Object HintoOrrery with hint_name orreryfarmaskeasy, hint_suppress [; if (orreryfarmaskeasy notin Orrery) rtrue; ], count 0, description [; if (brassmachine.number == 0 && silverwheel.number == 0) { print "The mask is within reach ", (emph) "right now.", " If you grab it now, you'll get it. If you waste a turn, you'll have to wait for it to swing back around."; rtrue; } if (self has general) { if (self.count & $1 == 0) { self.count = self.count | $1; print "You've seen the mask come within reach; you didn't grab it quickly enough. But the machine appears to have a cyclical motion. If you just keep waiting, the mask should come back around."; return 3; } print "The ", (helpcmd) "wait", " or ", (helpcmd) "z", " command is handy to pass the time."; rtrue; } if (self.count & $2 == 0) { self.count = self.count | $2; print "The machine is complicated, and you may not understand it at first. You should probably watch it for a while, to see what it does on its own, before you start fooling with it."; return 2; } if (self.count & $4 == 0) { self.count = self.count | $4; print "If you have some patience, the mask may come within reach."; return 2; } if (self.count & $8 == 0) { self.count = self.count | $8; print "The ", (helpcmd) "wait", " or ", (helpcmd) "z", " command is handy to pass the time."; return 3; } if (self.count & $10 == 0) { self.count = self.count | $10; print "By the way, you may notice that time does not pass when you ask for a hint. Commands that live outside the game world, like ", (helpcmd) "help", " and ", (helpcmd) "save", ", don't take any game time. On the other hand, ", (helpcmd) "look", " and ", (helpcmd) "inventory", " do take game time, like most actions. The ", (helpcmd) "wait", " command is just an action that takes time without doing anything."; rtrue; } print "The ", (helpcmd) "wait", " or ", (helpcmd) "z", " command is handy to pass the time."; rtrue; ], has ~general; DistantMaskClass orreryfarmaskhard with number orrerymaskobj, description [; print_ret (The) self, " looks like a ", (string) self.number.name_str, " paper cutout of a human face. It's balanced on the blue glass globe at the center of the machine's disk."; ], before [; Examine: rfalse; default: print_ret "You cannot reach ", (the) self, " from here."; ], each_turn [; if (self has general) { give self ~general; print "^You notice ", (a) self, " resting on one of the glass globes, at the center of the machine.^"; } ], has general; DistantMaskClass orreryfarmaskhard2 with number orrerymaskobj, description [; print (The) self, " looks like a ", (string) self.number.name_str, " paper cutout of a human face. It's balanced on the blue glass globe"; switch (brassmachine.number) { 0: print " above you"; 3: print " below you"; default: print " at the center of the brass disk"; } "."; ], before [; Examine: rfalse; default: print_ret "You cannot reach ", (the) self, " from here."; ], has general; MaskClass bluemask with name_wd 'blue', name_str "blue", count 6, description [; self.MaskClass::description(); "^The face shows distant interest."; ]; Constant orrerymaskobj = bluemask; ! ---- Object OrreryOnSilver "Orrery, on Silver Wheel" with description [ theta; theta = (brassmachine.number * 60 + silverwheel.number * 90); theta = ((180 + theta) % 360) - 180; print "You are lying across the tilted face of a wide silver wheel"; switch (brassmachine.number) { 3: print ", terrifyingly high in the air"; 2, 4: print ", high in the air"; 1, 5: print ", well above the floor"; 0: if (silverwheel.number == 0) print ", your legs dragging on the ground"; else print ", just above the floor"; } if (theta > -45 && theta < 45) print ". Above you"; else if (theta > -135 && theta < 135) print ". To one side"; else print ". Below you"; print ", at the center of the wheel, is a large globe of violet glass. A ringed tan globe is directly above you"; if (brassmachine.number == 0 && silverwheel.number == 0) print ". You are gripping one of the rings, which is carrying you relentlessly along"; else print ". Only your grip on one of the rings prevents you from sliding to the ground"; "."; ], u_to "You scrabble with your feet, but you can't get enough purchase to climb.", d_to [; if (brassmachine.number == 0 && silverwheel.number == 0) { print "You release your grip, and roll to your feet.^"; } else { print "You release your grip, and slide helplessly down the face of the machine"; switch (brassmachine.number) { 0: print ". Fortunately it's not far"; 1, 5: print ". Oof"; 2, 4: print ", past the blue globe, and across the floor"; 3: print ", towards the blue globe. You twist desperately... and manage to land, crouching, on the globe's upper surface.^"; if (orrerymaskobj in OrreryOnBlue) print "^", (The) orrerymaskobj, " is resting on the blue globe beside you.^"; PlayerTo(OrreryOnBlue, 1); rtrue; } print ".^"; } PlayerTo(Orrery); rtrue; ], before [; Drop: if ((noun == player) || (noun in parent(player)) || (noun notin player)) rfalse; if (noun has worn) <>; move noun to Orrery; print_ret (The) noun, " slides down the brass disk's incline to the floor."; Go, Inv, Look, Examine, ExamineUp, ExamineDown, Wait: rfalse; Disrobe: "Holding on is hard enough without trying to undress at the same time!"; Exit: <>; default: if (noun == onsilversilverwheel or onsilvercopperwheel or onsilvertanglobe or onsilverbrassmachine or distantbelt) rfalse; if (noun ofclass DistantGlobeClass) rfalse; "You can't manage to do that in your position."; ], cant_go "You're hanging from a glass ring. You aren't exactly free to stroll around.", hinto HintoArtifactArea, coredir u_obj, coredirmod DIRMOD_UNCERTAINPATH; Object -> onsilverbrassmachine "orrery" with name 'machine' 'orrery' 'vast' 'engine' 'great' 'brass' 'disc' 'disk', article "an", description [; return brassmachine.description(); ], before [; Turn: "It turns on its own."; GetOff: <>; Climb: <>; Enter: "You already are."; ], has scenery; Object -> onsilversilverwheel "silver wheel" with name 'silver' 'wheel', description [; return silverwheel.description(); ], before [; Turn: "It turns on its own."; GetOff: <>; Climb: "The silver wheel does not offer enough of a grip to climb."; Enter: "You already are."; ], has scenery; Object -> onsilvertanglobe "tan globe" with parse_name [ wd num; wd = NextWord(); while (WordInProperty(wd, tanglobe, name)) { num++; wd = NextWord(); } return num; ], description [; return tanglobe.description(); ], before [; Search: "The globe seems to be hollow."; GetOff, Drop: <>; Push, Pull, Turn: "The globe is fixed to the wheel."; Touch: "The glass is smooth and warm."; Take: "You're already gripping as hard as you can."; Climb, Enter: <>; ], has scenery; Object -> onsilvercopperwheel "copper wheel" with name 'copper' 'wheel', description [; return copperwheel.description(); ], before [; Examine: rfalse; default: "The copper wheel is out of reach."; ], has scenery; DistantGlobeClass -> onsilverblueglobe with number blueglobe, modetext [; switch (brassmachine.number) { 0: print "^The blue globe is"; if (silverwheel.number == 2) print " directly"; " above you."; 3: "^You are hanging above the blue globe, more or less."; } ], before [; Enter: if (brassmachine.number == 3) <>; ], cant_go "The blue globe is at the center of the brass disk, out of reach."; DistantGlobeClass -> onsilvervioletglobe with number violetglobe, cant_go "The violet globe is at the center of the silver disk, out of reach."; DistantGlobeClass -> onsilvergreenglobe with number greenglobe; DistantGlobeClass -> onsilverredglobe with number redglobe; ! ---- Object OrreryOnBlue "Orrery, on Blue Globe" with description [; print "You are crouching on a globe of blue glass which is suspended at the center of the great brass machine. You cling to the globe's surface, which is patterned in brown and white, as the inclined brass disk rotates dizzyingly around you"; switch (brassmachine.number) { 0: print ". At the moment the silver wheel is on the lower side of the disk, and the copper wheel is above you"; 1, 2: print ". At the moment, the silver wheel is rotating upward around the disk, as the copper wheel descends"; 3: print ". At the moment the copper wheel is on the lower side of the disk, and the silver wheel is above you"; 4, 5: print ". At the moment, the copper wheel is rotating upward around the disk, as the silver wheel descends"; } if (silverwheel.number == 2) print ". Upon the silver wheel, the ringed tan globe has spun within reach"; if (copperwheel.number == 0) print ". Upon the copper wheel, the green globe is revolving past you"; "."; ], d_to [; print "You slip from the sphere and slide down"; if (brassmachine.number == 0) { if (silverwheel.number == 2) { print ". The tan sphere is just below, and you manage to catch hold of its rings once again. Your feet swing painfully around.^"; PlayerTo(OrreryOnSilver, 1); rtrue; } print ", over the silver wheel, past the violet globe, and ", (emph) "thump", " into the floor.^"; } else if (brassmachine.number == 3) { if (copperwheel.number == 0) { print ". The green sphere is just below, and you manage to roll onto it -- although you are now spread-eagled across its rough surface. And rotating gently. How uncomfortable.^"; PlayerTo(OrreryOnGreen, 1); rtrue; } print ", over the copper wheel, past the"; if (copperwheel.number == 1 or 4) print " red globe"; else print " red and green globes"; print ", and ", (emph) "thump", " into the floor.^"; } else { print " the brass face of the machine.^"; } PlayerTo(Orrery); rtrue; ], u_to [; if (brassmachine.number == 3) { if (silverwheel.number == 2) { print "You reach up and grab the tan globe's rings once again.^"; PlayerTo(OrreryOnSilver, 1); rtrue; } "You reach up, but you cannot get enough of a grip on the silver wheel's surface."; } if (brassmachine.number == 0) { if (copperwheel.number == 0) { "You reach up and seize the green globe. But you cannot grasp it firmly enough; it whirls from your grip."; } "You reach up, but you cannot get enough of a grip on the copper wheel's surface."; } "Trying to scramble up the brass incline is just as hopeless here as it was from the ground."; ], before [; Drop: if ((noun == player) || (noun in parent(player)) || (noun notin player)) rfalse; if (noun has worn) <>; move noun to Orrery; print_ret (The) noun, " slides down the brass disk's incline to the floor."; Go, Inv, Look, Examine, ExamineUp, ExamineDown, Wait: rfalse; Disrobe: "Holding on is hard enough without trying to undress at the same time!"; Exit: <>; Take: if (noun == onbluetanglobe or onbluegreenglobe) <>; if (noun == distantbelt) <>; if (noun == orrerymaskobj && noun in self) { remove orreryfarmaskhard; remove orreryfarmaskhard2; move noun to player; "You scoop up ", (the) noun, "."; } "You can't manage to do that in your position."; default: if (noun == onbluesilverwheel or onbluecopperwheel or onbluebrassmachine or onblueblueglobe or distantbelt) rfalse; if (noun ofclass CloneGlobeClass) rfalse; "You can't manage to do that in your position."; ], cant_go "You're crouching on a glass globe. You couldn't even stand up without losing your balance.", hinto HintoArtifactArea, coredir u_obj, coredirmod DIRMOD_UNCERTAINPATH; Object -> onbluebrassmachine "orrery" with name 'machine' 'orrery' 'vast' 'engine' 'great' 'brass' 'disc' 'disk', article "an", description [; return brassmachine.description(); ], before [; Turn: "It turns on its own."; Touch: "The brass brushes ceaselessly past your fingers."; GetOff, ClimbDown: <>; Climb, ClimbUp: <>; Enter: "You already are."; ], has scenery; Object -> onbluesilverwheel "silver wheel" with name 'silver' 'wheel', description [; return silverwheel.description(); ], before [; Touch: "The silver brushes ceaselessly past your fingers."; Enter, Climb: if (brassmachine.number == 3) <>; if (brassmachine.number == 0) <>; "The silver wheel is to one side."; ], has scenery; Object -> onbluecopperwheel "copper wheel" with name 'copper' 'wheel', description [; return copperwheel.description(); ], before [; Touch: "The copper brushes ceaselessly past your fingers."; Enter, Climb: if (brassmachine.number == 0) <>; if (brassmachine.number == 3) <>; "The copper wheel is to one side."; ], has scenery; CloneGlobeClass -> onbluetanglobe "tan globe" with number tanglobe, before [; if (action == ##Examine or ##Search) rfalse; if (silverwheel.number ~= 2) "The silver wheel has swung the tan globe out of reach."; switch (action) { ##Touch, ##Push, ##Pull: "The glass is smooth and warm."; ##Climb, ##Enter, ##Take: print "You reach and grab the tan globe's rings once again. Your body is immediately pulled from the blue globe, and you swing loose across the silver wheel.^"; PlayerTo(OrreryOnSilver, 1); PronounNotice(onsilvertanglobe); rtrue; } ]; CloneGlobeClass -> onbluegreenglobe "green globe" with number greenglobe, before [; if (action == ##Examine or ##Search) rfalse; if (copperwheel.number ~= 0) "The copper wheel has swung the green globe out of reach."; switch (action) { ##Touch, ##Push, ##Pull: "The glass is rough and warm."; ##Climb, ##Enter, ##Take: if (brassmachine.number == 3) <>; "You reach and seize the green globe. But you cannot grasp it firmly enough; it whirls from your grip."; } ]; CloneGlobeClass -> onblueblueglobe "blue globe" with number blueglobe, before [; Search: "The globe seems to be hollow."; GetOff: <>; Push, Pull, Turn, Take: "The globe is fixed, immovable, at the center of the machine."; Touch: "The glass is smooth and warm."; Climb, Enter: "You already are on the globe."; ], has scenery; DistantGlobeClass -> onbluevioletglobe with number violetglobe; DistantGlobeClass -> onblueredglobe with number redglobe; ! ---- Object OrreryOnGreen "Orrery, on Green Globe" with description [ theta; theta = (brassmachine.number * 60 + copperwheel.number * 72); theta = ((180 + theta) % 360) - 180; print "You are lying on a globe of cratered green glass, which rotates inexorably around the edge of a wide copper wheel. You are rotating with it, which is not very pleasant"; if (theta > -45 && theta < 45) print ". Above you"; else if (theta > -135 && theta < 135) print ". To one side"; else print ". Below you"; print ", at the center of the wheel, is a red globe"; print ". The floor is"; switch (brassmachine.number) { 0: print " terrifyingly far below"; 1, 5: print " far below"; 2, 4: print " well below you"; 3: if (copperwheel.number == 1 or 4) print " just below"; else print " immediately below"; } "."; ], u_to "There's no way you can climb from that position.", d_to [; print "You allow yourself to slide off the green globe"; switch (brassmachine.number) { 3: print ". Fortunately it's not far"; 2, 4: print ". Oof"; 1, 5: print ", past the blue globe, and across the floor"; 0: print ", towards the blue globe. You twist desperately... and manage to land, crouching, on the globe's upper surface.^"; if (orrerymaskobj in OrreryOnBlue) print "^", (The) orrerymaskobj, " is resting on the blue globe beside you.^"; PlayerTo(OrreryOnBlue, 1); rtrue; } print ".^"; PlayerTo(Orrery); rtrue; ], before [; Drop: if ((noun == player) || (noun in parent(player)) || (noun notin player)) rfalse; if (noun has worn) <>; move noun to Orrery; print_ret (The) noun, " slides down the brass disk's incline to the floor."; Go, Inv, Look, Examine, ExamineUp, ExamineDown, Wait: rfalse; Disrobe: "Clinging to the glass is hard enough without trying to undress at the same time!"; Exit: <>; default: if (noun == ongreencopperwheel or ongreensilverwheel or ongreengreenglobe or ongreenbrassmachine or distantbelt) rfalse; if (noun ofclass CloneGlobeClass) rfalse; "You can't manage to do that in your position."; ], cant_go "You're lying across a rotating glass globe. You couldn't even stand up without losing your balance.", hinto HintoArtifactArea, coredir u_obj, coredirmod DIRMOD_UNCERTAINPATH; Object -> ongreenbrassmachine "orrery" with name 'machine' 'orrery' 'vast' 'engine' 'great' 'brass' 'disc' 'disk', article "an", description [; return brassmachine.description(); ], before [; Turn: "It turns on its own."; GetOff, ClimbDown: <>; Climb: <>; Enter: "You already are."; ], has scenery; Object -> ongreencopperwheel "copper wheel" with name 'copper' 'wheel', description [; return copperwheel.description(); ], before [; Turn: "It turns on its own."; GetOff: <>; Climb: "The copper wheel does not offer enough of a grip to climb."; Enter: "You already are."; ], has scenery; Object -> ongreensilverwheel "silver wheel" with name 'silver' 'wheel', description [; return silverwheel.description(); ], before [; Examine: rfalse; default: "The silver wheel is out of reach."; ], has scenery; CloneGlobeClass -> ongreengreenglobe with number greenglobe, before [; Search: "The globe seems to be hollow."; GetOff, Drop: <>; Push, Pull, Turn: "The globe is fixed to the wheel."; Touch: "The glass is rough and warm."; Take: "You're already gripping as hard as you can."; Climb, Enter: <>; ]; DistantGlobeClass -> ongreenblueglobe with number blueglobe, modetext [; switch (brassmachine.number) { 3: print "^The blue globe is"; if (copperwheel.number == 0) print " directly"; " above you."; 0: "^The blue globe is below you."; } ], cant_go "The blue globe is at the center of the brass disk, out of reach."; DistantGlobeClass -> ongreenvioletglobe with number violetglobe; DistantGlobeClass -> ongreentanglobe with number tanglobe; DistantGlobeClass -> ongreenredglobe with number redglobe, cant_go "The red globe is at the center of the copper disk, out of reach."; ! ----