Object Study "Crowded Study" with description [ ix; print "You stand amid clutter, oddments, shelves and stacks. The chamber is comfortably broad, centered around a massive and well-worn wooden desk. But so much is jammed in, around the desk and up the panelled walls, that you barely find room to stand. Books; papers; dried plants; animals stuffed and preserved, antique instruments, candles of any hue"; if (~~Enlightened) print ". You don't recognize half of it, and you can't name half the rest"; else print ". You can't remember where half of it came from"; print ".^"; print "^There are wide doorways on the north and east sides of the room"; if (~~Enlightened) print ". A door of heavy wood stands"; else print ". The heavy wooden door to your laboratory stands"; if (studydoor has open) print " open"; else print " closed"; print " to the south, and stairs descend into dimness to the west.^^"; ix = child(desk); if (ix) { print "You see "; WriteListFrom(ix, TERSE_BIT + ENGLISH_BIT + CONCEAL_BIT); print " on the desk. "; } print "Behind the desk is a tall glass-fronted cabinet. Beside that is a small brass trunk, which "; if (studytrunk has open) { ix = child(studytrunk); if (~~ix) { print "is open but empty"; } else { print "contains "; WriteListFrom(ix, TERSE_BIT + ENGLISH_BIT + CONCEAL_BIT); } } else { print "is closed"; } print ".^"; if (self hasnt general) { give self general; print "^If there were a quarter as much here, and a tenth as many books, you might be in any scholar's study. But this knowledge must represent lifetimes of work -- lifetimes under a single hand. You do not know where you are, but you know what this place is: a dreamhold. A wizard's high house.^^ You do not find yourself afraid. A dreamhold is more than merely dangerous.^"; } ], initial [ ix; if (Hall3 has visited) rfalse; self.helpmode++; if (self.helpmode == 2) { ix = GuideSearchStudyObject.count(); if (ix ~= GuideSearchStudyList-->0) GuideEnqueue(GuideSearchStudyObject); } ], before [; Smell: if (noun == nothing) "The air has an odd preserved tang, like musty oranges."; ], helpmode 0, each_turn [; if (Enlightened) { ReminisceToLab.invoke(); } ], d_to [; <>; ], w_to [; print "You descend for a long while.^"; return BasementHall; ], n_to SittingRoom, e_to MirrorRoom, s_to [; if (studydoor hasnt open) { GuideLockedDoorsMessage.invoke(studydoor); print "The wooden door is closed"; if (studydoor has locked) print " and locked"; "."; } return studydoor; ], cant_go "You can leave here to the north or east, through the door to the south, or down the stairs to the west.", coredir e_obj, coredirmod DIRMOD_NEAR, has ~general; SceneryObject -> studyscenery with name 'study' 'chamber'; WallObject -> studywall with name 'wood' 'wooden' 'dark' 'panel' 'panels' 'panelled' 'lattice', short_name "panelled walls", description "The walls are fine panels of some dark wood, framed in a darker wooden lattice."; FloorObject -> studyfloor with description [; print "The floor is piled high with unnameable clutter.^"; whitemask.invoke(); rtrue; ], before [; Search: <>; ]; CeilingObject -> studyceiling with description "The room is raftered with heavy beams, their wood worn dark with time."; Object -> studydoor "wooden door" with name 'door' 'heavy' 'wood' 'wooden' 'knob' 'doorknob' 'iron' 'lock' 'keyhole', description [; StudySearched(self); print "The door is of heavy wooden planks strapped with iron; the knob is secured with a thick iron lock. The door is"; if (self has open) " open."; else " closed."; ], door_dir s_to, door_to [; return LabHall.invoke(); ], with_key labkey, before [; Open: StudySearched(self); if (self has locked && (~~GuideAnyQueued())) GuideLockedDoorsMessage.invoke(self); rfalse; Lock, Unlock: if (second == hallkey) { GuideLockedWrongKeyMessage.invoke(self); print_ret (The) second, " is too small to fit the door's heavy lock."; } if (second ~= self.with_key) { GuideLockedDoorsMessage.invoke(self); print_ret (The) second, " is unlikely to lock or unlock anything."; } if (action == ##Lock && self has locked) "The door is already locked."; if (action == ##Unlock && self hasnt locked) "The door is already unlocked."; Turn: <>; Receive: if (noun ofclass KeyClass && receive_action == ##Insert) { GuideEnqueue(GuidePutKeyInObject); <>; } Attack: if (self has open) print_ret (The) self, " is open."; "No answer."; Search: if (self has open) print_ret (The) self, " is open."; "You can't see through the keyhole."; ], after [; Unlock: give self open; "The iron key unlocks the door. You turn the knob and swing it open."; ], has door openable ~open locked lockable scenery; Object -> desk "desk" with name 'massive' 'well' 'worn' 'well-worn' 'wooden' 'wood' 'desk' 'table', description [ ix; StudySearched(self); print "The desk is heavy and plain, a massive wooden construction. Surprisingly, the surface is bare"; ix = child(desk); if (ix) { print ", except for "; WriteListFrom(ix, TERSE_BIT + ENGLISH_BIT + CONCEAL_BIT); } print ".^"; whitemask.invoke(); rtrue; ], before [; Take, Push, Pull: "The desk is too massive to move."; LookUnder: StudySearched(self); print "You see more of the study's clutter.^"; whitemask.invoke(); rtrue; LookBehind: print "Behind the desk is a tall cabinet and a small brass trunk.^"; whitemask.invoke(); rtrue; ], has scenery supporter; Object -> -> book "immense book" with name 'immense' 'book' 'page' 'pages' 'notes', article "an", description [; StudySearched(self); print "The book lies open"; if (~~Enlightened) { print ". You frown at the fine, angular hand"; if (studybooks.count) print " -- the same as enscribes every other book in the room --"; print " but discover that you can read it:^^"; } else { print " to the critical page:^^"; } style underline; print " The Theory & UNDERSTANDING of Portalls;^ The lesser, which make a single place of many, and the Greater, which open from NOW into Time in Memory, or Prophecy Foretold, or even a Moment's Fancy;^^"; print "All portals are perilous. Perilous thresholds to cross, and more perilous to create; For there is no plying of the World, or of Time, that does not happen in the Mind of the learned one who conceives of the journey. Of your Thought is the portal built, arch and capstone. Slip but a moment of your attention, and the Portal will fall into ruin; All its might, and yours, crumbled into eggshell fragments that stray upon the Wind; ...^"; style roman; print "^The facing page shows an elaborate circular diagram, annotated here and there with tiny mathematical notes"; if (~~Enlightened) { print ". The only comment you understand, tucked in a margin, says"; } else { print ". This is the culminating step of your long work. You are sure, in the yet-fogged halls of your memory, that every other preparation is complete. You recall writing the comment in the margin:"; } print " ~Best to draw in a well-insulated space -- 35 Ll. of uncut stone? -- move house to Emmen Valley, work into mountain?~^"; if (Enlightened) { print "^You have no recollection of the labor that must have followed. But it will come; and there is no reason to delay turning initial failure into triumph"; if (LabAnteroom hasnt visited) print ". The door to your laboratory is before you, and the privacy spell can no longer confound you"; print ".^"; } rtrue; ], before [; Search, Open: <>; Take, Push, Pull, LookUnder: "The immense book does not seem to want to move from its place on the desk."; Turn: if (Enlightened) "You flip back through the formulae, reacquainting yourself with the arguments."; "You turn a page of the immense book, and then another, and another. The handwriting is unchanged, but the languages are varied and unfamiliar. You find no more text that you can read; so you turn back to the diagram."; Close: if (Enlightened) "But you haven't finished your work."; "You find you cannot close the immense book."; Smell: "The book smells dimly of age."; ], has static transparent; Object -> -> -> diagram "circular diagram" with name 'circle' 'circular' 'elaborate' 'diagram' 'figure', description [; print "The diagram takes up an entire page of the immense book. The whole is inscribed in a circle; but it has countless partitions, spirals, and inner elaborations"; if (~~Enlightened) ". You find it both soothing and irritatingly familiar.^^ The diagram is heavily annotated in an abbreviated script. The only comment you understand says ~Best to draw in a well-insulated space -- 35 Ll. of uncut stone? -- move house to Emmen Valley, work into mountain?~"; else ".^^You glare at the diagram in irritation. You have spent months studying it. You could redraw it perfectly if you were blindfolded, drunk, and singing bawdy Morovnan sea ballads. What could have gone wrong?"; ], before [; Take: "It's drawn upon a page of the immense book."; ], has scenery; Object -> studytrunk "trunk" with name 'small' 'brass' 'trunk' 'chest' 'geometric' 'design' 'designs', description [; StudySearched(self); GuideOpeningTrunkMessage.invoke(); print "A small square trunk is pushed up against the back wall, beside a tall cabinet. The trunk's panels and lid are tarnished brass; they're engraved with worn geometric designs."; if (self hasnt open) " The trunk sits closed."; print " "; <>; ], before [; Take, Push, Pull: GuideOpeningTrunkMessage.invoke(); "The trunk isn't ", (emph) "that", " small. And it's surprisingly heavy for its size. You can't move it."; Open: StudySearched(self); if (self hasnt general && self hasnt open) { give self general; give self open; "You hesitate a moment. Prying into a wizard's possessions? But you're already standing in his home; and you could as easily be damned for making free with his candlelight as with his trunk.^^ You reach out, flip up the brass lid, and step back in one movement... A copper key glints at the very bottom of the trunk."; } Search: StudySearched(self); if (self hasnt open) "You'll have to open ", (the) self, " in order to see what's inside."; Enter: if (self has open) print "The trunk is"; else print "Even if it were open, the trunk would be"; " much too small to climb into."; ], after [; Open: if (~~child(self)) "You open ", (the) self, ", finding it empty."; ], has container ~open openable scenery ~general; KeyClass -> -> hallkey "copper key" with name 'tiny' 'flat' 'copper' 'key', description [; GuideTakingMessage.invoke(self); "It's a tiny flat copper key."; ], scaleweight 12; Object -> cabinet "cabinet" with name 'tall' 'cabinet' 'glass' 'glass-front' 'fronted' 'pane' 'panes', description [; print "The cabinet is a tall and ornate affair; its feet and edges are carved into flamboyant spirals. Two broad and utterly flawless glass panes form the cabinet's front surface.^^"; <>; ], before [; Search: StudySearched(self); "The cabinet's shelves are filled with curiosities. Tiny crystals and worn river stones, intricate knots of wire and slabs of rough metal, scraps of folded paper and loops of colored string. A small bell of rune-scratched glass. Three beans in a golden dish. A human hand, eye, and heart, all seemingly carved of chalk. An amethyst scale, the length of your finger, which lies in a pool of its own light."; Open: if (Enlightened) "You have more important things to be doing than messing with your curios."; "The glass panes won't open. The cabinet seems to be locked, although you see no keyhole."; Lock, Unlock: if (Enlightened) <>; "You can't see how to lock or unlock the cabinet."; Receive: if (noun ofclass KeyClass && receive_action == ##Insert) <>; ], has container transparent openable ~open locked scenery; Object -> -> cabinetstuff "contents of the cabinet" with description [; StudySearched(self); "The objects in the cabinet are as varied as memories in a dream."; ], parse_name [ wd num; wd = NextWord(); while ((wd == 'curiosities' or 'tiny' or 'crystal' or 'crystals' or 'worn' or 'river' or 'stone' or 'stones' or 'intricate' or 'knot' or 'knots' or 'wire' or 'slab' or 'slabs' or 'rough' or 'metal' or 'scrap' or 'scraps' or 'folded' or 'paper') || (wd == 'loop' or 'loops' or 'colored' or 'string' or 'small' or 'bell' or 'rune' or 'runes' or 'glass' or 'bean' or 'beans' or 'gold' or 'golden' or 'dish' or 'human' or 'hand' or 'eye' or 'heart' or 'chalk' or 'amethyst' or 'scale' or 'pool' or 'light')) { num++; wd = NextWord(); } return num; ], before [; Search: <>; Take, Pull, Push, Touch, Taste, Smell: "The glass panes are closed. Whatever is inside the cabinet will have to remain there."; ], has scenery pluralname; Object -> clutter "clutter" with name 'clutter' 'oddment' 'oddments', description [; StudySearched(self); print "You look helplessly about. You couldn't catalogue it all in a wizard's years.^"; whitemask.invoke(); rtrue; ], before [; Examine: rfalse; Search, LookUnder, LookBehind: <>; default: if (Enlightened) "You have more important things to be messing with than this clutter."; if (self hasnt general) { give self general; print "Wisdom is to leave a wizard's possessions alone. Particularly if you don't recognize them. One tale you've heard -- a tale, some fool -- when? No, it's gone. Damn the fog in your head.^"; whitemask.invoke(); rtrue; } "It might be a bad idea to touch a wizard's possessions."; ], has scenery ~general; Object -> studyanimals "animals" with name 'creature' 'creatures' 'animal' 'animals' 'stuffed' 'preserved', description [; StudySearched(self); print "Uncommon creatures stare glassily at you, or at nothing.^"; whitemask.invoke(); rtrue; ], before [; Examine: rfalse; Search, LookUnder, LookBehind: <>; default: <>; ], has scenery pluralname; Object -> studyplants "dried plants" with name 'plant' 'plants' 'dried' 'pot' 'pots' 'leaf' 'leaves' 'flower' 'flowers' 'seed' 'seeds' 'pod' 'pods', description [; StudySearched(self); print "Sprays of dried leaves, flowers, and seed pods poke out of various pots"; if (~~Enlightened) print ". Decoration, medicine, research? You have no way to tell"; print ".^"; whitemask.invoke(); rtrue; ], before [; Examine: rfalse; Search, LookUnder, LookBehind: <>; default: <>; ], has scenery pluralname; Object -> studyinstruments "instruments" with name 'instrument' 'antique' 'old', description [; StudySearched(self); print "The antique instruments are"; if (~~Enlightened) print " entirely beyond you.^"; else print " more decorative than functional.^"; whitemask.invoke(); rtrue; ], before [; Examine: rfalse; Search, LookUnder, LookBehind: <>; default: <>; ], has scenery pluralname; Object -> studybooks "stacks of books" with name 'papers' 'books' 'stacks' 'of' 'stack' 'shelf' 'shelves' 'bookshelf' 'bookshelves', description [; StudySearched(self); print "Books are lined up on shelves, stacked on the floor, scattered in hazard across everything else in the room"; if (Enlightened) "."; print ". You glance at a few titles, gingerly lift a cover -- but you recognize none of the many scripts and languages you find.^"; if (self.count == 0) { self.count = 1; } else { print "^Strange, though. Some of the books are ancient, some are crumbling with wear, and some are stiffly new. But every one seems to be written by the same hand.^"; } whitemask.invoke(); rtrue; ], count 0, before [; Examine: rfalse; Search, Open: <>; LookUnder, LookBehind: <>; default: <>; ], has scenery pluralname; Object -> studycandles "candles" with name 'wax' 'candle' 'candles' 'sconce' 'sconces' 'stand' 'stands' 'flame' 'flames', description [; StudySearched(self); print "The candles are mounted in sconces high on the walls, or set into ornate iron stands. Most are heavy, burned low with age, dripping silent gutters of wax over metal and stone.^^"; if (self hasnt general) { "Every candle you see is lit."; } else { "Every candle is lit, but the flames hold no warmth. Only the memories of light, perhaps, in a wizard's dream."; } ], before [; Take, Push, Pull, Turn: "The candles are immovably fixed by ages of hardened wax."; Touch, Rub: give self general; "The flames radiate no heat."; Smell: "The candles smell of old dust."; Blow: give self general; "Your breath seems to pass through the candle flames without disturbing them."; Receive: if (noun == torch) { if (torch has light) "The wax does not even soften."; print "You hold the torch over a candle, but the flame seems to pass through the straw without a trace. The candles"; if (self hasnt general) print ", you realize,"; give self general; " radiate no heat."; } give self general; "You pass ", (the) noun, " through a candle flame to no effect."; BerryBurn: give self general; "You flick an orange berry at a candle. The steady flame is momentarily drowned out by crackling, sizzling droplets -- but then the berry is gone. The candle burns on, strangely unaffected."; BerryFreeze: give self general; "You flick a white berry at a candle. The wax is momentarily frosted over -- but the flame burns steadily on, strangely unaffected."; ], has pluralname scenery ~general; MaskClass -> whitemask with name_wd 'white', name_str "white", count 1, description [; GuideTakingMessage.invoke(self); give self general; WitnessMask(self); print "It looks like a paper mask, half life-size... but its curves are a delicately-shaded illusion. The mask is flat -- an inexplicable cutout of a human face.^^ You can tell little about the person depicted. You have only an impression of unformed childhood"; if (self hasnt moved) print ".^^Something about the mask seems familiar -- not recognizable, but comfortable. As if it belonged to you -- unlike everything else around you"; "."; ], describe [; if (self hasnt moved && self hasnt general) rtrue; WitnessMask(self); ], after [; Take: if (self hasnt general) { give self general; "You search through the clutter, discovering a white paper mask."; } ], invoke [; if (self hasnt general) { give self general; WitnessMask(self); if (self in Study) print "^Something in the chaos catches your eye. It looks like a white papier-mache mask, lying beside the desk.^"; } ], has ~general; [ StudySearched obj ix; if (obj has helpflag) return; give obj helpflag; if (Hall3 has visited) rfalse; if (GuideSearchStudyObject.helpmode >= 0) { ix = GuideSearchStudyObject.count(); if (ix >= GuideSearchStudyList-->0) { GuideEnqueue(GuideSearchStudyDoneMessage); } else if (ix >= GuideSearchStudyObject.helpmode+3) { GuideEnqueue(GuideSearchStudySomeMessage); } } ]; ! ---- Object SittingRoom "Sitting Room" with description [ ix; print "This room seems more inviting. The walls are painted with delicate patterns of flowers, which merge into a soft-hued carpet beneath your feet. Two chairs and a cushioned settee face a bright-flickering fireplace on the far wall.^^"; ix = child(wallhook); if (ix) print "A ", (name) ix, " hangs above the fireplace.^^"; else print "You see an empty hook above the fireplace.^^"; print "You see doorways to the south and in the southeast corner of the room. A white-painted door to the east is"; if (sittingdoor has open) print " open"; else print " closed"; "."; ], e_to [; if (sittingdoor hasnt open) { GuideLockedDoorsMessage.invoke(sittingdoor); print "The white door is closed"; if (sittingdoor has locked) print " and locked"; "."; } return sittingdoor; ], s_to Study, se_to MirrorRoom, cant_go "You can go south, southeast, or through the east door.", before [; Exit: if (player in settee or leatherchair or wickerchair) { move player to self; "You stand up."; } ], coredir se_obj, coredirmod DIRMOD_NEAR; SceneryObject -> sittingscenery with name 'sitting' 'room'; FloorObject -> sittingfloor with name 'carpet' 'rug', short_name "carpet", description [; print "The carpet is soft and stretches entirely across the room. Delicate colors run across it, like sprays of flower petals"; if (~~Enlightened) print ". You cannot imagine how it was woven"; "."; ], before [; Touch, Rub: "The carpet is richly soft."; LookUnder: "Looks like a plain wooden floor."; Push, Pull: "The carpet is too big to easily move aside. Besides, there's furniture on it."; ]; WallObject -> sittingwall with name 'delicate' 'pattern' 'patterns' 'flower' 'flowers', description "The walls are covered with tiny painted flowers, as if an artist had worked for weeks on this single room."; Object -> fireplace "fireplace" with name 'brick' 'fireplace' 'fire' 'flame' 'flames', description "If you doubted this was a dreamhold, you're certain now... the fireplace holds no wood, no ash. An odd basket of coiled silver wire holds a heap of glassy, glowing, cherry-red spheres. Insubstantial flames flicker above the spheres, and a mild warmth touches your face and body. But the spheres do not truly burn; they are not consumed.", before [; Search: <>; Receive: <>; BerryBurn, BerryFreeze: <<(action) basket>>; Enter: "The fireplace is rather too small for you. There isn't even a chimney to climb."; Touch: if (glove has worn) rfalse; "The brick of the fireplace is gently warm."; Blow: <>; ], has scenery transparent; Object -> -> basket "silver basket" with name 'silver' 'wire' 'coil' 'coiled' 'basket' 'conical' 'cone', description "Instead of a grate, the fireplace contains a strange construction of gleaming silver wire: a spiralled cone, mouth-up, which is full of glassy red spheres.", before [; Search: <>; Receive: if (noun == sphere) { remove sphere; "You drop your sphere back onto the glowing heap. Light kindles in its heart as it rejoins its fellows."; } if (noun == torch) { if (torch has light) "You thrust the burning torch into the fireplace. But the spheres do not seem to react. Their insubstantial flames flicker through the sooty true-fire like shadows through glass."; "You thrust the torch into the fireplace. But whatever force burns in the glassy spheres is not true fire. The torch vibrates slightly, but it does not catch."; } "Whatever makes the fireplace work, ", (the) noun, " can't belong there."; Touch, Rub: if (glove hasnt worn) "Ow! You yank back your hand and rub stinging fingers. The silver wire isn't exactly ", (emph) "hot", " -- though the spheres radiate warmth -- but touching the basket is a burning, humming sensation, which would surely turn to pain if prolonged a moment more."; Take, Push, Pull, Turn: if (glove hasnt worn) <>; "The silver wire basket is fixed inside the fireplace."; BerryBurn: "You flick an orange berry into the fireplace. The glowing spheres are momentarily lit with a brighter incandescence, but the crackling juices quickly burn themselves away."; BerryFreeze: "You flick a white berry into the fireplace. Frost glitters for a moment on the glowing spheres, but their warmth quickly dissipates it."; ], has scenery; Object -> -> sphereheap "heap of spheres" with name 'heap' 'of' 'spheres' 'glass' 'glassy' 'red' 'cherry' 'cherry-red' 'glowing', parse_name [ wd num spherethere; spherethere = ~~(IndirectlyContains(location, sphere)); wd = NextWord(); while (WordInProperty(wd, self, name) || (spherethere && wd == 'sphere')) { num++; wd = NextWord(); } return num; ], description "The conical wire basket is heaped high with glassy spheres, each the size of a small plum. The spheres are deeply translucent, shining with an inner red light and radiant heat.", before [; Search: "The spheres actually appear to be of a greyish glass, but each glows with a cherry-red light deep within."; Receive: <>; BerryBurn, BerryFreeze: <<(action) basket>>; Touch, Rub: if (glove has worn) "You prod the spheres with a gloved finger. Seems to be safe enough."; "Ow! Despite the mildness of the spheres' warmth, their surface holds some humming, stinging sensation which hovers on the edge of pain. You cannot touch them for even a moment."; Push, Pull, Turn: <>; Blow: "Whatever forms this strange fire, it can neither be breathed higher nor blown out."; Take: if (glove hasnt worn) <>; if (parent(sphere) ~= nothing) { print "You already have one sphere from the fireplace."; if (~~IndirectlyContains(location, sphere)) print " (Even if you've left it lying around here somewhere...)"; " Carrying around more is unlikely to be helpful."; } move sphere to player; PronounNotice(sphere); print "With your gloved hand, you pluck one sphere from the glowing heap. Almost immediately, its red light fades, leaving a dim grey glassiness"; if (self hasnt general) { give self general; print ".^^Hmm. You cautiously hold your other hand above the grey sphere, then touch it. You feel only cool glass"; } "."; ], has scenery ~general; Object -> wallhook "hook" with name 'empty' 'hook', description [ ix; ix = child(self); if (ix) "The hook is concealed behind ", (the) ix, "."; "It's just a small hook, embedded in the wall over the fireplace, where a painting once hung."; ], before [ ix; ix = child(self); Receive: if (ix) print_ret (The) ix, " is already hanging on the hook."; if (noun ~= desertpainting or mountainpainting) "The hook is suitable only for hanging paintings."; move noun to self; "You hang ", (the) noun, " over the fireplace."; Touch, Search: if (ix) "The hook is concealed behind ", (the) ix, "."; rfalse; Take, Push, Pull, Turn: if (ix) "The hook is concealed behind ", (the) ix, "."; "The hook is firmly embedded in the wall."; ], after [; LetGo: "You lift ", (the) noun, " down from its hook."; ], react_before [; PutOver: if (second == fireplace) <>; ], has transparent scenery container open; Object -> -> desertpainting "desert landscape painting" with name 'stark' 'desert' 'landscape' 'painting' 'picture', description [; print "The painting shows a stark, rocky desert at dawn. The sunlight stains the dusty stones to harsh scarlets and rust; but the land seems serene for all that, unthreatened.^"; MaskPaintingDesc(ArtDesert, "on the sand"); rtrue; ], before [; Search: <>; ], has transparent; SittableClass -> settee "settee" with name 'cushion' 'cushions' 'green' 'velvet' 'cushioned' 'wide' 'settee', description "In the center of the room, a wide settee faces the fireplace. Its drapes and cushions are swathed in velvet of worn eggshell-green.", before [; Take, Push, Pull: "The settee is much too heavy to move around."; LookUnder: "Not even dust."; ], after [; Enter: "You plump down on the cushioned settee."; ], has scenery enterable supporter; SittableClass -> leatherchair "leather armchair" with name 'leather' 'arm' 'armchair' 'chair' 'chairs//p', description "A rather fat and lumpy leather armchair rests here, facing the fire.", before [; Take, Push, Pull: "The armchair is too heavy to move."; ], after [; Enter: print_ret "You sit down on ", (the) self, "."; ], has scenery enterable supporter; SittableClass -> wickerchair "wicker chair" with name 'wicker' 'severe' 'chair' 'chairs//p', description "A severe chair of wood and wicker stands by the wall.", before [; Take, Push, Pull: "The wicker chair doesn't look like it ought to be heavy... but you can't move it. Perhaps the wizard has strict ideas about furniture arrangement."; ], after [; Enter: print_ret "You sit down on ", (the) self, "."; ], has scenery enterable supporter; Object -> sittingdoor "white door" with name 'door' 'white' 'white-painted' 'painted' 'ornate' 'copper' 'knob' 'doorknob' 'keyhole', description [; print "The door is neatly carpentered in panels, and painted white. It has an ornate copper doorknob and a tiny keyhole. The door is"; if (self has open) " open."; else " closed."; ], door_dir e_to, door_to Hall3, with_key hallkey, before [; Open: if (self has locked) GuideLockedDoorsMessage.invoke(self); rfalse; Lock, Unlock: if (second == labkey) { GuideLockedWrongKeyMessage.invoke(self); print_ret (The) second, " is too large to fit the door's small lock."; } if (second ~= self.with_key) { GuideLockedDoorsMessage.invoke(self); print_ret (The) second, " is unlikely to lock or unlock anything."; } if (action == ##Lock && self has locked) "The door is already locked."; if (action == ##Unlock && self hasnt locked) "The door is already unlocked."; Turn: <>; Receive: if (noun ofclass KeyClass && receive_action == ##Insert) { GuideEnqueue(GuidePutKeyInObject); <>; } Attack: if (self has open) print_ret (The) self, " is open."; "No answer."; Search: if (self has open) print_ret (The) self, " is open."; "You can't see anything through the keyhole."; ], after [; Unlock: give self open; "The copper key unlocks the door. You turn the knob and swing it open."; ], has door openable ~open locked lockable scenery; Object sphere "grey glass sphere" with name 'grey' 'gray' 'glassy' 'glass' 'sphere', short_name [; if (self.number) { ColorString(self.number); print " glass sphere"; rtrue; } ], parse_name [ wd num ix; ix = self.number; wd = NextWord(); while (WordInProperty(wd, self, name) || (MatchColorWord(ix, wd))) { num++; wd = NextWord(); } return num; ], number 0, description [; if (self.number) { print "It's the size of a small plum. Beneath the glassy surface, a "; LongColorString(self.number); " light burns."; } "It's the size of a small plum, with a glassy sheen and a dim, smoky interior."; ], before [; Search: print "You can see nothing within the "; if (self.number) ColorString(self.number); else print "grey"; " glass."; Touch, Rub: if (self.number) { if (glove has worn) "You prod the sphere with a gloved finger. Seems to be safe enough."; "The sphere burns with some stinging, tingling sensation. You cannot touch it bare-handed, not even for a moment."; } "Hard and cool."; ], scaleweight 118; ! ---- Object MirrorRoom "Curtained Room" with description "The walls of this small room are entirely swathed in heavy brocade curtains. The only openings are to the west and northwest, and a closed lead-slab door to the south.", w_to Study, nw_to SittingRoom, s_to [; if (mirrordoor hasnt open) { GuideLockedDoorsMessage.invoke(mirrordoor); print "The leaden door is closed"; if (mirrordoor has locked) print " and locked"; "."; } return mirrordoor; ], cant_go "You can go west, northwest, or through the south door.", before [; Listen: if (noun == nothing) <>; Exit: if (player in mirrorchair) { move player to self; mirror.invoke(); rtrue; } ], coredir "[BUG]"; SceneryObject -> mirrorscenery with name 'curtained' 'room'; WallObject -> mirrorwall with name 'heavy' 'silk' 'brocade' 'cloth' 'curtain' 'curtains', short_name "curtains", description "Curtains of dark silk brocade fall from ceiling to floor, all around you. The rough folds seem to soak up sound; the silence drags at you.", before [; Touch: "The curtains are heavier than they look."; LookBehind, Search: "You push the curtains aside, here and there. Nothing is concealed behind any of them except for bare wooden wall."; Open, Close, Push, Pull: "The curtains are fixed overhead. They don't open or close."; Listen: "The room is unnaturally silent, damped by the hanging cloth all around."; ], has pluralname; Object -> mirroropenings "openings" with name 'openings' 'gaps', description [; return MirrorRoom.cant_go(); ], before [; Enter: <>; ], has pluralname scenery; Object -> mirrordoor "lead door" with name 'door' 'keyhole' 'lead' 'leaden' 'lead-slab' 'dull' 'grey' 'gray' 'sheet' 'slab' 'bar' 'opening' 'opening-bar', description "The door appears to be a single slab of dull grey lead. (Perhaps only a sheet of lead covering ordinary wood, but... you don't think so.) It has no knob -- only a small keyhole beneath the heavy opening-bar.", door_dir s_to, door_to MirrorRoom, with_key falsekey, before [; Open: if (self has locked) GuideLockedDoorsMessage.invoke(self); rfalse; Lock, Unlock: if (second == labkey or hallkey) { GuideLockedWrongKeyMessage.invoke(self); print_ret (The) second, " does not fit the door's keyhole."; } if (second ~= self.with_key) { GuideLockedDoorsMessage.invoke(self); print_ret (The) second, " is unlikely to lock or unlock anything."; } "[BUG] falsekey used."; Turn, Push, Pull: <>; Receive: if (noun ofclass KeyClass && receive_action == ##Insert) { GuideEnqueue(GuidePutKeyInObject); <>; } Attack: "You can't knock hard enough to make a sound."; Search: "Nothing is visible through the keyhole."; ], has door openable ~open locked lockable scenery; Object -> mirror "mirror" with name 'mirror' 'oval' 'tall' 'standing' 'frame' 'glass', parse_name [ wd num accept; accept = (player in mirrorchair); wd = NextWord(); while (WordInProperty(wd, self, name) || (accept && (wd == 'face' or 'form' or 'reflection' or 'blank' or 'void'))) { num++; wd = NextWord(); } return num; ], description [ val obj ix st; val = 0; objectloop (obj in player) { if (obj ofclass MaskClass) val++; } OfferHint(HintoUsing); if (player notin mirrorchair) "It seems to be a plain oval mirror, suspended in a frame of iron bars. You can't look directly into it from where you're standing."; if (Enlightened) { "Your reflection is a patchwork -- fragments orbiting lazily above the chair. You nonetheless feel sure that one is missing."; } if (self hasnt general) { give self general; print "You blink and stare into the mirror. How odd.^^ The mirror reflects your chair, and the curtains behind you, perfectly. But your own form is unclear -- as if the mirror were touched with some distorting oil. The blurring is strongest around your upper body; your head appears to be a faceless blank.^^ Nervously, you raise your hand to your own face. Everything ", (emph) "feels", " in its place. But your reflection has raised a blurred hand to a featureless void"; st = "And"; } else { print "Your reflection is strangely blurred. The distortion is strongest around your upper body; your head appears to be a faceless blank"; st = "But"; } if (val) { HintoUsing.count = HintoUsing.count | $4; print ".^^", (string) st; if (val == 1) print " a"; print " dim "; ix = 0; objectloop (obj in player) { if (obj ofclass MaskClass) { if (ix > 0) { if (val == 2) print " and "; else if (ix+1 == val) print ", and "; else print ", "; } print (string) obj.name_str; ix++; } } if (val == 1) print " shadow seems to flit around your reflected body. Then it is gone"; else print " shadows seem to flit around your reflected body. Then they are gone"; } "."; ], initial [; if (player in mirrorchair) "Directly in front of you is a tall mirror in a standing frame."; "In the center of the room is a massive, high-backed chair of some pale wood. Directly before it is a tall mirror in a standing frame."; ], before [; Search: <>; Touch, Rub: "The mirror is smooth, perfectly flat, and perfectly clean."; Enter: OfferHint(HintoUsing); "Perhaps in some wizard's home you could step into a mirror. But not this one."; Take, Push, Pull, Turn: "The mirror frame is anchored to the floor."; Receive: if (noun == maskshred) { if (player notin mirrorchair) "You hold ", (the) noun, " against the glass. Nothing happens, since you're not sitting in front of the mirror."; print "You hold ", (the) noun, " up against the mirror, over the reflection of your eye.^^ And then it is gone, and your reflection is complete.^^"; deadflag = 3; print (emph) "--the mail-clad mob swirled, and turned, and began to run. Of course it was too late. You watched their life force separate into strands... still swirling. Interesting. You regarded the scene until the last tendrils dissipated. There had been a pattern to it, beyond the overlay of animal pain and terror.", "^^"; print (emph) "You returned to your cityworld, considering a possible theorem. Further interruptions would be unlikely, for at least a generation, and you needed the time to think.", "^^"; print_ret "And you have made good use of that time. The mistake in your portal diagram is obvious in retrospect. A thousand worlds await beyond that threshold; and you plan to make use of them all."; } if (player in mirrorchair && noun ofclass MaskClass) { give self general; HintoUsing.count = HintoUsing.count | $40; print "You hold ", (the) noun, " up against the mirror, over the reflection of your face"; if (noun.count == 0) ". [BUG] mask lacks count."; if (self.count && self.count.count > noun.count) { HintoUsing.count = HintoUsing.count | $100; OfferHint(HintoUsing); multiflag = false; ". But it doesn't seem to want to go. It slides away, like a lid on a jar that won't quite fit."; } self.count = noun; move noun to self; noun.mask_mirrored = true; print ". Then the mask is no longer in your grasp; it seems to float in the surface of the mirror"; if (noun == whitemask) print ". Or is it now worn by your reflection?^"; else print ".^"; MaskFlash(self.count.count); if (children(self) == 7) { Enlightened = true; print "^^^And your mind, splintered and cleaved as it is, begins to draw together. The masks -- yes! elements of yourself; you see the structure! -- seek reabsorption. It will be slow, but unceasing.^"; } rtrue; } OfferHint(HintoUsing); print "You press ", (the) noun, " against the mirror glass. Nothing seems to happen"; self.number++; if (self.number > 2) { self.number = 1; print ". You look into the mirror, which reflects only folds of brocade from this off-angle, and wonder if anything is supposed to"; } "."; ], number 0, count nothing, invoke [ ix; self.count = nothing; print "You stand up from the chair"; ix = children(self); if (ix) { if (Enlightened) { print ", as layers of memory shift like waves within you.^^One layer is still broken and half-blind. The missing fragment of the seventh. What part of you..."; while (child(self)) { remove child(self); } } else { print ".^^Something whispers through the air. You turn to see"; if (ix == 1) print " ", (the) child(self); else print " ", (EnglishNumber) ix, " masks"; print " fluttering down to the seat behind you"; while (child(self)) { move child(self) to mirrorchair; } } } "."; ], has static ~general; SittableClass -> mirrorchair "chair" with name 'massive' 'chair' 'seat' 'pale' 'wood' 'throne' 'base' 'back' 'arms', description "The chair is cut from heavy planks of pale wood. It has a solid base, high arms and back -- nearly a throne, you think. The joinery is rough, but the surface has been finished to a smooth fineness. The chair is positioned in front of a standing mirror.", before [; LookUnder: "You cannot see under the chair."; Push, Pull, Turn: "The chair is much too heavy."; Receive: if (receive_action == ##Insert) <>; ], after [; Enter: print_ret "You sit down in ", (the) self, ", facing the mirror."; ], has scenery enterable supporter; Object HintoUsing with hint_name "using the masks", hint_suppress [; if (MaskNumGotten < 7) rtrue; if (Enlightened) rtrue; ], count 0, description [ total; if (maskvoices hasnt moved) { total = (0 + IndirectlyContains(location, whitemask) + IndirectlyContains(location, goldmask) + IndirectlyContains(location, redmask) + IndirectlyContains(location, brownmask) + IndirectlyContains(location, greenmask) + IndirectlyContains(location, bluemask) + IndirectlyContains(location, blackmask)); print "You've acquired seven masks, which is all the masks you've seen in the game. They are obviously important in some way"; if (total == 7) { print ". Try picking them all up, and then looking around to see if anything changes."; rtrue; } print ". It's worth gathering them all together, to see if anything happens."; rtrue; } if (location ~= MirrorRoom) { if (maskvoices hasnt general) { print "The voices that you heard began when you picked up all seven masks at the same time. Likely they are a clue of some kind."; rtrue; } if (self.count & $1 == 0) { self.count = self.count | $1; print "The voices are likely a clue of some kind."; return 2; } if (self.count & $2 == 0) { self.count = self.count | $2; print "The voices are likely a clue of some kind. Try listening to them."; return 2; } print "The voices seem to come from a particular direction, depending on where you are. See if you can follow them to their source."; rtrue; } if (self.count & $8 == 0) { self.count = self.count | $8; print "The focus of this room is the mirror."; return 2; } if (self.count & $4 == 0) { print "The mirror is set up facing the chair. If you were sitting in the chair, you could see your reflection in it."; rtrue; } if (self.count & $10 == 0) { self.count = self.count | $10; print "The colors that flit in the mirror appear to match the masks that you are holding. There's almost certainly some connection."; return 2; } if (self.count & $40 == 0) { if (self.count & $20 == 0) { self.count = self.count | $20; print "You've never been able to wear these masks, because they are perfectly flat."; return 2; } if (self.count & $80 == 0) { self.count = self.count | $80; print "Each mask is as flat as a mirror."; return 2; } if (player notin mirrorchair) { print "The mirror only works if you can see your reflection in it. You'll have to sit down again."; rtrue; } print "Try putting one of the masks on your ", (emph) "reflection", ", instead of on yourself."; rtrue; } if (self.count & $100 == 0) { print "Might as well keep putting masks into the mirror."; rtrue; } if (self.count & $200 == 0) { self.count = self.count | $200; print "The mirror doesn't accept every mask. Which ones does it accept or reject? Look for a pattern."; return 2; } if (self.count & $400 == 0) { self.count = self.count | $400; print "You can get the masks back out of the mirror by standing up."; return 2; } if (self.count & $800 == 0) { self.count = self.count | $800; print "The order of placement matters."; return 2; } print "The order of placement matters. Consider other aspects of the masks, and how they relate to what you've learned in the course of the game. Or, alternatively, you can experiment and see what works."; rtrue; ]; ! ---- Global HintoBeginningCount = 0; [ HintoBeginning; if (sittingdoor has open) rfalse; if (sittingdoor hasnt locked) { print "The door"; if (location ~= SittingRoom) print " in the Sitting Room"; print " is now unlocked. You can open it and go east."; rtrue; } if (~~(SittingRoom has visited && Study has visited && MirrorRoom has visited)) { print "First, explore as much as you can. The two rooms"; if (location == Cell or BasementHall) print " down here are bare, but there are three rooms upstairs which you can reach right away"; else print " downstairs (where you started) are bare, but there are three rooms up here which you can reach right away"; print ". They're full of interesting stuff."; rtrue; } if (studytrunk hasnt general) { if (HintoBeginningCount & $1 == 0) { HintoBeginningCount = HintoBeginningCount | $1; print "You've seen three doors, all of them locked. There must be a key around here somewhere."; return 2; } if (HintoBeginningCount & $2 == 0) { HintoBeginningCount = HintoBeginningCount | $2; print "Examine everything you've seen."; return 2; } if (HintoBeginningCount & $4 == 0) { HintoBeginningCount = HintoBeginningCount | $4; print "Examine the trunk in the Study."; return 2; } if (HintoBeginningCount & $8 == 0) { HintoBeginningCount = HintoBeginningCount | $8; print "The trunk is closed. Have you tried opening it?"; return 2; } print "The command is ", (helpcmd) "open trunk", "."; if (location ~= Study) print " You'll have to go to the Study first, of course."; rtrue; } if (hallkey hasnt moved) { print "You found a key in the trunk"; if (location ~= Study) print " in the Study"; print ". It probably fits one of these locked doors."; rtrue; } if (hallkey notin player) { print "You'll have to pick the key back up in order to use it."; rtrue; } if (HintoBeginningCount & $10 == 0) { HintoBeginningCount = HintoBeginningCount | $10; print "Try unlocking each of the doors you've found with your key."; return 2; } if (HintoBeginningCount & $20 == 0) { HintoBeginningCount = HintoBeginningCount | $20; print "You can type ", (helpcmd) "unlock door with key", ". There are a few other ways to phrase that command -- ", (helpcmd) "open door with key", " or even ", (helpcmd) "put key in keyhole", " -- but ", (helpcmd) "unlock", " is most common in IF games."; return 2; } if (HintoBeginningCount & $40 == 0) { HintoBeginningCount = HintoBeginningCount | $40; print "If the key doesn't fit, try one of the other doors."; return 2; } print "The copper key unlocks the white door in the Sitting Room. (It has an ornate copper doorknob, did you notice?)"; rtrue; ];