! ---- Object LabHall "Iron Corridor" with number 0, helpmode 0, description [; print "This hall is a windowless square tube of dark hammered iron, stretching"; if (self hasnt general) print " south"; else print " north"; print ". Yellow light trembles in a hanging sconce above you"; if (labhallspell in self) ".^^Ahead, the air is mirrored with the privacy spell you left in place. The lamp is reflected in it, again and again, into the seeming distance."; print "; and another ahead, and another, and on. But you cannot see far. The sconces darken and fade in the near distance"; if (self.number == 0 && self hasnt general) print ". You cannot even see the door behind you"; "."; ], s_to [; if (labhallspell in self) "You take a step towards the spell. It knits time back on itself, as you intended it to -- leaving your footstep curling away into the moment before it began."; if (self has general) print "You turn and begin trudging south once again.^"; give self ~general; if (self.number < 32760) self.number++; give self ~visited; return self; ], n_to [; if (self.number == 0) { if (self hasnt general) print "You turn and head back.^"; else print "The wooden door appears ahead, almost startling you. You pass through.^"; give self ~visited; return Study; } if (self hasnt general) print "You turn and head back.^"; give self general; self.number = self.number / 2; return self; ], cant_go [; print "The corridor runs"; if (self hasnt general) " from north to south."; else " from south to north."; ], invoke [; self.helpmode = 1; if (Enlightened) { if (labhallspell has general) return LabAnteroom; move labhallspell to self; return self; } self.number = 0; give self ~general; return self; ], has ~general; Object -> labhallsconces "sconces" with name 'sconce' 'sconces' 'yellow' 'light' 'hanging' 'chain' 'iron' 'bowl' 'bowls' 'lamp' 'lamps', description "Directly above you a plain iron bowl hangs from a chain. You cannot see the contents, but an unsteady yellow light reflects silently from the ceiling. More sconces hang along the corridor, every few feet to the south and north.", before [; Examine: rfalse; Enter: if (LabHall hasnt general) <>; else <>; default: "The sconces are out of reach."; ], has scenery pluralname; WallObject labhallwalls with name 'iron' 'hammered' 'dark' 'tube', found_in LabHall LabAnteroom, description "The walls look like wrought iron -- exactly like the floor and ceiling.", before [; Touch, Rub: "The wall is cold."; Smell: "You detect the faint sharp-sourness of handled iron."; Attack: "There is no reverberation. The iron must be very thick."; ]; Object labhallspell "spell" with name 'privacy' 'spell' 'reflection' 'reflected' 'mirror' 'mirrored' 'air', description "The spell hovers to the south, mindlessly awaiting the approach of some uncrafty explorer. It isn't even smart enough to recognize you, although you could smash it with a thought.", before [; Search: "You see repeated moments of your future. They're not very interesting moments, since the spell is not very complex."; Touch: "You sense the web of thought that you wove -- how long ago? It's a simple enough spell."; Take, Pull: "You tug gently on a strand of thought. But you anchored the spell tightly to the iron walls, and it will not move."; Listen: "You hear yourself, however long ago, binding the spell's thoughts into place."; Push, Attack, Untie, Open, Cut: print "You reach into the spell, grasp a strand of the thought you bound into it, and ", (emph) "snap.", " The spell unweaves neatly.^^", (emph) "~The work was well enough, for an offhand guard spell.~", " You shrug off the reflexive criticism. Far more interesting work awaits.^"; give self general; PlayerTo(LabAnteroom); rtrue; ], has scenery ~general; ! ---- Object LabAnteroom "Iron Passage" with description [; print "You are in a short connecting passage, walled in hammered iron. A heavy wooden door stands"; if (labantedoor hasnt open) print " closed"; " to the north; to the south is a large chamber. A single sconce hangs above your head."; ], n_to [; if (labantedoor hasnt open) "The wooden door is closed."; return labantedoor; ], s_to Laboratory, cant_go "You can go north or south."; Object -> labantedoor "door" with name 'door' 'heavy' 'wood' 'wooden' 'iron', description [; print "The door is of heavy wooden planks strapped with iron. The door is"; if (self has open) " open."; else " closed."; ], door_dir n_to, door_to Study, before [; Lock, Unlock: "The door has no lock on this side."; Receive: if (noun ofclass KeyClass && receive_action == ##Insert) { <>; } Attack: if (self has open) print_ret (The) self, " is open."; "No answer."; ], has door openable open scenery; Object -> labantesconce "sconce" with description "Directly above you a plain iron bowl hangs from a chain. You cannot see the contents, but an unsteady yellow light reflects silently from the ceiling.", parse_name [ wd num; wd = NextWord(); while (WordInProperty(wd, labhallsconces, name)) { num++; wd = NextWord(); } return num; ], before [; Examine: rfalse; default: "The sconce is out of reach."; ], has scenery; ! ---- Object Laboratory "Laboratory" with initial [; AdjustMural(); if (labscale in self) StartDaemon(labscale); ], description "You stand in a chamber built of massive squared stones. The only exit is a plain doorway in the north wall. Shelves line the east side of the room; the opposite wall is painted with an elaborate mural. Between them, a worktable -- a single heavy granite slab, cluttered with the tools of your work.", n_to [ obj num; objectloop (obj in player) { give obj ~workflag; } obj = nothing; num = 0; if (resin in player) { obj = resin; num = num+1; give resin workflag; !move resin to labtable; } if (dustjar in player) { obj = dustjar; num = num+1; give dustjar workflag; !move dustjar to labtable; } if (flask in player && (~~FlaskIsInk())) { obj = flask; num = num+1; give flask workflag; !move flask to labtable; } if (num) { print "You are wary of carrying"; switch (obj) { flask: print " experimental equipment"; default: print " volatile reagents"; } print " out of the laboratory"; if (FlaskIsInk()) print ". You are eager to try the flaskful of ink, but you'd better leave "; else print ". Better leave "; WriteListFrom(child(player), DEFART_BIT + TERSE_BIT + ENGLISH_BIT + WORKFLAG_BIT); " behind."; !print ". You leave"; !if (num == 1) ! print " ", (the) obj; !else ! print " them"; !print " on the table on your way out.^"; } return LabAnteroom; ], out_to [; <>; ], cant_go "The only way out is to the north."; CeilingObject -> labceiling with name 'worm' 'worms' 'illumination', description "Tiny worms of light crawl across the ceiling tiles, providing an illumination which is colorless, even and only slightly squirmy. You decide, as you often do, to come up with a better light source soon."; FloorObject -> labfloor with name 'flagstone' 'slate' 'broad' 'black', description "Broad flagstones of black slate pave the chamber. They are laid not quite flat; the floor slopes down, very slightly, to a drain under the worktable.", before [; Search: <>; ]; WallObject -> labwalls with name 'massive' 'square' 'squared' 'stones', description "The walls are plain and undistracting. Their only decoration is the mural."; Object -> labshelves "shelves" with name 'shelf' 'shelves', description "You need nothing from the shelves right now; and so they are obligingly empty.", before [; Search, Empty: <>; Receive: "You don't need to put ", (thatorthose) noun, " away."; ], has scenery pluralname; Object -> mural "mural" with name 'mural' 'elaborate' 'angular' 'figure' 'painted', description [ val; print "The mural is stylized but finely detailed. You wonder once again at its origin... it was here when you built the room. Such things are inevitable in a house such as yours. But you still wonder.^^"; print "The angular figure is painted against a red sky -- dawn or dusk, you've never been sure. It strides confidently forward"; if (muralsymbol in self) print " towards a curious sign: a recircled orb, marked with the astrological symbol of the Doorstep of Heaven.^^"; else print ", towards some unknown destination. "; if (muralcloak in self || muralbelt in self) { print "The figure wears"; if (muralcloak in self) { print " a black cloak"; if (muralbelt in self) print ", open enough to show a silver snakeskin belt beneath"; } else { if (muralbelt in self) print " a silver snakeskin belt"; } if (muralgauntlet in self) print ", and a heavy gauntlet which might be leather"; } else { print "The figure's garb is plain"; if (muralgauntlet in self) print ", although it wears a heavy gauntlet which might be leather"; } if (muralshield in self || muralbracer in self) { if (muralshield in self) print ". Slung on one shoulder is a small, decorative shield"; if (muralbracer in self) { if (muralshield in self) print "; the other arm"; else print ". One arm"; print " bears a dark bracer or wristlet"; } } if (muraldagger in self) { print ". The figure holds a black dagger outstretched in its"; if (muralgauntlet in self) print " gauntlet"; else print " hand"; } if (muralthread in self) { if (muraldagger in self) print ". The other hand"; else print ". One hand"; print " holds high an intricately knotted thread; and the figure's eyes are fixed upon this, as if upon a map or the key to a riddle"; } print ".^"; ! The figure wears a black cloak, open enough to show ! a silver snakeskin belt beneath, and a heavy gauntlet ! which might be leather. Slung on one shoulder is a small, ! decorative shield; the other arm bears a dark bracer ! or wristlet. The figure holds a black dagger outstretched in ! its gauntlet. The other hand holds high an intricately knotted ! thread; and the figure's eyes are fixed upon this, as if ! upon a map or the key to a riddle.^"; val = 0; if (muralsymbol in self) val = Regalia(); switch (val) { 2: print "^You look upon the painted figure, and then upon yourself, in satisfaction.^"; 1: print "^You look upon the painted figure, and then upon your possessions. All present; but they're not properly arrayed.^"; } rtrue; ], before [; Search: <>; Touch: "It's only paint."; BerryBurn, BerryFreeze, Attack, Rub: "But you like the mural."; ], has scenery transparent; Object -> labdrain "drain" with name 'drain' 'hole' 'small', description "You see a small hole in the floor, beneath the worktable. The rim is slightly stained from all the various concoctions and alchemic mistakes you've poured down it.", before [; Search, LookUnder: "Nothing is in the drain. Nothing ", (emph) "can", " be in the drain; you created it with the intent of disposing of volatile alchemic substances. It accomplishes that excellently well."; Receive: if (noun == resin) { remove noun; "You toss the lump into the drain, which swallows it silently."; } "You don't want to throw ", (thatorthose) noun, " away."; BerryBurn: print "You drop an orange berry into the drain. It vanishes with"; if (self.number & 2) { self.number = 0; " an unnerving rumble. Maybe that disposal effect isn't perfect after all."; } self.number = (self.number | 1); " an imperceptible hiss."; BerryFreeze: print "You drop a white berry into the drain. It vanishes with"; if (self.number & 1) { self.number = 0; " an unnerving rumble. Maybe that disposal effect isn't perfect after all."; } self.number = (self.number | 2); " an imperceptible crackle."; Take: "The hole is hardly portable."; ], number 0, has scenery; Object -> labtable "table" with name 'table' 'work' 'worktable' 'slab' 'granite' 'heavy' 'stone', initial [ ix lensobj leftobj rightobj; print "In the center of the worktable is"; if (labscale in parent(self)) print " a balance scale with two gleaming silver disks. Next to this is"; print " a complex apparatus of mirrors and lenses"; ix = child(self); if (ix) { print ". The table also contains "; WriteListFrom(ix, TERSE_BIT + ENGLISH_BIT + CONCEAL_BIT + RECURSE_BIT); } lensobj = child(lablens); if (labscale in Laboratory) { leftobj = child(leftscale); rightobj = child(rightscale); } if (lensobj || leftobj || rightobj) { print ".^^"; if (lensobj) { print (The) lensobj; if (lensobj == flask) { ix = inventory_stage; inventory_stage = 2; flask.invent(); inventory_stage = ix; } print " is nestled within the optical apparatus"; } if (leftobj || rightobj) { if (lensobj) print ". "; if (leftobj) { if (rightobj) print "On the scale's left disk you see "; else print "The scale's left disk is weighed down by "; WriteListFrom(leftobj, TERSE_BIT + ENGLISH_BIT + CONCEAL_BIT + RECURSE_BIT); } if (rightobj) { if (leftobj) print "; the right disk contains "; else print "The scale's right disk is weighed down by "; WriteListFrom(rightobj, TERSE_BIT + ENGLISH_BIT + CONCEAL_BIT + RECURSE_BIT); } if (leftobj && rightobj) { if (labscale.number == 0) print ". The scale is balanced"; else print ". The scale is tilted ", (string) labscale.number.name_str; } } } "."; ], description [ ix; print "The granite table is several inches thick; it rests on immovable boulders. The work space is dominated by a complex optical apparatus"; if (labscale in Laboratory) print " and a balance scale"; ix = child(self); if (ix) { print ". Also on the table"; WriteListFrom(ix, TERSE_BIT + ENGLISH_BIT + CONCEAL_BIT + RECURSE_BIT + ISARE_BIT); } "."; ], before [ ix; Search: print "On the table"; if (labscale in Laboratory) print " are a balance scale and"; else print " is"; print " a complex optical apparatus"; ix = child(self); if (ix) { print ". You also see there "; WriteListFrom(ix, TERSE_BIT + ENGLISH_BIT + CONCEAL_BIT + RECURSE_BIT); } "."; LookUnder, LookBehind: <>; ], has supporter static; Object -> labtablesupports "outcroppings" with name 'stone' 'granite' 'outcrop' 'outcrops' 'outcropping' 'boulder' 'boulders' 'four' 'irregular' 'immovable', description "The table is supported by four irregular outcrops of granite, which rise through the floor to precisely equal height. Between them, a small drain opens between the slate flagstones.", before [; Search: <>; Take, Push, Pull, Turn: "The immovable outcroppings of granite are immovable. They seem to be rooted deep under the flagstones, in fact."; ], has scenery pluralname; Object -> lablens "apparatus of lenses" with name 'apparatus' 'complex' 'of' 'lenses' 'lens' 'mirror' 'mirrors' 'oval' 'wire' 'loop' 'niche' 'optical', description [ ix; print "An intertwined bloom of struts supports shining lenses and mirrors, all held in precise positions. An oval loop of wire projects out from a niche in the arrangement"; ix = child(self); if (ix) print ". ", (The) ix, " rests in the loop"; else print ". The oval loop is empty"; ". Next to the loop hangs a gold pull-chain."; ], before [ lensobj ix; Search: lensobj = child(self); if (lensobj) { print "In ", (the) self, " is ", (a) lensobj; if (lensobj == flask) { ix = inventory_stage; inventory_stage = 2; flask.invent(); inventory_stage = ix; } "."; } Take: "The optical apparatus is fastened to the lab table."; Attack: "Breaking the apparatus is what you ", (emph) "don't", " want to do."; Touch, Push, Pull, Turn: "You should be careful. If you misalign any of that, the energy leak would be brief, spectacular, and painful."; Receive: if (noun ~= flask) print_ret (The) noun, " ", (isorare) noun, "n't shaped to fit the wire loop."; ], after [; Receive: print_ret (The) noun, " fits neatly into the heart of the apparatus."; LetGo: "You pluck ", (the) noun, " from the optical apparatus."; ], has scenery container open; Object -> lablenschain "pull-chain" with name 'gold' 'golden' 'pull' 'chain' 'pull-chain' 'knob', description "A short chain of fine golden links dangles from within the optical apparatus. A small knob on the end invites you to tug.", before [ ix; Push: "You can't push a pull-chain."; Pull: ix = child(lablens); if (ix == nothing) "You pull the chain. The wire loop, counterweighted, swings smoothly up amid the mirrors. Brilliant light reflects down for a moment -- a blinding glare -- and then the loop swings back down into its niche, unchanged."; if (ix ~= flask) "[BUG] Wrong item in loop."; FlaskReactLight(); rtrue; ], has scenery; ! ---- Object labscale "scale" with name 'scale' 'scales' 'balance' 'discs' 'disks', description [ leftobj rightobj; leftobj = child(leftscale); rightobj = child(rightscale); print "It's a simple but precisely-crafted balance. "; if (leftobj || rightobj) { if (leftobj) { if (rightobj) print "On the left disk you see "; else print "The left disk is weighed down by "; WriteListFrom(leftobj, TERSE_BIT + ENGLISH_BIT + CONCEAL_BIT + RECURSE_BIT); } if (rightobj) { if (leftobj) print "; the right disk contains "; else print "The right disk is weighed down by "; WriteListFrom(rightobj, TERSE_BIT + ENGLISH_BIT + CONCEAL_BIT + RECURSE_BIT); } if (leftobj && rightobj) { if (labscale.number == 0) print ". The scale is balanced"; else print ". The scale is tilted ", (string) labscale.number.name_str; } } else { print "The two silver disks are empty and level"; } "."; ], before [; Search: <>; Take: "The scale is fastened to the work table."; Enter: "You're much too large to get on the scale."; Receive: if (~~(noun provides scaleweight)) { print_ret (The) noun, " won't fit on the scale."; } "You'll have to say whether you want to put ", (the) noun, " on the left disk or the right disk."; ], number 0, count 0, daemon [; if (location ~= Laboratory or LabAnteroom) { StopDaemon(self); return; } self.invoke("^The", ".^"); ], invoke [ str1 str2 last wgt1 wgt2 val tilt; wgt1 = rightscale.invoke(); wgt2 = leftscale.invoke(); val = wgt1 - wgt2; if (val == self.count) rfalse; self.count = val; if (val == 0) { tilt = 0; } else { if (val < 0) tilt = leftscale; else tilt = rightscale; } if (tilt == self.number) rfalse; if (str1 ~= true) { if (str1) print (string) str1; if (tilt == 0) { if (wgt1 + wgt2 == 0) print " empty disks swing back into balance"; else print " disks level themselves into perfect balance"; } else { if (tilt == last) print " disk"; else print " ", (string) tilt.name_str, " disk"; switch (val) { -3 to 3: print " drifts"; -20 to 20: print " clinks"; -50 to 50: print " clanks"; default: print " clanks heavily"; } print " down, and the ", (string) tilt.number.name_str, " one rises"; } if (str2) print (string) str2; } self.number = tilt; rtrue; ], has scenery; Class ScaleDiskClass with name 'gleaming' 'silver' 'disk' 'disc' 'pan', before [ obj obj2; Examine: <>; Search: obj = child(self); obj2 = child(self.number); if (obj) { print "On ", (the) self; WriteListFrom(obj, TERSE_BIT + ENGLISH_BIT + ISARE_BIT + CONCEAL_BIT + RECURSE_BIT); } else { print (The) self, " is empty"; } if (obj || obj2) { if (labscale.number == 0) { print ". The scales are balanced"; } else { print ". The disk is tilted"; if (labscale.number == self) print " down"; else print " up"; } } "."; Receive: if (~~(noun provides scaleweight)) { print_ret (The) noun, " won't fit on the scale."; } Take: "That's part of the scale."; Enter: <>; Push, Pull: "You shift the disks up and down. How amusing. When you let go, of course, they return to their original positions."; ], after [; Receive: if (labscale.number == self) { print_ret "You place ", (the) noun, " on ", (the) self, ", weighing it more firmly down."; } print "You put ", (the) noun, " on ", (the) self; labscale.invoke(". The", 0, self); "."; LetGo: print "You lift ", (the) noun, " from ", (the) self; labscale.invoke(". The", 0, self); "."; ], count 0, number nothing, name_str "unknown", invoke [ par wgt obj; if (par == nothing) par = self; wgt = 0; objectloop (obj in par) { if (obj provides scaleweight) wgt = wgt + obj.scaleweight; else wgt = wgt + 1000; if (child(obj)) wgt = wgt + self.invoke(obj); } return wgt; ], has supporter scenery; ScaleDiskClass leftscale "left disk" with name 'left' 'first', name_str "left", number rightscale; ScaleDiskClass rightscale "right disk" with name 'right' 'second', name_str "right", number leftscale; ! ---- Object weightcase "silk case" with name 'silk' 'case' 'patterned' 'hollow' 'hollows', description [ obj; print "The case is the size of your hand; it is covered in rose-patterned silk"; if (self hasnt open) ". It is closed."; print ". The interior is shaped to five graduated hollows"; obj = child(self); if (obj) { print ", containing "; WriteListFrom(obj, TERSE_BIT + ENGLISH_BIT); } "."; ], before [; Search: if (self hasnt open) "The silk case is closed."; Receive: if (self hasnt open) "The silk case is closed."; if (~~(noun ofclass WeightClass)) "The case's interior is shaped only to hold the brass weights."; ], has container openable ~open; Class WeightClass with name 'brass' 'unit' 'weight' 'rod' 'weights//p' 'rods//p', short_name [; if (~~listing_together) { if (self.scaleweight < 10) print (EnglishNumber) self.scaleweight; else print self.scaleweight; print "-unit weight"; } else { print self.scaleweight; } rtrue; ], list_together [ obj num; if (inventory_stage == 1) { c_style = c_style | (NOARTICLE_BIT | ENGLISH_BIT); c_style = c_style & (~(NEWLINE_BIT | INDENT_BIT)); obj = parser_one; while (obj && obj.list_together == self.list_together) { obj = NextEntry(obj, parser_two); num++; } print (EnglishNumber) num, " "; print "brass weights (of "; } else { print " units)"; } ], description [; print "It's a"; if (self.scaleweight > 9) print " long"; else if (self.scaleweight > 1) print " short"; else print " very short"; " brass rod with the number ~", self.scaleweight, "~ engraved on the end."; ], scaleweight 0; WeightClass weight1 weightcase with name '1//' 'one' '1-unit' 'one-unit', scaleweight 1; WeightClass weight3 weightcase with name '3//' 'three' '3-unit' 'three-unit', scaleweight 3; WeightClass weight9 weightcase with name '9//' 'nine' '9-unit' 'nine-unit', scaleweight 9; WeightClass weight27 weightcase with name '27' 'twenty-seven' '27-unit', scaleweight 27; WeightClass weight81 weightcase with name '81' 'eighty-one' '81-unit', article "an", scaleweight 81; ! ---- Object flask labtable with name 'glass' 'flask' 'small' 'oval', short_name [ isempty; isempty = (child(self) == nothing); if (isempty) print "empty "; print "flask"; rtrue; ], article [ isempty; isempty = (child(self) == nothing); if (isempty) { print "an"; } else { print "a"; } rtrue; ], parse_name [ wd num isempty; isempty = (child(self) == nothing); wd = NextWord(); while (WordInProperty(wd, self, name) || (isempty && wd == 'empty')) { num++; wd = NextWord(); } return num; ], invent [ obj saved_cstyle saved_indent; if (inventory_style & NEWLINE_BIT) rfalse; obj = child(self); if (inventory_stage == 2) { if (~~obj) rtrue; saved_cstyle = c_style; saved_indent = wlf_indent; print " (containing "; WriteListFrom(obj, TERSE_BIT + ENGLISH_BIT); print ")"; c_style = saved_cstyle; wlf_indent = saved_indent; rtrue; } ], partinvent [; return self.invent(); ], description [ isempty ix; isempty = (child(self) == nothing); print "The flask is a small hollow oval of glass"; if (isempty) ", no bigger than a teacup. It is empty."; print ". Within"; ix = child(self); WriteListFrom(ix, TERSE_BIT + ENGLISH_BIT + ISARE_BIT); "."; ], scaleweight 25, before [ isempty obj num; Search: isempty = (child(self) == nothing); if (isempty) "The flask is empty."; Empty: num = children(self); if (self notin player) "You aren't holding ", (the) self, "."; if (num == 0) "The flask is already empty."; if (location ~= Laboratory) { if (FlaskIsInk()) "But you worked so hard to make the ink."; "Your house is cluttered enough, you decide, without pouring alchemic reagents into odd corners. You put that drain in the laboratory floor in order to have a place to dispose of this sort of stuff."; } if (num == 1) { obj = child(self); switch (obj) { resin: print "You shake the lump of resin out of the flask. It rattles its way down the drain, which swallows it silently"; dust: print "You pour the measure of blue dust upon the floor. The fine grains scatter and trickle down the drain"; ink: print "You pour your freshly-made ink down the drain, quietly contemplating the joy you'll have brewing another batch"; default: print "You pour ", (the) obj, " carefully down the drain"; } } else if (num == 2 && resin in self) { obj = child(self); if (obj == resin) obj = sibling(obj); print "You pour ", (the) obj, " carefully down the drain. The lump of resin tumbles out of the flask and vanishes as well"; } else { print "You pour your alchemic mixture carefully down the drain"; if (resin in self) print ". The lump of resin tumbles out of the flask and vanishes as well"; else print ". Whatever it is you've made, it won't bother you any more"; } while (child(self)) { obj = child(self); remove obj; } "."; EmptyT: num = children(self); if (self notin player) "You aren't holding ", (the) self, "."; if (num == 0) "The flask is already empty."; if (second ofclass FloorObject) <>; if (second == labdrain) <>; if (second == self) "That makes no sense."; print "You'd rather keep alchemic reagents in the flask, where they're easier to work with. Unless you want to dispose of"; if (num == 1) print " ", (the) (child(self)); else print " the mixture"; ", in which case you should just pour it into the drain."; Receive: if (noun == resin) { if (FlaskIsInk()) "You don't want to contaminate the ink you've made."; rfalse; } if (noun == quill) { if (child(self) == nothing) "There is not yet any ink in the flask."; if (ink in self) <>; "What's in the flask is certainly not ink."; } if (LargeObject(noun)) print_ret (The) noun, " won't fit in the flask."; if (noun ofclass WeightClass) print_ret (The) noun, " is intended to be a reference for alchemical experiments, not a subject."; if (noun ofclass KeyClass) print_ret "It might be interesting to alchemically transform ", (the) noun, ", but you'd be left with a door you couldn't lock or unlock. Better not."; print_ret (The) noun, " would be a poor subject for alchemical experimentation."; LetGo: num = children(self); if (self notin player) "You aren't holding ", (the) self, "."; if (noun == resin && num == 1) { move resin to player; "You can't easily reach into the flask, but you manage to shake the lump out into your hand."; } if (noun == ink && num == 1) { "You can't just pluck the ink out with your fingers."; } if (num == 1) print "You can't just pull ", (the) (child(self)); else print "You can't just pull the mixture"; print " out with your fingers"; if (noun ~= resin or dust or desertrock) print ". You don't even know what it is"; ". You could pour it into the drain, if you wanted to empty the flask and start over."; Drink, Taste: num = children(self); if (num == 0) "The flask is empty."; if (num == 1) { obj = child(self); <>; } "You look doubtfully at the mixture in the flask. Possibly it would taste bad, you decide."; Smell: num = children(self); if (num == 0) "The empty flask has no odor."; if (num == 1) { obj = child(self); <>; } "The aroma is complex."; BerryBurn: FlaskReactOrangeBerry(); rtrue; BerryFreeze: FlaskReactWhiteBerry(); rtrue; ], after [; Receive: if (noun == resin) { FlaskReceiveResin(); rtrue; } "[BUG] What else goes into the flask?"; ], has container open; [ FlaskIsInk; if (ink in flask && children(flask) == 1) rtrue; rfalse; ]; [ FlaskAddDust tipwgt fullwgt val istip already; if (FlaskIsInk()) "You don't want to contaminate the ink you've made."; if (dust notin flask) { if (parent(dust) ~= nothing) "[BUG] dust is present outside of flask."; dust.scaleweight = 0; move dust to flask; already = false; } else { if (dust.scaleweight >= 75) "The flask is already full of dust."; already = true; } tipwgt = 76; if (parent(flask) ofclass ScaleDiskClass) { if (parent(flask) == leftscale) val = labscale.count; else val = (-labscale.count); if (val > 0) { tipwgt = val; } } fullwgt = (75 - dust.scaleweight); if (tipwgt < fullwgt) { val = tipwgt; istip = true; } else { val = fullwgt; istip = false; } dust.scaleweight = dust.scaleweight + val; val = children(flask); if (~~already) print "You carefully pour blue dust"; else print "You add more blue dust"; if (val <= 1) { if (~~already) print " into"; else print " to"; } else { if (val == 2) { if (~~already) print " onto"; else print " to"; val = child(flask); if (val == dust) val = sibling(val); print " ", (the) val, " in"; } else { print " into"; print " the mixture in"; } } print " the flask, until"; if (istip) { labscale.invoke(" the", 0); } else { print " it is full"; } "."; ]; [ FlaskReceiveResin obj num; num = children(flask); if (FlaskIsInk()) "[BUG] Putting resin in ink."; if (num == 1) "The lump of resin plunks into the flask."; if (num == 2) { obj = child(flask); if (obj == resin) obj = sibling(obj); print "The lump of resin"; if (obj == dust) " plops into the flask, rippling the blue dust."; if (obj == inkdustheavy or dustlightmass or dustcrystal or dustcloudycrystal) print " lands next to"; else print " plops into"; print " ", (the) obj; " in the flask."; } "The lump of resin plops into the mixture in the flask."; ]; ! ---- Object resinbasket "wooden basket" labtable with name 'basket' 'wood' 'wooden', description "Standing on the table is a rough wooden basket. It is at least two feet tall, and broad and heavy to match. The basket is full of lumps of golden resin.", before [; Search: "The basket is full of lumps of golden resin."; Empty: "One at a time, please."; Take, Remove, Push, Pull: "The basket is too heavy to lug around."; BerryBurn, BerryFreeze: "You shouldn't contaminate your stock. Better to take one lump and work with that."; Receive: if (noun == resin) { remove noun; "You toss the lump back into the basket."; } "You shouldn't contaminate your stock. Better to take one lump and work with that."; ], has static container open; Object resinstock "stock of resin" resinbasket with name 'resin' 'lumps' 'of' 'resinous' 'golden' 'stock' 'lithon' 'lithontree' 'winter', parse_name [ wd num altthere; altthere = ~~(IndirectlyContains(location, resin)); wd = NextWord(); while (WordInProperty(wd, self, name) || (altthere && wd == 'lump')) { num++; wd = NextWord(); } return num; ], before [; Examine, Search: <>; Touch, Rub: <>; Smell: <>; Taste: "You're not holding any of the resin."; Receive: <>; BerryBurn: <>; BerryFreeze: <>; Take, Remove: if (parent(resin)) { print "You already have one lump of resin."; if (~~IndirectlyContains(location, resin)) print " (Even if you've left it lying around here somewhere...)"; " Carrying around more is unlikely to be helpful."; } resin.scaleweight = random(15) + 39; move resin to player; PronounNotice(resin); "You choose a lump from the basket."; ], has scenery; Object resin "lump of resin" with name 'resin' 'lump' 'of' 'resinous' 'golden' 'lithon' 'lithontree' 'winter', description "It's a small and irregular resinous lump. The golden surface is cracked in curved, glistening planes.", scaleweight 0, ! 40..54 before [ ix; Taste: "You touch your tongue to the resin; immediately your head is suffused with a bitter, aromatic perfume."; Touch, Rub: "The golden resin is just barely tacky."; Smell: "The resin has a bitter-cloying fragrance."; BerryBurn: if (self in flask) <>; ix = (resin in player); remove resin; faintperfume.invoke(); print "You crush the orange berry against the resin. The usual flare of sparks catches in the resin, spreading into a dim and smoky flame"; if (ix) print ". You quickly drop the fiery lump"; ". In a few seconds, the resin is consumed, leaving a faint perfume in the air."; BerryFreeze: if (self in flask) <>; ix = (resin in player); remove resin; print "You crush the white berry against the resin. White frost crackles through its substance; the resin quickly crumbles into a granular powder, which"; if (ix) print " falls through your fingers, scatters down the drain,"; else print " scatters down the drain"; " and is lost."; ]; ! ---- Object dustjar "leaden jar" labtable with name 'lead' 'leaden' 'jar' 'grey' 'cylinder' 'cylindrical' 'spout', description "It's a cylindrical jar of grey lead, with a narrow pouring-spout. You can see a stock of glittering blue dust inside.", before [; Search: print "Within the jar is a stock of extraordinarily fine, deep-blue dust. The powder has a faintly crystalline gleam to it"; if (self in player) print "; but it flows like a fluid when you tilt the jar"; "."; Receive, BerryBurn, BerryFreeze: "You shouldn't contaminate your stock. Better to pour some out and work with that."; Smell: <>; Empty: if (self notin player) "You aren't holding ", (the) self, "."; if (self has general) "You really don't want to waste the stuff. It wasn't easy to collect."; give self general; print "You pour out a measure of the blue dust. It scatters on the floor"; if (location == Laboratory) print " and trickles down the drain"; else print " and is lost"; "."; EmptyT: if (self notin player) "You aren't holding ", (the) self, "."; if (second ofclass FloorObject) <>; if (second == labdrain) <>; if (second == self) print_ret (The) duststock, " is already in ", (the) self, "."; if (second ofclass ScaleDiskClass) "You pour a measure of the blue substance onto the scale. But the fine grains scatter -- drifting off the silver disk, across the table, and onto the floor, where they find their silent way down the drain. None remains on ", (the) second, "."; if (second == labscale) "You'll have to say whether you want to pour the dust on the left disk or the right disk."; if (second == resinbasket) <>; if (second == flask) { FlaskAddDust(); rtrue; } "That won't aid anything."; ], has container open ~general; Object duststock "stock of blue dust" dustjar with name 'stock' 'of' 'fine' 'blue' 'deep-blue' 'deep' 'crystalline' 'glittering' 'dust' 'powder' 'corundum' 'sea-blood' 'sea' 'blood', parse_name [ wd num val; wd = NextWord(); while (1) { if (wd == 'in' or 'from') { wd = NextWord(); if (wd ~= 'jar') return num; num = num+1; } else { val = WordInProperty(wd, self, name); if (~~val) break; } num++; wd = NextWord(); } return num; ], before [; Examine, Search: <>; Empty: <>; EmptyT: <>; PutOn, Insert: <>; BerryBurn: <>; BerryFreeze: <>; Remove, Take: "The fine blue dust runs through your fingers. You could pour it into another container, but you can't hold it."; Smell: <>; Drink, Taste: <>; ], has scenery; Object dust "measure of blue dust" with name 'measure' 'of' 'fine' 'blue' 'deep-blue' 'deep' 'crystalline' 'glittering' 'dust' 'powder' 'corundum' 'sea-blood' 'sea' 'blood', parse_name [ wd num val; wd = NextWord(); while (1) { if (wd == 'in' or 'from') { wd = NextWord(); if (wd ~= 'flask') return num; num = num+1; } else { val = WordInProperty(wd, self, name); if (~~val) break; } num++; wd = NextWord(); } return num; ], description [; print "The flask contains a measure of extraordinarily fine, deep-blue dust. The powder has a faintly crystalline gleam to it"; if (flask in player) print "; but it flows like a fluid when you tilt it"; "."; ], scaleweight 0, before [; EmptyT: if (second == flask) print_ret (The) self, " is already in ", (the) flask, "."; <>; Empty: <>; BerryBurn: <>; BerryFreeze: <>; Smell: "The blue dust has no odor."; Drink, Taste: "You dust a few deep-blue grains onto your tongue. The powder dissolves instantly, washing a warm, clear salt-tang through you. It spreads across your palate and the back of your throat, though you have not consciously swallowed; it burns faintly, and is gone."; ], has static; ! ---- Object note "scrap of paper" labtable, with name 'scrap' 'of' 'paper' 'note' 'formula' 'formulation' 'recipe', scaleweight 5, description [; print "You have the formulation of the necessary ink scrawled here: ~Winter lithontree resin, and sea-blood corundum"; if (ExpertMode) print " -- equal by mass"; print " -- combine"; print " -- ensolve by exposure to (2 pulses) month-aged noonlight.~"; if (self hasnt general) { give self general; print " Easy enough to repeat. The hard part was gathering those substances."; } new_line; rtrue; ], before [; Search: "You find only words."; ], has ~general; ! ---- [ AdjustMural dest; dest = nothing; if (parent(belt)) dest = mural; safemove(muralbelt, dest); dest = nothing; if (parent(cloak)) dest = mural; safemove(muralcloak, dest); dest = nothing; if (glove has moved) dest = mural; safemove(muralgauntlet, dest); dest = nothing; if (Subterrane has visited) dest = mural; safemove(muraldagger, dest); dest = nothing; if (GreyChamber has visited) dest = mural; safemove(muralshield, dest); dest = nothing; if (bracelet has moved) dest = mural; safemove(muralbracer, dest); dest = nothing; if (ArtPalette has visited) dest = mural; safemove(muralthread, dest); dest = nothing; if ((muralbelt in mural) && (muralcloak in mural) && (muralgauntlet in mural) && (muraldagger in mural) && (muralshield in mural) && (muralbracer in mural) && (muralthread in mural)) dest = mural; safemove(muralsymbol, dest); ]; Class MuralPart with name 'painted' 'mural', has scenery; MuralPart muralsky "painted sky" mural with name 'sky' 'red', description "The painted sky is red, streaked with clouds."; MuralPart muralsymbol "painted symbol" with name 'sign' 'symbol' 'constellation' 'doorstep' 'of' 'heaven' 'orb', description "Ahead of the painted figure is the mark of the constellation called Doorstep of Heaven... except that it is placed within concentric circles. You do not recognize the symbolism."; MuralPart muralbelt "painted belt" with name 'silver' 'snake' 'serpent' 'skin' 'snakeskin' 'belt', description "The painted figure wears a belt which appears to be the skin of a silver serpent. Or perhaps it is a whole snake, tied around its waist."; MuralPart muralcloak "painted cloak" with name 'black' 'cloak', description "The painted figure wears a long black cloak."; MuralPart muralgauntlet "painted gauntlet" with name 'gauntlet' 'leather' 'heavy', description [; print "The painted figure wears a gauntlet of thick leather -- you assume it's leather -- on its right hand. The hand is stretched forward"; if (muraldagger in mural) print ", and holds a black dagger"; "."; ]; MuralPart muraldagger "painted dagger" with name 'black' 'dagger', description "The figure holds a dagger in its right hand; it is painted as a single slash of unmixed black."; MuralPart muralshield "painted shield" with name 'shield' 'decorative' 'small', description "The painted figure carries a small shield slung over one shoulder. Its surface seems to be intricately decorated, but it is painted at too sharp an angle for the pattern to be visible."; MuralPart muralbracer "painted bracer" with name 'dark' 'bracer' 'wristlet', description "The painted figure wears some sort of wristlet on its raised left hand."; MuralPart muralthread "painted thread" with name 'knotted' 'thread' 'intricate', description "The painted figure holds its left hand upraised. Dangling from it is a long thread, which seems to be full of knots... or perhaps beads. Their pattern is uneven, but you see no meaning in it."; ! ---- Class Residue with scaleweight 0, invoke [ val obj; val = 0; while (child(flask)) { obj = child(flask); remove obj; val = val + obj.scaleweight; } self.scaleweight = val; move self to flask; ], before [; BerryBurn: <>; BerryFreeze: <>; Empty: <>; EmptyT: if (second == flask) print_ret (The) self, " is already in ", (the) flask, "."; <>; Smell: print_ret (The) self, " has no odor."; Drink: <>; Taste: print_ret "You can't easily get at ", (the) self, " to taste it."; Receive: if (noun == quill) { "What's in the flask is certainly not ink."; } ]; Residue ink "ink" with name 'velvet' 'velvet-black' 'black' 'ink', article "some", description "The ink shifts slowly in the flask, reflecting only a bare edge of light. This, indeed, is the substance you used in your last attempt.", before [; Smell: "The ink smells astringent."; Taste: "You let a drop of the ink roll into your tongue. It is bitter."; PutOn, Insert, EmptyT: if (second == quill) <>; Receive: if (noun == quill) { if (quill.number) "You dip the pen again."; quill.number = true; "You dip the quill's nib carefully into the ink. When you withdraw it, ebon light refracts from a quivering droplet."; } print_ret (The) noun, " wouldn't be improved by being inky."; ]; Residue preinkmass "heavy brown gel" with name 'heavy' 'murky' 'brown' 'gel' 'jelly', number 0, description "In the flask you see a layer of murky brown gel.", before [; Smell: "The gel has a rank salt smell, like tide-wrack."; ]; Residue inkash "flaky black ash" with name 'flaky' 'black' 'ash', description "You see a layer of light, flaky black ash.", before [; Taste: "A flake of the ash is tasteless."; ]; Residue inkdustheavy "vitreous black slag" with name 'vitreous' 'black' 'glassy' 'slag', description "The flask contains a vitreous black slag."; Residue inkresinheavy "pale brown tincture" with name 'pale' 'brown' 'tincture' 'liquid', description "The flask contains a pale brown tincture, flecked with darker particles.", before [; Smell: "The tincture smells sweet."; Taste: "You touch your tongue to the liquid; it is salt-sweet."; ]; Residue reschillpowder "golden powder" with name 'golden' 'gold' 'pale' 'powder' 'granular' 'grains', description "You see a layer of pale golden grains in the flask.", before [; Smell: "You smell a faint bitter-cloying perfume."; Taste: "The golden powder carries a bitter, aromatic perfume."; ]; Residue reslightoil "yellow oil" with name 'cloudy' 'yellow' 'oil' 'brown' 'particles' 'suspension', description "You see a pool of yellow oil, cloudy with a suspension of fine brown particles.", before [; Smell: "The oil has a light smoky perfume, like incense."; Taste: "A drop of the yellow oil spreads like sweet incense on your tongue."; ]; Residue dustlightmass "indigo mass" with name 'indigo' 'mass' 'agglomerat' 'crystalline' 'crystals', article "an", description "The flask contains an irregular mass of indigo crystals."; Residue dustcrystal "violet crystal" with name 'violet' 'crystal' 'crystalline' 'mass' 'pure' 'perfect', description "You see a large and perfect violet crystal in the flask."; Residue dustcloudycrystal "cloudy indigo crystal" with name 'indigo' 'crystal' 'crystalline' 'mass' 'cloudy', description "You see a cloudy indigo crystal in the flask."; Residue greensyrup "green syrup" with name 'green' 'opaque' 'syrup' 'syrupy' 'liquid', description "The flask contains a pool of thick and syrupy opaque green liquid.", before [; Smell: "The green liquid smells of pungent liquorice."; Taste: "You roll a drop of the green liquid to your tongue. It is pungent and medicinal, and leaves your lips burning."; ]; Residue greensolid "cluster of green needles" with name 'cluster' 'of' 'green' 'needles' 'needle' 'needle-like' 'crystal' 'crystals' 'crystalline', description "The flask contains a layer of delicate green crystalline needles.", has pluralname; Class SmokeClass with name 'smell' 'aroma' 'scent' 'odor', description [; print_ret (The) self, " is not visible to the eye."; ], number 4, count 0, invoke [; self.count = 0; StartDaemon(self); move self to location; ], evoke 0, daemon [ loc; self.count++; if (self.count >= self.number) { loc = (location == parent(self)); remove self; StopDaemon(self); if (loc) self.evoke(); } ], react_before [; Smell: if (noun == nothing) <>; ], before [; Examine: rfalse; Smell: rfalse; Blow: "You huff and puff."; default: print_ret (The) self, " is intangible."; ], has scenery; SmokeClass faintperfume "faint perfume" with name 'faint' 'perfume' 'resinous', number 6, before [; Smell: "A trace of the smoky, resinous perfume lingers."; ]; SmokeClass putridsmell "putrid smell" with name 'putrid' 'burned' 'burnt', before [; Smell: "The nasty burnt odor hovers in the air."; ]; SmokeClass resinsmoke "white smoke" with name 'aromatic' 'white' 'of' 'smoke' 'cloud', article "a cloud of", number 5, description "A white cloud hangs in the room, slowly thinning away.", before [; Smell: "The smoke smells intensely of the cloying-sweet resin."; ], evoke [; "^The cloud of smoke has dissipated."; ], has ~scenery static; [ FlaskReactLight num obj val; num = children(flask); if (flask notin lablens) "[BUG] Flask not in apparatus."; if (num == 0) { "You pull the chain. The flask, counterweighted, swings smoothly up amid the mirrors. Brilliant light reflects down for a moment -- a blinding glare -- and then the empty flask swings back down into its niche, unchanged."; } print "You pull the chain, and the flask swings up into the apparatus. After a moment of blinding refractions"; if (num == 1) { obj = child(flask); switch (obj) { resin: reslightoil.invoke(); ", it swings back down. The resin has been liquefied to a cloudy yellow oil."; dust: dustlightmass.invoke(); ", it swings back down. The dust seems to have fused into a crystalline indigo mass."; preinkmass: if (preinkmass.number < 0) { inkresinheavy.invoke(); ", it swings back down. The gel has liquified to a brown tincture -- much too pale to be the ink you need."; } else if (preinkmass.number > 0) { inkdustheavy.invoke(); ", it swings back down. The gel has hardened to a vitreous black substance -- much too hard to be the ink you need."; } else { ink.invoke(); maskshred.invoke(); ", it swings back down. The gel has liquified into a beautiful velvet-black ink."; } reslightoil: remove reslightoil; resinsmoke.invoke(); ", a loud ", (emph) "phoomph", " erupts from amid the mirrors, followed by a cloud of aromatic white smoke. The flask swings back down, quite empty."; default: ", it swings back down. ", (The) obj, " does not appear to have changed."; } } else if (num == 2) { if (dust in flask && resin in flask) { if (ExpertMode) val = dust.scaleweight - resin.scaleweight; else val = 0; preinkmass.invoke(); preinkmass.number = val; ", it swings back down. The lump of resin is visibly swelling, even as the light fades; the blue dust is being absorbed within. In moments, the mixture is a homogenous brown gel."; } else if (preinkmass in flask && dust in flask) { inkdustheavy.invoke(); ", it swings back down. The brown substance has absorbed the dust, and hardened to a glassy black."; } else if (preinkmass in flask && resin in flask) { inkresinheavy.invoke(); ", it swings back down. The brown substance has absorbed the resin, and liquified to a pale brown."; } else if (dust in flask && dustlightmass in flask) { dustlightmass.invoke(); ", it swings back down. The indigo agglomeration appears to have grown."; } else if (dust in flask && (dustcrystal in flask || dustcloudycrystal in flask)) { dustlightmass.invoke(); ", it swings back down. The crystal has partially decomposed into amorphous indigo."; } else if ((dust in flask && reslightoil in flask) || (greensyrup in flask && resin in flask)) { greensyrup.invoke(); ", it swings back down. An opaque green syrup is roiling in the flask; it quickly calms."; } } if (resin in flask) { if (reslightoil notin flask) { remove resin; move reslightoil to flask; reslightoil.scaleweight = resin.scaleweight; ", it swings back down. The resin has been liquefied to a cloudy yellow oil, but the rest of the mixture is unchanged."; } else { remove resin; reslightoil.scaleweight = reslightoil.scaleweight + resin.scaleweight; ", it swings back down. The resin has liquified into the oil, but the rest of the mixture is unchanged."; } } if (dust in flask) { if (dustlightmass notin flask) { remove dust; move dustlightmass to flask; dustlightmass.scaleweight = dust.scaleweight; ", it swings back down. The dust has fused into an indigo mass, but the rest of the mixture is unchanged."; } else { remove dust; dustlightmass.scaleweight = dustlightmass.scaleweight + dust.scaleweight; ", it swings back down. The dust has fused into the indigo mass, but the rest of the mixture is unchanged."; } } ", it swings back down. The contents do not appear to have changed."; ]; [ FlaskReactOrangeBerry num obj; num = children(flask); if (num == 0) { "The berry bursts, filling the empty flask with a brief flare of whirling sparks. Then they are gone."; } if (num == 1) { obj = child(flask); switch (obj) { resin: remove resin; faintperfume.invoke(); "The berry bursts, filling the flask with whirling sparks. Then the lump of resin catches light -- a yellow, smoky flame. In a few seconds, the resin is consumed, leaving a faint perfume in the air."; dust: "The berry bursts, filling the flask with whirling sparks. The blue dust spits and crackles briefly, then cools, apparently unchanged."; reschillpowder: remove reschillpowder; faintperfume.invoke(); "The berry bursts. Sparks scatter across the golden powder, which immediately erupts in an intense flare of hissing light. When your eyes recover, nothing remains but a lingering perfume."; dustlightmass: dustcrystal.invoke(); "The berry bursts, showering sparks around the indigo mass. It glimmers in the intense heat, and slowly clarifies into a pure violet."; inkdustheavy, preinkmass: putridsmell.invoke(); inkash.invoke(); "The berry bursts, filling the flask with sparks. ", (The) obj, " takes light and flares into a flaky ash, and a putrid burnt odor."; default: "The berry bursts, filling the flask with whirling sparks. ", (The) obj, " is unaffected."; } } else if (num == 2) { if (dust in flask && dustlightmass in flask) { remove dustlightmass; move dustcloudycrystal to flask; dustcloudycrystal.scaleweight = dustlightmass.scaleweight; "The berry bursts, showering sparks around the indigo mass. It glimmers in the intense heat, as the lighter dust around it crackles and spits. Slowly the mass becomes translucent."; } else if ((inkdustheavy in flask && dust in flask) || (preinkmass in flask && dust in flask)) { putridsmell.invoke(); inkash.invoke(); "The berry bursts, filling the flask with sparks. The substances take light and flare into a flaky ash, and a putrid burnt odor."; } } if (resin in flask) { remove resin; faintperfume.invoke(); "The berry bursts, filling the flask with whirling sparks. Then the lump of resin catches light -- a yellow, smoky flame. In a few seconds, the resin is consumed, leaving a faint perfume in the air. The rest of the flask's contents, however, are unchanged."; } if (reschillpowder in flask) { remove reschillpowder; faintperfume.invoke(); "The berry bursts. Sparks scatter across the golden powder, which immediately erupts in an intense flare of hissing light. When it fades, the powder is gone, although the rest of the flask's contents are unchanged."; } "The berry bursts, filling the flask with brief flare of whirling sparks. This fades, leaving the contents unaffected."; ]; [ FlaskReactWhiteBerry num obj; num = children(flask); if (num == 0) { "The berry bursts, filling the empty flask with a brief swirl of icy vapor. Then it is gone."; } if (num == 1) { obj = child(flask); switch (obj) { resin: reschillpowder.invoke(); "The berry bursts, filling the flask with swirling, icy vapor. When it clears, the lump of resin is gone -- it has crumbled to a granular golden powder."; dust: remove dust; "The berry bursts, filling the flask with swirling, icy vapor. The blue dust hisses and sublimes away -- apparently without residue."; greensyrup: greensolid.invoke(); "The berry bursts, frosting the inside of the flask. When the glass clears, the green fluid has coalesced into a cluster of needle-like green crystals."; inkresinheavy, preinkmass: inkash.invoke(); "The berry bursts, filling the flask with icy vapor. When it clears, ", (the) obj, " has dried and darkened into a flaky ash."; default: "The berry bursts, filling the flask with icy vapor. ", (The) obj, " is unaffected."; } } else if (num == 2) { if (resin in flask && reschillpowder in flask) { reschillpowder.invoke(); "The berry bursts. The resin frosts white, and crumbles into more of the golden powder."; } else if ((inkresinheavy in flask && resin in flask) || (preinkmass in flask && resin in flask)) { inkash.invoke(); "The berry bursts, filling the flask with icy vapor. When it clears, the substances have dried and darkened into a flaky ash."; } } if (resin in flask) { if (reschillpowder notin flask) { remove resin; move reschillpowder to flask; reschillpowder.scaleweight = resin.scaleweight; "The berry bursts. The resin frosts white, and crumbles into golden powder, but the rest of the mixture is unchanged."; } else { remove resin; reschillpowder.scaleweight = reschillpowder.scaleweight + resin.scaleweight; "The berry bursts. The resin frosts white, and crumbles into more golden powder, but the rest of the mixture is unchanged."; } } "The berry bursts, filling the flask with a brief swirl of icy vapor. This fades, leaving the contents unaffected."; ]; ! ---- Object HintoLab with hint_name "winning the game", count 0, description [; if (Laboratory hasnt visited) { if (self.count & $1 == 0) { self.count = self.count | $1; print "Now that you've regained some of your memories, you may have access to parts of the Dreamhold that you were formerly barred from."; return 3; } if (LabHall.helpmode == 0 && LabAnteroom hasnt visited) { if (self.count & $2 == 0) { self.count = self.count | $2; print "You never tried the other locked doors in the central living area."; return 3; } print "You never tried the locked door in the Crowded Study. It's unlocked by the iron key"; if (labkey in Arboretum) print " which is"; else print " which you found"; print " in the Arboretum."; rtrue; } if (LabAnteroom hasnt visited) { if (location ~= LabHall) { print "You never got past the infinite Iron Corridor south of the Crowded Study."; rtrue; } if (self.count & $4 == 0) { self.count = self.count | $4; print "Have you examined the spell on this corridor?"; return 2; } if (self.count & $8 == 0) { self.count = self.count | $8; print "You now realize this is a familiar spell. You should be able to break it easily."; return 2; } if (self.count & $10 == 0) { self.count = self.count | $10; print "You don't need to cast a specific spell-removing spell. A wizard would just off-handedly destroy it."; return 2; } print "Just type ", (helpcmd) "break spell", "."; rtrue; } print "You can now venture south from the Iron Passage."; rtrue; } if (location ~= Laboratory) { print "You must continue your work in the Laboratory."; rtrue; } if (self.count & $20 == 0) { self.count = self.count | $20; print "Have you examined everything in the Laboratory?"; return 2; } if (note hasnt general) { print "Have you read the scrap of paper?"; rtrue; } if (self.count & $40 == 0) { self.count = self.count | $40; print "The scrap has a recipe for making ink."; return 2; } if (self.count & $80 == 0) { self.count = self.count | $80; print "The basket contains lithontree resin; the leaden jar contains sea-blood corundum."; return 2; } if (self.count & $100 == 0) { self.count = self.count | $100; print "You'll have to mix the resin and the blue dust in the glass flask."; return 2; } if (self.count & $200 == 0) { self.count = self.count | $200; print "The apparatus of lenses is a containment device for pure light."; return 2; } if (self.count & $400 == 0) { self.count = self.count | $400; print "If you put something into the apparatus, and then pull the gold chain, it will be exposed to noonlight."; return 2; } if (self.count & $800 == 0) { self.count = self.count | $800; print "If you've accidentally made something that ", (emph) "isn't", " ink, you can empty the flask and start over."; return 2; } print "Start with the flask empty. Put blue dust and a lump of resin in the flask. Put the flask in the apparatus. Pull the chain, twice."; rtrue; ];