! Ugh, sorry, in-line this time. ! Check line 1269 for teacup weirdness. I can't do pic ! manipulation and check 'coz I can't blorb... ! I still have a bug that won't let me finish but the ! walkthrough should work all the way up to the tome. ! I am going to try to do some modifications where I see 'em.--YHL !% -SD !% !============================================================================ Constant Story "MYSTERY HOUSE"; Constant Headline "^...Taken Over^"; !============================================================================ ! MYSTERY HOUSE Constants !============================================================================ ! Determines the number of turns that elapse before the "it is getting dark" ! message begins to appear; original number is 20. Constant TWILIGHT = 20; ! Determines the number of turns that elapse before darkness falls. ! Original number is Constant NIGHTFALL = 40; ! Determines the number of turns for which the fire will burn in the Dining ! Room before killing the player; original number is 2 Constant FIRE_DURATION = 2; ! Determines the number of turns for which the match will burn; ! original number is 4 Constant MATCH_DURATION = 4; ! Determines the number of shots in the gun; original number is 1. Constant AMMUNITION = 1; ! Determines the number of turns you have before Daisy kills you; orig is 2. Constant DAISY_PATIENCE = 2; ! Indicates objects that appear in the picture but not in the text room ! description. Most picturescenery is minimally implemented in the original. Attribute picturescenery; ! This is screen management for the graphical version; if you don't ! have some familiarity with Glulx, you should probably leave it alone. #ifdef TARGET_GLULX; Include "gwindefs"; #endif; Include "Parser"; ! This is screen management for the graphical version; if you don't ! have some familiarity with Glulx, you should probably leave it alone. #ifdef TARGET_GLULX; Include "gwincls"; Include "gwindows"; #endif; Global parse_exemption; !============================================================================ ! SCREEN MANAGEMENT ! ! We rely on GWindows, by L. Ross Raszewski, to handle the graphical screen ! aspect under Glulx. ! !============================================================================ ! For historical reasons, this list is not in the world's most logical order ! -- but that shouldn't matter. If you put an image of the correct name ! in the directory with the files and then run blorb with the provided ! resource file, your new image will automatically replace the older one. ! ! You should not have to touch this section, but if you must... ! ! If you want to remove an image completely and have removed all references ! to it, you can remove its constant declaration here and remove it from the ! blorb file, for some very slight savings in space. ! ! You can add images here if you add them in the blorb file as well. Start ! numbering your new images at 150. Constant front_yardPIC = 1; Constant porchPIC = 2; Constant at_stairwayPIC = 3; Constant attic1pic = 4; Constant attic2pic = 5; Constant back_yardPIC = 6; Constant basementPIC = 7; Constant bathroomPIC = 8; Constant boys_bedroomPIC = 9; Constant cabinetPIC = 10; Constant cemetaryPIC = 11; Constant chestPIC = 12; Constant dining_roomPIC = 13; Constant doorwayPIC = 14; Constant entry_hall3PIC = 15; Constant entry_hall2PIC = 16; Constant forestPIC = 17; ! No 18-23 Constant junctionPIC = 24; Constant keyPIC = 25; Constant kitchen1PIC = 26; Constant kitchen2PIC = 27; Constant large_bedroomPIC = 28; ! No 29 Constant note1PIC = 30; Constant note2PIC = 31; Constant note3PIC = 32; Constant note4PIC = 33; Constant nurseryPIC = 34; Constant on_stairwayPIC = 35; Constant pantryPIC= 36; Constant passagewayPIC= 37; Constant refrigeratorPIC= 38; Constant side_yardPIC= 39; ! Constant sinkPIC= 40; Constant small_bedroomPIC= 41; Constant storage_roomPIC= 42; Constant study1PIC= 43; Constant study2PIC= 44; Constant titlePIC= 45; ! No 46 Constant towerPIC= 47; Constant trapdoorPIC= 48; Constant treePIC= 49; Constant treetopPIC= 50; Constant tunnelPIC= 51; Constant chestemptyPIC = 52; Constant dining_roomno_candlePIC = 53; Constant holePIC = 54; Constant libraryno_notePIC = 55; ! Constant sinkemptyPIC = 56; Constant crawlspacePIC = 57; Constant refrigeratoremptyPIC = 58; Constant cabinetemptyPIC = 59; ! No 60 Constant note_itemPIC = 61; Constant front_door_openPIC = 62; Constant dining_room_openPIC = 63; Constant kitchen_openPIC = 64; Constant kc_openPIC = 65; Constant kf_openPIC = 66; Constant kfd_openPIC = 67; Constant kfc_openPIC = 68; Constant kdc_openPIC = 69; Constant kfdc_openPIC = 70; Constant kfdcm_openPIC = 71; Constant kfcm_openPIC = 100; Constant kdcm_openPIC = 73; Constant kfdm_openPIC = 74; Constant kfm_openPIC = 75; Constant kfdcm_holePIC = 76; Constant dr_fire_openPIC = 77; Constant dr_firePIC = 78; Constant dr_holePIC = 79; Constant dr_hole_openPIC = 80; Constant attic_no_hammerPIC = 81; Constant study_buttonPIC = 82; Constant backyard_openPIC = 83; Constant bygate_openPIC = 84; Constant byboth_openPIC = 85; ! No 86 ! Constant gate_closedPIC = 99; Constant open_trunkPIC = 87; Constant side_yard_closedPIC = 88; Constant kdm_openPIC = 89; Constant kcm_openPIC = 90; Constant kdcm_holePIC = 91; Constant km_holePIC = 92; Constant kdm_holePIC = 93; Constant kcm_holePIC = 94; Constant kfm_holePIC = 95; Constant kfdm_holePIC = 96; Constant kfcm_holePIC = 97; Constant Attic2_tdPIC = 98; Constant lib_openPIC = 101; Constant candle_itemPIC = 102; Constant pitcher_full_itemPIC = 103; ! No 104 Constant butterknifePIC = 105; Constant key_itemPIC = 106; Constant skeleton_key_itemPIC = 107; Constant basement_barePIC = 108; Constant picture_itemPIC = 109; Constant sledgehammer_itemPIC = 110; Constant gun_itemPIC = 111; Constant cemetary_dead_joePIC = 112; Constant cjd_gate_open_shovelPIC = 113; Constant cjd_gate_open_no_shovelPIC = 114; Constant cjd_gate_closed_no_shovelPIC = 115; Constant dagger_itemPIC = 116; Constant towel_itemPIC = 117; ! No 118 Constant basement_no_algae_no_keyPIC = 119; Constant basement_no_jewels_keyPIC = 120; Constant basement_no_jewels_no_keyPIC = 121; Constant basement_no_brick_keyPIC = 122; Constant basement_no_brick_no_keyPIC = 123; Constant large_bedroom_barePIC = 124; Constant dining_no_candle_openPIC = 125; Constant matches_itemPIC = 126; Constant pitcher_itemPIC = 127; Constant bathroom_barePIC = 128; Constant jewel_itemPIC = 129; Constant brick_itemPIC = 130; Constant basement_no_algae_keyPIC = 131; Constant shovel_itemPIC = 132; Constant attic_hammer_doorPIC = 133; Constant attic_hammer_door_closedPIC = 134; #ifdef TARGET_GLULX; Constant SETWIDTH = 560; Constant SETHEIGHT = 310; WindowPair root; TextBuffer -> mainwin; WindowPair -> imageswindows; Graphwin ->-> picwin with split 70, ! % of the screen that goes to the graphics split_dir winmethod_Above image titlePIC, real_width 0 0, real_height 0 0, update [ ; self.redraw(); ], ! This somewhat heinous set of instructions centers the ! image against a black background and scales so that it ! is as large as possible without losing proportionality redraw [ ima w h x y margin marginh obj spr top ; if (ima == 0) { if (self.closeup && self.closeup provides image && (self.closeup).image()) { if (TestScope(self.closeup)) ima = (self.closeup).image(); else ima = location.image(); } else ima = location.image(); } glk_image_get_info(ima,self.&real_width,self.&real_height); w = self.&real_width-->0; h = self.&real_height-->0; if (h == 0) { rfalse; } ! just in case graphics are missing; otherwise, crashes ! wipe the screen to black (you can change this to a white-wipe) ! by setting the second number to 1, or do other things if you ! get fancy with it glk_window_set_background_color(self.winid,0); glk_window_clear(self.winid); ! stop there, not drawing any picture, if it has gotten dark if (Darkness_Daemon has general) rfalse; ! figure out at what proportion to draw the chosen image, and ! draw it scaled to fit in the window without distortion -- ! if you want it to do this, uncomment this portion and remove the ! second portion ! x = (100*self.height)/h; ! size of the actual image ! y = (w*x)/100; ! margin = (self.width-y)/2; ! gwin_image_draw(self.winid,ima,margin,0,y,self.height); ! draw image centered in window at the set height and width. ! if you want not to do this, remove this portion. margin = (self.width-SETWIDTH)/2; marginh = (self.height-SETHEIGHT)/2; gwin_image_draw(self.winid,ima,margin,marginh,SETWIDTH,SETHE IGHT); ], closeup 0, has general; ! The original MH draws objects in a room directly over the room ! picture. We chose to be inaccurate about this part of the ! reproduction because making overlays look good puts a lot of ! restrictions on the artist -- a separate window for items in the ! room seemed a good compromise to allow people to add their own ! images without undue technical fuss. Graphwin ->-> portablewin, with image titlePIC, split 50, ! pixel height of window split_dir winmethod_Below, real_width 0 0, real_height 0 0, update [ ; self.redraw(); ], ! This somewhat heinous set of instructions centers the ! image against a black background and scales so that it ! is as large as possible without losing proportionality redraw [ w h x y margin obj spr top ima offset; offset = 0; ! wipe window glk_window_set_background_color(self.winid,0); glk_window_clear(self.winid); if (Darkness_Daemon has general) rfalse; objectloop(obj in location && obj provides sprite) { spr = obj.sprite(); glk_image_get_info(spr,self.&real_width,self.&real_height); w = self.&real_width-->0; h = self.&real_height-->0; gwin_image_draw(self.winid,spr,offset,0,w,h); offset = offset + w; } ], closeup 0, has general abssplit; [ InitGWindows; Active_UI=root; Main_GWindow=mainwin; ]; #endif; !============================================================================ ! TWO-WORD PARSER ! ! This parser emulates the original two-word parser of MHTO by accepting ! exactly one verb and one noun (with a few weird formations such as WATER ! ON). As a result, it is substantially inferior to the original Inform ! parser. ! ! There are a couple of ways in which this does not try to be true to the ! original, though. In particular, it leaves in UNDO and OOPS (which Inform ! catches early before regular parsing, for assorted reasons -- they could ! be torn out, but they add a great deal to playability). Similarly, the ! original Mystery House requires all input to be in upper case and ! refuses to recognize lower case input. This again seemed too dreary ! to bother reproducing. ! ! If you prefer a more sophisticated full-sentence parser, REMOVE THIS ! ENTIRE SECTION down to 'LIBRARY DEFAULTS'. The result should still ! compile and run, but with the addition of more recognized commands. ! (You will then have to add appropriate responses for those commands. You ! will also need to add a name to the front door that distinguishes it ! from other doors leading off the entry hall -- otherwise it will be ! hard to tell it from those when it comes to opening and unlocking it.) ! !============================================================================ Verb 'xxxxxxx' * -> EmptyVerb; [ EmptyVerbSub; rtrue; ]; ! If the verb is recognized, assign an action. If it isn't, ! print a generic not-understood message. [ BeforeParsing bpverb bpnoun index; if (parse_exemption) rfalse; ! pick up the first two words wn = 1; bpverb = NextWordStopped(); ! print (address) bpverb; wn = 2; bpnoun = NextWordStopped(); ! print (address) bpnoun; if (bpnoun == NULL) index = 1; if (InterpretVerb(bpverb, index)) { RemapBuffer(); rtrue; } if (index == 1) { RemapBuffer(); if (bpverb == 'look') <>; else "I DONT UNDERSTAND WHAT YOU MEAN"; } if (InterpretNoun(bpnoun)) { RemapBuffer(); rtrue; } ]; [ InterpretVerb bpverb index; switch(bpverb) { ! lie is there presumably for the case of LIE DOWN, but the original ! game does not actually check to see whether the second word is ! in fact down 'drink', 'sip', 'taste': action = ##Drink; 'use', 'with': action = ##Use; 'shoot', 'fire': action = ##Shoot; 'press', 'push', 'turn', 'push', 'slide', 'move': action = ##push; 'faucet', 'turn', 'water', 'on': action = ##TurnOnWater; 'off': action = ##TurnOffWater; 'unlight': action = ##Blow; 'look', 'examine': action = ##examine; 'light', 'strike': action = ##Burn; 'lift', 'take', 'get': action = ##Take; 'dump', 'drop', 'set', 'leave': action = ##Drop; 'kill', 'slay': action = ##Attack; 'eat', 'consume': action = ##Eat; 'wipe', 'rub', 'remove': action = ##Rub; ! 'flush': action = ##Flush; 'open': action = ##Open; 'close', 'shut': action = ##Close; 'unlock', 'unlatch': action = ##UnlockEasy; 'break', 'tear', 'bust': action = ##Attack; 'pour': action = ##Pour; 'read': action = ##Read; 'talk', 'speak': action = ##answer; 'go': action = ##Go; 'unscrew', 'unbolt', 'loosen': action = ##loosen; ! intransitive verbs should execute immediately without further ! checks, unless a noun was supplied, in which case they should ! fall through to the next stage 'save', 'store': if (index == 1) <>; else action = ##save; 'restore': if (index == 1) <>; else action = ##restore; 'quit', 'bye', 'stop': if (index == 1) <>; 'jump', 'leap': if (index == 1) <>; 'u//', 'up', 'climb', 'ascend': if (index == 1) <>; else action = ##climb; 'd//', 'down', 'descend': if (index == 1) <>; else "I DONT UNDERSTAND WHAT YOU MEAN"; 'n//', 'north': if (index == 1) <>; else "I DONT UNDERSTAND WHAT YOU MEAN"; 'w//', 'west': if (index == 1) <>; else "I DONT UNDERSTAND WHAT YOU MEAN"; 's//', 'south': if (index == 1) <>; else "I DONT UNDERSTAND WHAT YOU MEAN"; 'e//', 'east': if (index == 1) <>; else "I DONT UNDERSTAND WHAT YOU MEAN"; 'help': if (index == 1) <>; 'inventory', 'inven', 'carrying': if (index == 1) <>; 'sleep', 'rest', 'retire', 'lie': if (index == 1) <>; 'fuck', 'suck', 'shit', 'cunt': if (index == 1) <>; ! A score command is recorded among the source code for MHTO but ! if it is typed in the game, nothing happens. 'score': "I DONT UNDERSTAND WHAT YOU MEAN"; ! counter-intuitively, the original game understands "RUN STAIRS" ! but not "RUN NORTH" 'enter', 'run', 'exit', 'leave', 'walk': action = ##go; default: print "I DONT KNOW HOW TO "; ReprintWord(1); " SOMETHING"; } rfalse; ]; [ InterpretNoun bpnoun x matched in_scope matched_scope ; ! start by trying to match the word against a noun in the game, ! noting whether the object is something found in sight. objectloop(x) { if (WordInProperty(bpnoun,x,name)) { in_scope = TestScope(x); if (in_scope) { ! uh oh! there's more than one thing in scope of that name! ! this shouldn't happen in the original version. ! But, in fact, MHTO doesn't really worry about this too much; ! it just selects one of the options, unless the options ! are doors. if (matched_scope == 1) { if (matched has door && action == ##Go) "WHICH DIRECTION?"; } matched = x; matched_scope = 1; } if (in_scope == 0 && matched_scope == 0) { matched = x; matched_scope = 0; } } } switch(action) { ##restore: if (bpnoun == 'game') <>; ##save: if (bpnoun == 'game') <>; ##turnonwater: if (bpnoun == 'off') <>; <>; ##Examine: picwin.closeup = 0; if (bpnoun == 'room' or 'around') <>; if (matched == location) { ! (Total hack here) if (location == Tunnel) "IT IS LONG"; <>; } if (matched && matched provides image && matched.image()) { ! don't do closeups of portable objects if (~~(matched ofclass Note)) picwin.closeup = matched; } ##Read: if (matched in player && matched ofclass Note) { picwin.closeup = matched; } ##UnlockEasy, ##Open: ! This is because the disambiguation at this one point ! would get ugly otherwise. if (bpnoun == 'door' or 'doorway' && location == EntryHall) { matched = FrontDoor; } ##Drop: if (matched in player && matched == picwin.closeup) { picwin.closeup = 0; } ##Go: if (matched && matched hasnt enterable && matched notin compass && matched hasnt door) { "I DONT UNDERSTAND WHAT YOU MEAN"; } switch(bpnoun) { 'u//', 'up', 'climb', 'ascend': <>; 'd//', 'down', 'descend': <>; 'n//', 'north': <>; 'w//', 'west': <>; 's//', 'south': <>; 'e//', 'east': <>; } } ! give error message for the case that the action is known but the ! noun is not if (matched == 0) { print "I DONT KNOW HOW TO "; ReprintWord(1); print " A "; ReprintWord(2); new_line; rtrue; } ! give error message for the case that the noun *is* known, but ! not physically present if (matched && matched_scope == 0) { if (action == ##examine) "THERE IS NOTHING SPECIAL"; else "I DONT SEE IT HERE"; } else { ! we have identified a viable action and its noun; therefore ! perform the action and return true <<(action) matched>>; } rfalse; ]; ! replace the buffer contents with a dummy verb to cancel Inform's ! regularly-scheduled parsing actions [ RemapBuffer i; PrintToBuffer(buffer, 7, "xxxxxxx"); Tokenise__(buffer, parse); ]; [ ReprintWord i j k l m x; i--; #Ifdef TARGET_ZCODE; j = parse-->(i*2 + 1); #Ifnot; ! TARGET_GLULX j = parse-->(i*3 + 1); #Endif; ! TARGET_ k = WordAddress(i+1); l = WordLength(i+1); for (m=0 : mm; if (x > 96) x = x - 32; ! force UPPER CASE print (char) x; } ! The original always padded out the verb printing to eight characters. ! To get rid of this (it looks like "I DONT KNOW HOW TO LOOK A MAT") ! remove the last line here ("I DONT KNOW HOW TO LOOK A MAT", instead) for (m=m:m<8:m++) print " "; ]; !============================================================================ ! LIBRARY DEFAULTS !============================================================================ ! Library messages replaces Inform-standard messages with custom Mystery ! House ! messages. To get back the original Inform message set, simply delete this ! entire object. Object LibraryMessages, with before [ x; Close: switch(lm_n) { 2: if (lm_o has door) print "THE DOOR IS CLOSED^"; <>; default: <>; } Drop: <>; Examine: switch (lm_n) { 2: "A mere detail in the greater story, undeserving of attention."; ! default: ! "A meaningless line."; } Go: switch(lm_n) { 1: print "You'll have to get "; if (lm_o has supporter) print "off "; else print "out of "; print_ret (the) lm_o, " first."; 2: "That path is not offered to you."; 3, 4, 5: if (lm_o has locked) "The door stands locked against you."; else "The door is closed."; 6: print "You can't, since ", (the) lm_o; if (lm_o has pluralname) " lead nowhere."; else " leads nowhere."; default: "A meaningless line."; } Inv: switch(lm_n) { 1: <>; 2: print "You have with you"; rtrue; } ListMiscellany: rfalse; ! This is unfaithful to MHTO, for the simple ! reason that MHTO avoids listing contents of things for the most ! part -- it just shows you a picture. But instead of going with ! the rather elegant Inform version, we've substituted a ! Scott-Adams-esque list of objects. ! Bracketing in this response indicates that YOU CAN SEE does not ! appear in the original Mystery House. Look: switch(lm_n) { 4,5,6: ! print "You see: "; ! objectloop(x in lm_o) ! { ! if (x hasnt scenery && x hasnt concealed ! && x ~= player) print (name) x, " "; ! } ! print "^"; rtrue; } Miscellany: switch(lm_n) { 4: "No curtains to close, but the story is righted, your role is done."; ! winning message 5: "Watch the play unfold again?"; } Open: switch (lm_n) { 2: "It is locked."; 3: print "It is open.^"; <>; 4, 5: <>; ! successful actions are frequently not commented other than ! by redrawing the room image default: "A meaningless line."; } Prompt: print "^ > "; rtrue; Quit: rtrue; Search: switch (lm_n) { 5: "The ", (name) lm_o, " is closed"; 6, 7: print "[IN ", (name) lm_o, ":] "; objectloop(x in lm_o) { print (name) x, " "; } new_line; rtrue; } Sleep: "You lie in silence already."; ! changed Take: switch (lm_n) { 1: "Taken."; ! 1: <>; ! successful actions are frequently not commented other than ! by redrawing the room image 3: "I DONT KNOW WHAT YOU MEAN"; 5: "I DONT SEE IT HERE"; 10: "IT DOES NOT REMOVE"; 11: "IT DOESNT MOVE."; default: "A meaningless line."; } Unlock: switch (lm_n) { 3: "YOU HAVE NOTHING TO UNLOCK IT WITH"; 4: "OK"; default: "A meaningless line."; } save, restore: rtrue; default: if (deadflag == 0) "A meaningless line."; ]; ! To get back standard Inform behavior for any of these, remove both the ! replace command and the subsequent routine of the same name. ! Replace InvSub; Replace QuitSub; Replace StrongSub; Replace ScoreSub; ! Replace LookSub; Include "VerbLib"; [ ScoreSub; rfalse; ]; ! Here is another piece of game behavior you may want to rip out -- ! the original MH dumps the player unceremoniously back to the shell ! if he has the folly to use a rude word, without even offering a chance ! to save or restart. [ StrongSub; print "IF YOU FEEL THAT WAY I REFUSE TO PLAY WITH YOU..."; <>; ]; ! ! Inventory in the original MH is EXTREMELY bare... ! [ InvSub x; ! objectloop(x in player) ! { ! print (name) x, "^"; ! } ! <>; ! ]; ! With a charming egotism, MH interprets every answer that is not "NO" ! as "YES": of COURSE you would like to play again! [ QuitSub j; parse_exemption = 1; print "Start the story again? "; if (NotNo() == 0) { print "^A closing of the curtains.^"; KeyboardPrimitive(buffer, parse); #Ifdef TARGET_ZCODE; if (location == nothing || parent(player) == nothing) read buffer parse; else read buffer parse DrawStatusLine; j = parse->1; #Ifnot; ! TARGET_GLULX; KeyboardPrimitive(buffer, parse); j = parse-->0; #Endif; ! TARGET_ if (j) { ! player hit return parse_exemption = 0; } quit; } else { parse_exemption = 0; @restart; } ]; [ NotNo i j; for (::) { #Ifdef TARGET_ZCODE; if (location == nothing || parent(player) == nothing) read buffer parse; else read buffer parse DrawStatusLine; j = parse->1; #Ifnot; ! TARGET_GLULX; KeyboardPrimitive(buffer, parse); j = parse-->0; #Endif; ! TARGET_ if (j) { ! at least one word entered i = parse-->1; if (i == NO1__WD or NO2__WD or NO3__WD) rfalse; } rtrue; } ]; ! Finally, MH does not include the name of the room entered. Cutting ! this section and "replace LookSub" above will restore normal Inform ! behavior. ! [ LookSub allow_abbrev visibility_levels i j k nl_flag; ! if (parent(player) == 0) return RunTimeError(10); ! ! .MovedByInitial; ! ! if (location == thedark) { visibility_ceiling = thedark; NoteArrival(); } ! else { ! visibility_levels = FindVisibilityLevels(); ! if (visibility_ceiling == location) { ! NoteArrival(); ! if (visibility_ceiling ~= location) jump MovedByInitial; ! } ! } ! ! Printing the top line: e.g. ! ! Octagonal Room (on the table) (as Frodo) ! ! !--- this part is all gone!! --- ! ! ! The room description (if visible) ! ! if (lookmode < 3 && visibility_ceiling == location) { ! if ((allow_abbrev ~= 1) || (lookmode == 2) || (location hasnt ! visited)) { ! if (location.&describe ~= 0) RunRoutines(location, describe); ! else { ! if (location.description == 0) RunTimeError(11, location); ! else PrintOrRun(location, description); ! } ! } ! } ! ! if (visibility_ceiling == location) nl_flag = 1; ! ! if (visibility_levels == 0) Locale(thedark); ! else { ! for (i=player,j=visibility_levels : j>0: j--,i=parent(i)) give i ! workflag; ! ! for (j=visibility_levels : j>0 : j--) { ! for (i=player,k=0 : k>; } ], description [; "Grass and a piece of sky, nowhere sound. Steps lead up to the theatre--lead down to you.^ ^ A tower rises above it all."; ], u_to FrontStairs; Object fronttree "tower" FrontYard, with name "tower", description [; "A haughty structure."; ], has picturescenery static; Object sky "sky" FrontYard, with name "sky", description [; "Wide and clear, full of stars, though not your story."; ], has scenery; Object grass "grass" FrontYard, with name "grass" "garden", ! added name description [; "You know these colors."; ], has scenery; Object theatre "theatre" FrontYard, with name "theatre", description [; "Wooden. Silent."; ], has scenery; Object FrontStairs "stairs", with name "stairs" "steps" "stairway", found_in [; if (location == FrontYard or Porch) rtrue; rfalse; ], before [; climb: if (location == FrontYard) <>; else "Nowhere else to climb."; ], door_dir [; if (location == FrontYard) return u_to; return d_to; ], door_to [; if (location == FrontYard) return Porch; return FrontYard; ], has scenery open ~openable door; Room Porch "The Theatre's Mouth", with name "mouth" "porch", image [; if (FrontDoor has open) return front_door_openPIC; return porchPIC; ], description [; "Steps lead away from you. The door is opaque."; ], after [; Go: if ((noun == u_obj) && (self hasnt visited)) print "The footsteps are your own. The stairs now lead up to you, too.^"; ], d_to FrontStairs, in_to FrontDoor; Object FrontDoor "front door", with found_in EntryHall Porch, name "door" "doorway", door_dir [; if (location == EntryHall) return n_to; else return in_to; ], door_to [; if (location == EntryHall) return Porch; else return EntryHall; ], after [; open: if (location == Porch) "It slides, whisper-discreet."; ], has scenery openable lockable door; Room EntryHall "Foyer", with image [; if (people in self) { return Entry_Hall3PIC; } return Entry_Hall2PIC; ], initial [; if (self hasnt visited) { give FrontDoor locked; give FrontDoor ~open; "The door closes behind you with such care to silence that you feel your own voice wane."; } else { ClearEntry(); } ], description [; if (self hasnt visited) { "You're late to the play and all the players are here, every line in place, a moment in glass.^ ^ Gyre hunches over his gears and water-clock. Behind him, Rhio and Vross are looking at each other with the intent way of children or raptors, their hands palm to palm and untouching. Yvenna, elegant in a half-mask that covers her deformity, cocks her hand over a sheathed knife. Brien lies fallen; Orestis breathes some last benediction, some final penance, over him. And Inesse stands at the center, alone, her gaze encompassing the rest of them.^ ^ The tableaux are wordless; the tick-tick-click of the gears troubles you.^ ^ Silence waits here."; } else "Silence waits here, brooding, like your own."; ], e_to EntryHallLibDoor, w_to EntryHallKitchenDoor, s_to [; if (DiningRoom hasnt visited) print "The tableaux fade behind you.^"; return DiningRoom; ], n_to [; if (self hasnt general) { give self general; "You speak.^ ^ You don't speak. Silence emerges, and the door does not recognize it as words."; } else return FrontDoor; ], u_to [; print "Ascending, like a scale in an aria.^"; return EntryHallStairs; ]; Object EntryHallKitchenDoor "front door", with found_in EntryHall Kitchen, name "door" "doorway", door_dir [; if (location == EntryHall) return w_to; else return e_to; ], door_to [; if (location == EntryHall) return Kitchen; else return EntryHall; ], has scenery ~openable open door; Room Library "Bamboo Room", with image [; if (SideYardDoor has open) return lib_openPIC; return libraryno_notePIC; ], description [; "Where scrolls once dwelt."; ], w_to EntryHallLibDoor, e_to SideYardDoor; Object EntryHallLibDoor "door", with name "door" "doorway", found_in [; if (location == EntryHall or Library) rtrue; rfalse; ], door_dir [; if (location == EntryHall) return e_to; return w_to; ], door_to [; if (location == EntryHall) return Library; return EntryHall; ], has scenery ~openable open door; Object SideYardDoor "door", with name "door" "doorway", found_in [; if (location == SideYard or Library) rtrue; rfalse; ], door_dir [; if (location == SideYard) return w_to; return e_to; ], door_to [; if (location == SideYard) return Library; return SideYard; ], has scenery openable door; Room SideYard "Garden of Glass", with image [; if (SideYardDoor hasnt open) return side_yard_closedPIC; return side_yardPIC; ], description [; "Leaves and blossoms and curling vines, all glass and immutable. They do not quite block the way to the south."; ], w_to SideYardDoor, s_to BackYard; Room BackYard "Garden of Gears", with description [; "Brass and iron and enamel-ground teeth, all interlocking. A clock of skewed symmetry lies here, its hands broken off. Your gaze catches upon the hour-marks; there is an extra, a thirteenth hour, one which could be stolen out of the rest of day and in which secrets could be unmasked, lover's face to lover's face. The clock leans, in yet another imperfect meld, upon a glass box."; ], after [; Go: if ((noun == s_obj) && (self hasnt visited)) print "Glass melds with iron, iron with rust.^"; ], image [; if (Gate has open) { if (BackYardDoor has open) return byboth_openPIC; return bygate_openPIC; } else { if (BackYardDoor has open) return backyard_openPIC; return back_yardPIC; } ], n_to SideYard, nw_to BackYardDoor, e_to Gate; Object Gate "gate", with name "gate", found_in BackYard Cemetary, door_dir [; if (location == Cemetary) return w_to; else return e_to; ], door_to [; if (location == BackYard) return Cemetary; else return BackYard; ], has static picturescenery openable door; ! Brien lies dead in the cemetery. Room Cemetary "Graveyard of Dreams", ! was Cemetary with image [; if (JoeGravedigger notin location && JoeCorpse in location) { if (Gate hasnt open) { if (shovel has moved) return cjd_gate_closed_no_shovelPIC; return cemetary_dead_joePIC; } if (shovel hasnt moved) return cjd_gate_open_shovelPIC; else return cjd_gate_open_no_shovelPIC; } ! I suspect this clause is obselete, since there no "Brien ! is alive" situation? Commented out.--YHL ! if (Gate hasnt open) return gate_closedPIC; ! return CemetaryPIC; ], description [; "Boxes: of paper, of wood, of metal. They seem eerily like coffins. But each is open, save for the one of glass."; ], w_to Gate; Room Kitchen "Premeditations", ! Originally the Teahouse with image [ x; ! This picture has five variables: the openness of the door, ! fridge, and cabinet, whether or not the cabinet is ! pushed out, and whether the hole has been made. ! Since nested if-statements would be a pain with so many ! options, we use a slightly different approach. if (Kitchen_Door has open) x = x + 1; if (easel has general) x = x + 2; ! easel moved if (cabinet has open) x = x + 4; ! starglow present ! changed the below to the teacup-on-stool condition--YHL if (JugFull in stool) x = x + 8; ! teacup removed !YKL: present? if (Hole_Kitchen in Kitchen) x = x + 16; switch(x) { 0: return Kitchen1PIC; ! everything is where it starts 1: return kitchen_openPIC; ! door open, everything else closed 2: return Kitchen2PIC; ! cabinet moved, everything closed 3: return kdm_openPIC; ! door open, cabinet moved, ! everything else closed 4: return kc_openPIC; ! cabinet open, everything else closed 5: return kdc_openPIC; ! cabinet open and door open 6: return kcm_openPIC; ! cabinet open and moved 7: return kdcm_openPIC; ! cabinet open and moved, door open 8: return kf_openPIC; ! refrigerator open, all else closed 9: return kfd_openPIC; ! fridge and door open 10: return kfm_openPIC; ! fridge open and cabinet moved 11: return kfdm_openPIC; ! fridge open, cabinet moved, door open 12: return kfc_openPIC; ! fridge open, cabinet open 13: return kfdc_openPIC; ! fridge open, cabinet open, door open 14: return kfcm_openPIC; ! fridge open, cabinet open, cabinet ! moved 15: return kfdcm_openPIC; ! all open, cabinet moved 18: return km_holePIC; ! hole in wall, cab moved, all else ! closed 19: return kdm_holePIC; ! hole in wall, cab moved, door open 22: return kcm_holePIC; ! hole in wall, cab moved, cab open 23: return kdcm_holePIC; ! hole in wall, cab moved, door open, ! cab open 26: return kfm_holePIC; ! hole in wall, cab moved, fridge open 27: return kfdm_holePIC; ! hole in wall, cab moved, fridge ! open, door open 30: return kfcm_holePIC; ! hole in wall, everything open ! but door 31: return kfdcm_holePIC; ! hole in wall, everything open } ! A completely different, and perhaps saner, way to handle this ! problem would be to divide the room image into sections and ! draw piecemeal. We did not do that in this case, though, because ! it would have forced all contributors to use exactly the same ! proportions in their images. ], description [; "There is always a beginning. Here there are also an easel, a stool, and an orrery."; ], in_to [; if (Hole_Kitchen in Kitchen) return Hole_Kitchen; rfalse; ], w_to Kitchen_Door, e_to EntryHallKitchenDoor; Object Kitchen_Door "door (west)", with short_name [; if (location == Kitchen) print "door (west)"; else print "door (up)"; rtrue; ], name "door" "doorway", found_in Kitchen Forest_1, door_to [; if (location == Kitchen) return Forest_1; return Kitchen; ], door_dir [; if (location == Forest_1) return u_to; return w_to; ], react_before [; go: if (noun == u_obj && location == Forest_1 && self hasnt open) { "Out into the eye of water for tea. The door is closed."; } ], before [; enter: if (self hasnt open && location == Forest_1) "The door is closed."; ], after [; open: if (location == Forest_1) "Opened."; ], has static picturescenery door openable ~open; Room DiningRoom "Banquet", with number 0, image [; if (CandleUnlit hasnt moved) { if (BackYardDoor has open) return dining_room_openPIC; return dining_roomPIC; } else { if (Fire in DiningRoom) { if (BackYardDoor has open) return dr_fire_openPIC; else return dr_firePIC; } if (Hole in DiningRoom) { if (BackYardDoor has open) return dr_hole_openPIC; return dr_holePIC; } if (BackYardDoor has open) return dining_no_candle_openPIC; return dining_roomno_candlePIC; } ], before [; if (CandleLit in player && self hasnt general) { if (self.number == 1) { self.number = 2; rfalse; } give self general; StartDaemon(fire); move Fire to location; "You stumble across the threshold. Light spills from your lantern. The room is alight, fissuring into strange, unrhymed shapes."; } ], description [; "If one dined on dust and cobwebs, a god of hidden corners, this would be a banquet."; ], n_to EntryHall, S_to BackYardDoor; Object BackYardDoor "door", with name "door" "doorway", before [; Open: print "It whispers.^"; rfalse; ], found_in [; if (location == BackYard or DiningRoom) rtrue; rfalse; ], door_dir [; if (location == BackYard) return nw_to; return S_to; ], door_to [; if (location == BackYard) return DiningRoom; return BackYard; ], has static picturescenery openable door; !============================================================================ ! Upstairs area Room Junction "Crossroads", with image [; return junctionPIC; ], description [; "Choices that must be made; the story is as inexorable as time. Pathways lead in all directions: north, south, east, west."; ], d_to EntryHallStairs, e_to Doorway_3, w_to Doorway_1, n_to Stairway_1; Object EntryHallStairs "Stairway", with found_in Junction EntryHall, name "stairs" "steps" "stairway", before [; climb: if (location == EntryHall) <>; else "I DONT UNDERSTAND WHAT YOU MEAN"; ], door_dir [; if (location == Junction) return d_to; return u_to; ], door_to [; if (location == Junction) return EntryHall; return Junction; ], has scenery open ~openable door; Room Doorway_1 "Doorway", with description "Two doors, one before and one behind you, sentinels, unsleeping. Open.", image [; return doorwayPIC; ], e_to Junction, w_to Doorway_2, n_to NurseryDoor; Object NurseryDoor "door", with name "door" "doorway", found_in [; if (location == Nursery or Doorway_1) rtrue; rfalse; ], door_dir [; if (location == Nursery) return s_to; return n_to; ], door_to [; if (location == Nursery) return Doorway_1; return Nursery; ], has scenery ~openable open door; Room Nursery "Workshop", with image [; return nurseryPIC; ], description [; "Scuffed marks where the benches and tools are gone, all gone. Once the flight-patterns of birds were winched into the unwavering paths, in this place. Once clocks yielded the secret paths of time and music boxes played poisoned tunes for those who smiled but seldom."; ], s_to Doorway_1; Room Doorway_2 "Doorway", with image [; return doorwayPIC; ], description [; "Two doors, one before and one behind you, sentinels, unsleeping. Open."; ], e_to Doorway_1, n_to BoysBedroomDoor; Object BoysBedroomDoor "door", with name "door" "doorway", found_in [; if (location == BoysBedroom or Doorway_2) rtrue; rfalse; ], door_dir [; if (location == BoysBedroom) return s_to; return n_to; ], door_to [; if (location == BoysBedroom) return Doorway_2; return BoysBedroom; ], has scenery ~openable open door; Room BoysBedroom "Mistletoe Spring", with image [; ! includes NOTE return boys_bedroomPIC; ], description [; "A music stand; single peach branch, budded, unleafing. Pages tied in twine lie beneath the branch."; ], s_to Doorway_2; Room Doorway_3 "Doorway", with image [; return doorwayPIC; ], description [; "A doorway, black-rimmed."; ], w_to Junction, e_to Doorway_4, n_to LargeBedroomDoor; Object LargeBedroomDoor "door", with name "door" "doorway", found_in [; if (location == LargeBedroom or Doorway_3) rtrue; rfalse; ], door_dir [; if (location == LargeBedroom) return s_to; return n_to; ], door_to [; if (location == LargeBedroom) return Doorway_3; return LargeBedroom; ], has scenery ~openable open door; Room LargeBedroom "False Dawn", ! Yvenna's knife here with image [; if (dagger has moved) return large_bedroom_barePIC; return large_bedroomPIC; ], initial [; if (self hasnt visited) { "A clatter."; } ], description [; print "No true light here, only dim realizations wavering into grasp"; if (dagger in location) print ". Quiescent on the floor: Yvenna's knife, still sheathed"; "."; ], s_to Doorway_3; Room Doorway_4 "Doorway", with image [; return doorwayPIC; ], description [; "A doorway, white-rimmed."; ], w_to Doorway_3, n_to SmallBedroomDoor; Object SmallBedroomDoor "door", with name "door" "doorway", found_in [; if (location == SmallBedroom or Doorway_4) rtrue; rfalse; ], door_dir [; if (location == SmallBedroom) return s_to; return n_to; ], door_to [; if (location == SmallBedroom) return Doorway_4; return SmallBedroom; ], has scenery ~openable open door; Room SmallBedroom "Heart's Winter", ! Yvenna's box here with image [; return small_bedroomPIC; ], description [; "A half-mask lies propped upon the ground. Behind it, no face, only a glass box. The words within are proud, you know, and now they will never soften."; ], s_to Doorway_4; Room Stairway_1 "Stairs", with image [; return at_stairwayPIC; ], description [; "Upwards and downwards, upwards and downwards."; ], s_to Junction, u_to AtticStairs, n_to Doorway_5; Object AtticStairs "Stairway", with found_in Attic Stairway_1, name "stairs" "steps" "stairway", before [; climb: if (location == Stairway_1) <>; else "I DONT UNDERSTAND WHAT YOU MEAN"; ], door_dir [; if (location == Attic) return d_to; return u_to; ], door_to [; if (location == Attic) return Stairway_1; return Attic; ], has static picturescenery open ~openable door; Room Doorway_5 "Doorway", with image [; return doorwayPIC; ], description [; "An archway draped in petals."; ], s_to Stairway_1, in_to StudyDoor; Object StudyDoor "door", with name "arch" "archway", found_in [; if (location == Study or Doorway_5) rtrue; rfalse; ], door_dir [; if (location == Study) return out_to; return in_to; ], door_to [; if (location == Study) return Doorway_5; return Study; ], has scenery ~openable open door; Room Study "Meditations", with image [; if (SecretDoor in location) return study2PIC; if (button in location) return Study_ButtonPIC; return study1PIC; ], description [; "A lotus pond, poems calligraphed upon each floating leaf, is the mural."; ], ne_to [; if (SecretDoor in location) return SecretDoor; rfalse; ], e_to BathroomDoor, n_to Doorway_5; Room Bathroom "Carp Pond", ! Inesse's box here with image [; if (towel hasnt moved) return bathroomPIC; return bathroom_barePIC; ], description [; print "Water, folding and unfolding, and flecks of orange-gold that may or may not be carp, surfacing.^"; if (BillCorpse in carp_pond) print "^In the water floats a glass bowl.^"; if (towel in BillCorpse) print "^In the bowl rests a prayer-scroll, empty.^"; rtrue; ], w_to BathroomDoor; Object BathroomDoor "door", with name "door" "doorway", found_in [; if (location == Study or Bathroom) rtrue; rfalse; ], door_dir [; if (location == Study) return e_to; return w_to; ], door_to [; if (location == Study) return Bathroom; return Study; ], has open ~openable static picturescenery door; Room StorageRoom "Betrayal's Chart", with image [; if (trunk has open) return open_trunkPIC; return storage_roomPIC; ], description [; "The echoes of past seductions shiver through the air.^ ^ A hairline fracture mars the music-box upon the map."; ], w_to StorageRoomDoor; Object StorageRoomDoor "door", with name "door" "doorway", found_in [; if (location == StorageRoom or Attic) rtrue; rfalse; ], door_dir [; if (location == StorageRoom) return w_to; return e_to; ], door_to [; if (location == StorageRoom) return Attic; return StorageRoom; ], has door ~openable scenery open; Room Attic "The Hour Departs", with image [; ! actually, we should have a third picture here for the present ! but closed trap door if (trapdoor hasnt concealed) { if (trapdoor has open) { if (hammer hasnt moved) return attic_hammer_doorPIC; else return attic2pic; } else { if (hammer hasnt moved) return attic_hammer_door_closedPIC; else return Attic2_tdPIC; } } else { if (hammer hasnt moved) return attic1pic; return attic_no_hammerPIC; } ], description [; "A roost away from past or future--no, not high enough."; ], d_to AtticStairs, e_to StorageRoomDoor, u_to trapdoor; Object trapdoor "book", with name "book" "tome", before [; default: if (self has concealed) "You see it not."; ], found_in [; if (location == Attic or Tower) rtrue; rfalse; ], door_dir [; if (location == Attic) return u_to; return d_to; ], door_to [; if (location == Attic) return Tower; return Attic; ], has door openable static picturescenery concealed; Room Tower "Awakening/Shattering", with image [; return towerPIC; ], initial [; if (Rhio hasnt general && Rhio in Tower) { StartDaemon(Rhio); } ], description [; "You are in the glass; you are in the shadows; you are in the book."; ], d_to trapdoor; !============================================================================ ! Tunnel and tree Room PineTreeTop "Observatory", with image [; return treetopPIC; ], description [; "Here Gyre measured the movements of the stars."; ], before [; go: if (noun == Porch) ! equivalent to >GO HOUSE { "Easier to wend your way down the stairs."; } ], d_to PineTreeBase; Room PineTreeBase "Observatory", with image [; return treePIC; ], description [; "The telescope has ramifications beyond its position; of course. Gyre never thought in straight lines if she could help it."; ], u_to PineTreeTop, d_to Forest_5, s_to Tunnel; Room Tunnel "Tunnel", with name "tunnel", image [; return tunnelPIC; ], description [; "In the hidden ways, you are at the southmost resting point; north remains to you, and a closer passage outward."; ], n_to PineTreeBase, out_to Hole_Basement; !============================================================================ ! Forest Maze Class ForestRoom, class room, with short_name "Mirror's Mouth", image [; return ForestPIC; ], description [; "You are in mirrors, light upon light."; ]; ForestRoom Forest_1, with u_to Kitchen_Door, n_to Forest_2, s_to Forest_4, e_to Forest_8, w_to Forest_6; ForestRoom Forest_2, with n_to Forest_3, s_to Forest_2, e_to Forest_1, w_to Forest_2; ForestRoom Forest_3, with n_to Forest_4, s_to Forest_3, e_to Forest_2; ForestRoom Forest_4, with n_to Forest_5, s_to Forest_7, e_to Forest_3, w_to Forest_1; ForestRoom Forest_5, with n_to Forest_6, s_to Forest_5, e_to Forest_4, w_to Forest_8; ForestRoom Forest_6, with n_to Forest_7, s_to Forest_1, e_to Forest_5, w_to Forest_8; ForestRoom Forest_7, with n_to Forest_8, s_to Forest_7, e_to Forest_6, w_to Forest_4; ForestRoom Forest_8, with n_to Forest_1, s_to Forest_6, e_to Forest_7, w_to Forest_5; !============================================================================ ! Basement and pantry area ! changed Room SmallPantry "Schemes", with image [; return pantryPIC; ], description [; "Swan and leaf, glass and paper, the instruments of obsession."; ], in_to Hole_Pantry, d_to PassageStairs; Object PassageStairs "STAIRS", with name "STAIRS" "STEPS" "STAIRWAY", before [; climb: if (location == Passage) <>; else "I DONT UNDERSTAND WHAT YOU MEAN"; ], found_in [; if (location == SmallPantry or Passage) rtrue; rfalse; ], door_dir [; if (location == Passage) return u_to; return d_to; ], door_to [; if (location == Passage) return SmallPantry; return Passage; ], has open ~openable door scenery; ! changed Room Passage "Between Secrets", with image [; return passagewayPIC; ], description [; "You are caught northward, though an opposite pole beckons."; ], u_to PassageStairs, s_to MoistBasement; Room MoistBasement "Benediction", ! Orestis's box with image [ x; if (Algae hasnt general) { if (Skeleton_Key has moved) return basement_barePIC; else return basementPIC; } if (Brick in Moistbasement && Brick hasnt general) { if (Skeleton_Key has moved) return basement_no_algae_no_keyPIC; else return basement_no_algae_keyPIC; } if (Jewels has moved) { if (Skeleton_Key has moved) return basement_no_jewels_no_keyPIC; else return basement_no_jewels_keyPIC; } if (Brick has general) { if (Skeleton_Key has moved) return basement_no_brick_no_keyPIC ; else return basement_no_brick_keyPIC; } ], description [; print "Another glass box is here. "; if (Algae in location) print "Meditations and praises to the city's guardian ancestors are calligraphed across the walls."; ], n_to Passage, in_to Hole_Basement, u_to MoistStairs; Object MoistStairs "stairs", with name "steps" "stairs" "stairway", before [; climb: if (location == MoistBasement) <>; else "I DONT UNDERSTAND WHAT YOU MEAN"; ], found_in [; if (location == Stairway_2 or MoistBasement) rtrue; rfalse; ], door_to [; if (location == Stairway_2) return MoistBasement; return Stairway_2; ], door_dir [; if (location == Stairway_2) return d_to; return u_to; ], has door open ~openable scenery; ! description Room Stairway_2 "Stairway", with image [; return on_stairwayPIC; ], description [; "Steps up; steps down. The in and out, the rise and fall, of breath. Footsteps."; ], u_to MustyStairs, d_to MoistStairs; Room MustyCrawlspace "In Hiding", with image [; return crawlspacePIC; ], description [; "Once someone listened here while secrets were exchanged, trapped and unable to ascend."; ], d_to MustyStairs; Object MustyStairs "stairs", with name "steps" "stairs" "stairway", before [; climb: if (location == Stairway_2) <>; else "I DONT UNDERSTAND WHAT YOU MEAN"; ], found_in [; if (location == MustyCrawlspace or Stairway_2) rtrue; rfalse; ], door_to [; if (location == MustyCrawlspace) return Stairway_2; return MustyCrawlspace; ], door_dir [; if (location == MustyCrawlspace) return d_to; return u_to; ], has door open ~openable scenery; !============================================================================ ! Objects ! ! Objects except for the stairs (which are listed in place as though they ! were ! doors) are implemented in the same order in which they appear on the MHOK ! list, with the same names (or as close as Inform will accept). Class Note, with name "note" "scroll" "paper", sprite [; return note_itemPIC; ], description [; if (self notin player) "You hold no words, either of ink or voice."; "Words to read."; ]; Note Note_1 "program" EntryHall, ! The program with name "program", image [; return note1PIC; ], initial [; "A program lies discarded on the floor, one corner bent."; ], before [; Read: if (self notin player) "The photgraphy is black-and-white, the lines clear and stark. You cannot see more thoroughly from here."; ], invent "a program, with one bent corner", text [; "Lines and whorls of black on white, grey on black, particles of unhinged words. Empty. You surmise a story from the whole, but there is a hole in the story, this play."; ]; Note Note_2 "bamboo scroll" Library, ! bamboo-scroll-thing with name "bamboo" "scroll", initial "A scroll fashioned of bamboo pieces pierced together is unrolled here.", before [; Read: if (self notin player) "It does not even clatter, though it yearns toward you."; ], image [; return note2PIC; ], text [; "In your hands, it unwords. Rhio and Vross, sending messages by bird across the city, the chasm between desire and action."; ]; Note Note_3 "pages" BoysBedroom, ! the scored pages, trio with name "pages" "score", initial "Pages tied in twine lie beneath the branch.", invent "pages of a musical score.", image [; return note3PIC; ], text [; "A sparsely-scored trio, with rests where there should be notes, and the other way around, stems unfurling into hopeless pennants.^ ^ A song forms in your mouth. It tastes grey."; ]; Note Note_4 "NOTE" Tower, with image [; return note4PIC; ], text [; "There it is, the play, in all its rhymes and stanzas and the occasional cadenza of music. It is unworded. It lives, like you."; ]; ! Object WelcomeMat "WELCOME MAT" Porch, ! with name "WELCOME", ! 'mat' is not listed in the original ! has static picturescenery; Object dust "dust" DiningRoom, with name "dust", before [; Take: "Best left unstirred, like graves and passions."; ], has scenery; Object CandleUnlit "lantern" DiningRoom, ! the lantern with name "lantern", sprite [; return candle_itemPIC; ], initial [; "A lantern has died here."; ], invent "lantern, unlit", before [; burn: if (self notin player) "You do not hold it."; ! if (~~(IndirectlyContains(player, matches))) ! "YOU HAVE NOTHING TO LIGHT IT WITH"; if (location ~= Kitchen) "Nothing here to share light."; else { remove self; ! This is a hacky device to prevent the dining room from ! catching fire at the very first moment that you light ! the candle. if (location == DiningRoom) DiningRoom.number = 1; move CandleLit to player; print "The starglow heartens the lantern, and it beams"; StopDaemon (Darkness_Daemon); if (Darkness_Daemon.number > TWILIGHT) print ".^^The shadows are driven into retreat. They crouch beyond your feet like wolves"; "."; } ]; Object CandleLit "lantern", ! the lantern with name "lantern", sprite [; return candle_itemPIC; ], has light; Object Fire "FIRE", with name "FIRE", number 0, death_by_fire [; print "THE FIRE IS OUT OF CONTROL. YOU ARE DEAD^"; <>; ], before [; examine: self.death_by_fire(); rtrue; ], react_before [; go: self.death_by_fire(); rtrue; pour: if ((noun == JugFull) || (noun == tea)) { StopDaemon(self); remove self; remove JugFull; move JugEmpty to player; move Hole to location; print "The fragrance of tea meets the frenzy of light. The light yields.^ ^ One of the fissures remains, a piece of unjointed world upon the world, a glimpse of another dream's shard.^"; <>; } ], daemon [; ! nothing happens until you go to the dining room with the lit candle ! or try to move when you have it lit there if (location ~= DiningRoom) rfalse; self.number++; if (self in location && self.number > FIRE_DURATION) { self.death_by_fire(); rtrue; } ], has scenery; Object Cabinet "orrery" Kitchen, with name "orrery", image [; if (self hasnt on) rfalse; if (matches notin self) return cabinetemptyPIC; return cabinetPIC; ], description [; "A delicately crafted model of the planets."; ], when_on [; print "The orrery rotates in its merry epicycles. The gears go click-tick-tick, clack-tock-tock: a frozen heart, thawing.^ ^ A starglow rises above its central sun"; if (CandleUnlit in player) print ".^^Your lantern heartens at the starglow"; "."; ], before [; take: "Its weight defeats you."; push: if (self has on) { "It is already turning."; } else { move starglow to Kitchen; give self on; print "The orrery rotates in its merry epicycles. The gears go click-tick-tick, clack-tock-tock: a frozen heart, thawing.^ ^ A starglow rises above its central sun"; if (CandleUnlit in self) print ".^^Your lantern heartens at the starglow"; "."; } ], has switchable ~on; Object starglow "starglow", with name "starglow", before [; Take: <>; ], has light; Object Wall "wall" Kitchen, with name "wall", description [; print "Worn stones, uncertain mortar"; if (easel hasnt general) ", your view framed by the easel's lines."; "."; ], before [; attack: if (easel hasnt general) "The easel lies in your way."; else { if ((Hammer in player) && (Hammer hasnt general)) { move Hole_Kitchen to location; give Hole_Pantry open; "The wall crumbles; the hourglass fills with the sand of years turning."; } else if (Hammer has general) "The wall has already been destroyed."; else "Time will finish the job."; } ], has scenery; Object easel "easel" Kitchen, with name "easel", description [; print "A painting of crumbling stones leans upon the easel--no, it is the wall itself, behind the easel, that you glimpse"; if (obscura in easel) print ".^^Upon the easel, an obscura"; "."; ], before [; Receive: "You would not obscure your view of the painting."; Push, Pull: give self general; "You move the easel away from the wall."; ], has supporter transparent static; ! Object painting "painting" easel, ! with name "painting", ! description "An unfinished archway painted on this canvas: the merest ! line ! would complete it.", ! before [; ! Enter: ! if (self has general) ! <>; ! Take: ! if (self hasnt general) ! "The work is incomplete, and should not be disturbed."; ! else ! modified description for art parity--sorry!--YHL ! "The painting seems set just where it should be; ! the arch is elsewise before you."; ! ], ! has static; Object Hole_Kitchen "hole", with name "hole", before [; Enter: if (easel hasnt general) "The easel lies in your way."; ], door_to SmallPantry, door_dir in_to, has door open ~openable static picturescenery; ! Unlike the candle, the matches don't change their description when you ! happen to have a lit one, nor are they implemented as two separate ! objects. Object Matches "starglow" Cabinet, with name "starglow", description "A small, brilliant light.", number 0, sprite [; return matches_itemPIC; ], before [; ! burn: ! ! NB. that this code restarts the fuse if you light ! ! an already-lit match. This is true to the original. ! self.number = 0; ! give self light; ! StartDaemon(self); ! "OK"; ! ], ! daemon [; ! self.number++; ! if (self.number == MATCH_DURATION) ! { give self ~light; ! StopDaemon(self); ! "THE MATCH WENT OUT"; ! } ], has pluralname; ! Object Stove "stove" Kitchen, ! with name "STOVE" "RANGE" "PORCH", ! before [; ! burn: ! print "THE STOVE EXPLODES, YOU ARE DEAD^"; ! <>; ! ], ! has scenery; Object stool "stool" Kitchen, with name "stool", capacity 1, description [; print "Wooden, three-legged"; if ((jar in stool) && (JugFull in stool)) print ". Upon it, a teacup and a jar; the former offering lukewarm tea, the latter closed"; else { ! shouldn't these clauses be reversed? that is, ! jar = jar, JugFull = teacup?--YHL if (jar in stool) print "Upon it, a closed jar"; if (JugFull in stool) print "Upon it, a teacup offering lukewarm tea"; } "."; ], before [; Receive: if (JugFull notin self) "An artist once sat here; you cannot right this lack."; ], image [; if (self hasnt open) rfalse; if (JugEmpty in self) return refrigeratorPIC; else return refrigeratoremptyPIC; ], has scenery supporter transparent static; Object jar "jar" stool, with name "jar", description "An unlabeled jar.", before [; Open: print "The fumes that waft out snag in your throat. No more words, ever, for you.^^"; <>; ], has container ~open; Object JugEmpty "empty teacup", with name "teacup", article "an", description "A chipped teacup.", sprite [; return pitcher_itemPIC; ], before [; Receive: "Unbefitting for an instrument of the elegant tea ceremony."; ], has container; Object JugFull "filled teacup" stool, with name "filled" "teacup" "tea", description "A chipped teacup holding tea.", sprite [; return pitcher_full_itemPIC; ], has container; ! Are we keeping the object entire? I notice the image-bits are omitted. Object Sink "SINK" Kitchen, ! once the sink with name "SINK" "FAUCET" "TAP", ! image [; ! if (Butterknife in self) return ; ! return sinkemptyPIC; ! ], ! description [; ! if (Butterknife in self) "THERE IS A BUTTERKNIFE HERE"; ! else rfalse; ! ], has container open ~openable scenery; ! Object Butterknife "obscura" Sink, ! with name "BUTTERKNI", ! sprite [; ! return butterknifePIC; ! ], ! before [; ! use: ! ! The original game makes no distinction in answer if the ! ! picture has already been loosened ! if (picture in location) ! { ! give picture general; ! "THE PICTURE IS LOOSE"; ! } ! ]; Object obscura "obscura" easel, with name "obscura", description "All lines lead to a knot at its center; all colors gray.", sprite [; return butterknifePIC; ], before [; Use: if (picture in location) { give picture general; "The mural grays; its lines dissolve into leafwrack and ripples, sliding to the ground."; } ], after [; Use: move Button to location; ]; Object Water "water", with name "water" "LIQUID", article "some", ! before [; ! take: ! if (JugEmpty notin player) ! "YOU HAVE NO CONTAINER"; ! else ! { remove JugEmpty; ! move JugFull to player; ! "YOUR PITCHER IS FULL"; ! } ! drink: ! "OK"; ! pour: ! if (JugFull notin Player) ! "I SEE NO WATER"; ! remove JugFull; ! move JugEmpty to player; ! "THE PITCHER IS EMPTY"; ! ], has edible; Object tea "tea" JugFull, with name "tea", article "some", before [; Drink: ! hopeful clue to dousing abilities "The tea has long since lost the warmth of the fire, and of the hospitality that originally offered it."; Pour: "Wasteful."; ]; Object Hole "HOLE", ! The hole in the carpet with name "hole", image [; if (small_key in self) return keyPIC; return holePIC; ], has container open ~openable; ! Appears in the hole in the carpet, and opens the chest with the gun ! in it. Object Small_Key "fissure" Hole, with name "fissure", description "It is yours, in fact. Its shape is the shape of the lines across your palm. Like a key writ in future mumblings.", before [; Use: if (Trunk in location) { give Trunk open; remove Small_Key; "You place the fissure on the box; the fracture widens."; } ], sprite [; return key_itemPIC; ]; Object glass "glass" SideYard, with name "glass", description "Fragile yet immutable.", before [; Attack: "A syllable would do it. You have none. And you would not."; ], has scenery; Object clock "clock" BackYard, with name "clock" "hour" "thirteenth" "thirteen" "box", description [; print "Time. It breathes here, and whispers become solid, and walls become mist.^ ^ Away from this hour-chamber, no one sleeps. No one watches. No one waits. There are only Rhio and Vross, matched smile against smile, lips pale and lips stained dark.^ ^ VROSS: The world asleep around us--it is fitting.^ It is fitting. In their world we are the coin^ Whose faces never meet. But here, this now--^ ^ RHIO: This time is ours, and hours fly sweet as birds^ To bring you to my arms to drink your words.^ (He kisses her.)^"; if (self hasnt general) { give self general; print "Silhouetted against the light of vanished lanterns (or the vanished light of lanterns--they are the same, here), Gyre stands watching the lovers. His hands are whole, and wholly flesh, and as precise as clockwork.^ ^ He is about to speak. He does not.^"; } rtrue; ], has scenery; ! modified--mistakenly prism before (prism = jewels, actually)--YHL Object Skeleton_Key "flute" MoistBasement, with name "flute", sprite [; return Skeleton_Key_itemPIC; ], initial [; "A flute of wood, sweet to the touch."; ]; ! will be thrown at you in the large bedroom Object Dagger "knife" LargeBedroom, with name "knife" "blade" "dagger", description "It is as slender and uncompromising as ever.", sprite [; return dagger_itemPIC; ], invent "a blade", before [; use: if (location == Tower) { if (Rhio hasnt general) { print "DAISY STABBED YOU. YOU ARE DEAD^"; <>; } else { "DAISY IS ALREADY DEAD"; } } ]; Object carp_pond "carp pond" Bathroom, ! fix? located in bathroom now with name "pond" description [; "Water, folding and unfolding, and flecks of orange-gold that may or may not be carp, surfacing."; ], before [; Receive: "You do not wish to lose that to the waters."; ], has scenery container transparent; ! Corpse InesseCorpse "Inesse's voice" carp_pond, ! should be Corpse ! with ! description [; ! "A woman's ringed fingers trail through water. She watches for some ! pattern only she knows, and can therefore step outside.^ ! ^ ! INESSE: Every thing that lives within the eye,^ ! Every fish aspiring to the sky,^ ! Every dragon born from summer rain--^ ! These I was, and I shall be again.^ ! (Rings of gold, of amber and heliotrope, drop into unfathomable ! depths.^ ! The downpour begins.)"; ! ]; Object Towel "prayer-scroll" BillCorpse, ! should be InesseCorpse; debugging with name "prayer-scroll" "scroll", sprite [; return towel_itemPIC; ], has scenery; ! using the butterknife on the picture will loosen it, ! allowing you to take it Object Picture "mural" Study, with name "picture" "mural", sprite [; return picture_itemPIC; ], description [; "A lotus pond, poems calligraphed upon each floating leaf, is the mural."; ], before [; loosen: if (obscura notin player) "The mural does not yield so easily."; else <>; take: if (self hasnt general) "It is painted upon the wall.^"; else { give self ~scenery; move Button to Study; rfalse; } ], after [; Take: "A single piano-key of ivory is set into the wall, pitchless, isolated from the octave.^"; ], has picturescenery; ! hidden behind picture Object Button "key", with name "ivory" "piano" "key", before [; push: move SecretDoor to location; give SecretDoor open; give SecretDoor ~absent; "Part of the wall opens: the Carp Gate, for those ambitious fish who become dragons."; ], has scenery; Object SecretDoor "wall", with name "wall" "carp" "gate", found_in MustyCrawlspace Study, door_to [; if (location == Study) return MustyCrawlspace; return Study; ], door_dir [; if (location == Study) return ne_to; return s_to; ], react_before [; enter: if (noun == self && location == Study && self hasnt general) { give self general; print "The gate closes behind you, intolerant of indecision.^"; } go: if (location == Study && self hasnt general && noun == ne_obj or self) { give self general; print "The gate closes behind you, intolerant of indecision.^"; } ], before [; open: if (location == MustyCrawlspace) "IT WON'T OPEN"; ], react_after [; go: if (self has general) { give self ~open absent; remove self; rfalse; } ], has door open ~openable absent; Object Hammer "hourglass" Attic, with name "hourglass", initial "An hourglass rests here, empty of sand. Or full. Sand births glass, after all.", sprite [; return sledgehammer_itemPIC; ], before [; Use: if ((location == Kitchen) && (self hasnt general)) { if (easel hasnt general) "The easel lies in your way."; else { move Hole_Kitchen to location; give Hole_Pantry open; give self general; "The wall crumbles; the hourglass fills with the sand of years turning."; } } ], has picturescenery; Object Ladder "lens" Attic, with name "LADDER", before [; climb: if (location == Attic) { if (trapdoor has concealed) "The light through the lens dazzles your eyes, revealing nothing but confusion. After a moment, your vision clears again."; else <>; } ], has static picturescenery; Object Tree "TREE" PineTreeBase, with name "tree" "trees", before [; climb: <>; ], has scenery; Object Telescope "telescope" PineTreeTop, with name "telescope", image [; ! trapdoor as seen through telescope return trapdoorPIC; ], description [; give trapdoor ~concealed; "A tome lies still as dust, unhidden to your eye, now."; ], before [; ! this will only be interesting if the MH two-word parser is TURNED ! OFF. Otherwise LOOK TELESCOPE is the only viable command anyway. ! This accounts for LOOK THROUGH as well. search: <>; ], has static picturescenery; Object Algae "meditations" MoistBasement, with name "algae", before [; rub: ! If the player doesn't have the towel, refuse if (IndirectlyContains(player, towel) == 0) "YOU HAVE NOTHING TO WIPE IT WITH"; if (self has general) rfalse; ! don't do this more than once give self general; move Brick to MoistBasement; ! reveal the brick "THE WALL IS EXPOSED. THERE IS A LOOSE BRICK"; ], has scenery; Object Hole_Basement "HOLE" MoistBasement, with name "hole", found_in [; if (location == MoistBasement or Tunnel) rtrue; rfalse; ], door_to [; if (location == MoistBasement) return Tunnel; return MoistBasement; ], door_dir [; if (location == MoistBasement) return in_to; return out_to; ], has static picturescenery door open ~openable; ! visible only after you have moved the algae Object Brick "BRICK", with name "BRICKS" "BRICK", sprite [; return Brick_itemPIC; ], description [; "IT IS LOOSE"; ], after [; take: if (self has general) rfalse; ! don't do this more than once give self general; move Jewels to MoistBasement; "YOU HAVE FOUND THE JEWELS!"; ]; ! visible only after you have moved the algae Object Jewels "prism", with name "JEWELS" "GEMS" "TREASURE" "DIAMONDS", sprite [; return jewel_itemPIC; ], description [; "THEY ARE JEWELS, ALL RIGHT!"; ], has pluralname; Object Shovel "SHOVEL" cemetary, with name "SHOVEL" "SPADE", sprite [; return shovel_itemPIC; ]; Object Trunk "music-box" StorageRoom, with name "music-box" "music" "box", description [; if (self has open) { if (gun in self) "There you find a whisper, needle-sharp."; else "Empty."; } "A rote singer, closed against you."; ], image [; if (gun in self) return chestPIC; return chestemptyPIC; ], with_key Small_Key, has static picturescenery container openable lockable locked; Object Gun "whisper" Trunk, with name "whisper", description "Needle-sharp.", invent "a whisper, needle-sharp"; ! Object Gun "whisper, needle-sharp" Trunk, ! with name "GUN" "PISTOL", ! number AMMUNITION, ! sprite [; ! return gun_itemPIC; ! ], ! description [; ! ! NB: this is a bug preserved from the original game. Even when ! ! the gun has been shot, it is described as containing one bullet. ! "THERE IS ONE BULLET IN THE GUN"; ! ], ! before [; ! ! Trying to shoot the gun when you don't have it gives you ! ! YOU ARE NOT CARRYING IT ! shoot, use: ! if (self.number > 0) ! { ! self.number--; ! if (Rhio in Tower && location == Tower) ! { give Rhio general; ! if (self.number == 0) print "YOUR GUN IS EMPTY^"; ! "DAISY IS NOW DEAD"; ! } ! if (JoeGravedigger in location && location == Cemetary) ! { remove JoeGravedigger; ! move JoeCorpse to location; ! print "THERE IS A DEAD BODY HERE^"; ! if (self.number == 0) "YOUR GUN IS EMPTY"; ! else ! { ! new_line; rtrue; ! } ! } ! if (self.number == 0) ! "YOUR GUN IS NOW EMPTY"; ! } ! else ! { ! if (Rhio in location && location == Tower && Rhio has general) ! { ! "DAISY IS ALREADY DEAD"; ! } ! "YOUR GUN IS EMPTY"; ! } ! ]; !-- SOME additional scenery not on the original list Object Books "BOOKS" Library, with name "books", has static picturescenery; Object Shelves "SHELVES" Library, with name "SHELVES" "BOOKSHELF" "BOOKSHELV", description [; "THERE ARE NOT MANY BOOKS LEFT"; ], has static picturescenery; Object Sofa "SOFA" Library, with name "COUCH" "SOFA" "DAVENPOR" "DIVAN", has static picturescenery; Object Fireplace "FIREPLACE" Library, with name "FIREPLACE" "CHIMNEY", has static picturescenery; Object Fence "FENCE", with name "fence", found_in SideYard BackYard, before [; climb: "IT IS TOO HIGH"; ], has scenery; Object Grave "GRAVES" Cemetary, with name "GRAVES" "GRAVE", before [; enter: ! Joe intervenes if he's around if (TestScope(JoeGravedigger)) { print "YOU FALL IN ONE AND JOE BURIES YOU. YOU ARE DEAD^"; <>; } "YOU FALL IN ONE AND CLIMB OUT AGAIN"; ], has container enterable static picturescenery; Object Tombstone "TOMBSTONE" Cemetary, with name "GRAVESTONE" "TOMBSTONE", description [; "THE WRITING IS WORN DOWN"; ], text [; <>; ], has static picturescenery; ! Object Lamp "LAMP" DiningRoom, ! with name "LAMP", ! before [; ! take: "IT IS FASTENED DOWN"; ! burn: "THERE IS NO WICK"; ! ], ! has static picturescenery; Object Rug "RUG" DiningRoom, with name "RUG" "CARPET", has scenery picturescenery; Object Rocker "ROCKER" Nursery, with name "ROCKER" "CHAIR", has static picturescenery; Object Crib "CRIB" Nursery, with name "CRADLE" "CRIB", has static picturescenery; ! Many of the objects in the bedrooms -- cabinets, beds, etc -- appear to ! be implemented effectively as a single object which can be (minimally) ! viewed from all bedrooms. The Inform implementation treats each as its ! own object in order to allow the author more room for ! customization of the furnishings. Object NurseryCabinet "CABINET" Nursery, with name "CABINET" "CUPBOARD" "DRAWERS", has static picturescenery; Object BoyBed "BED" BoysBedroom, with name "BED" "MATTRESS", has static picturescenery; Object BoyCabinet "CABINET" BoysBedroom, with name "CABINET" "CUPBOARD" "DRAWERS", has static picturescenery; Object BoyDesk "DESK" BoysBedroom, with name "DESK" "TABLE", has scenery picturescenery; Object LargeBed "BED" LargeBedroom, with name "BED" "MATTRESS", has static picturescenery; Object LargeCabinet "CABINET" LargeBedroom, with name "CABINET" "CUPBOARD" "DRAWERS", has static picturescenery; Object LargeDesk "DESK" LargeBedroom, with name "DESK" "TABLE", has scenery picturescenery; Object SmallBed "BED" SmallBedroom, with name "BED" "MATTRESS", has static picturescenery; Object SmallCabinet "CABINET" SmallBedroom, with name "CABINET" "CUPBOARD" "DRAWERS", has static picturescenery; Object SmallDesk "DESK" SmallBedroom, with name "DESK" "TABLE", has scenery picturescenery; Object OutsideWindows "WINDOW" FrontYard, with name "WINDOW", found_in FrontYard BoysBedroom SmallBedroom Tower, description [; "WINDOWS ARE BOARDED UP EXCEPT THE ATTIC WINDOW"; ], before [; enter: self.description(); rtrue; ], has scenery picturescenery; Object AtticWindow "WINDOW" Attic, with name "WINDOW", description [; "YOU SEE A FOREST"; ], before [; enter: print "YOU FALL TO EARTH. LUCKILY YOU HAVE ONLY MINOR INJURIES.^ UNFORTUNATELY THE AMBULANCE DRIVER SMASHS INTO A VOLKWAGEN. NO SURVIVORS.^YOU ARE DEAD.^"; <>; ], has enterable static picturescenery; Object boxes "BOX" StorageRoom, with name "BOXES" "BOX", has static picturescenery; Object StudyDesk "DESK" Study, with name "DESK" "TABLE", has static picturescenery; Object StudyChair "CHAIR" Study, with name "CHAIR", has static picturescenery; Object Hole_Pantry "HOLE" SmallPantry, with name "hole", react_before [; go: if ((noun == in_to || noun == self) && self hasnt open) "You enter, but walls thwart you, and you return."; enter: if (noun == self && self hasnt open) "You enter, but walls thwart you, and you return."; ], door_dir in_to, door_to Kitchen, has door static ~openable ~open picturescenery; ! Object carp_pond "carp pond" Bathroom, ! fix? located in bathroom now ! with name "pond" ! description [; ! <>; ! ], ! before [; ! Receive: ! "You do not wish to lose that to the waters."; ! ], ! has scenery container; ! Object Toilet "TOILET" Bathroom, ! with name "TOILET" "POTTY" "JOHN", ! before [; ! flush: "OK"; ! ], ! has static picturescenery; ! Object Shower "SHOWER" Bathroom, ! with name "SHOWER", ! before [; ! take: "THANK YOU. I LOVE TO FEEL CLEAN. THATS MUCH BETTER."; ! ], ! has static picturescenery; ! Object BathroomSink "SINK" Bathroom, ! with name "SINK" "FAUCET" "TAP", ! after [; ! switchon: ! move BathroomWater to self; ! "WATER IS RUNNING INTO THE SINK"; ! ! switchoff: ! if (BathroomWater in self) remove water; ! ! "OK"; ! ], ! has switchable container open ~openable static picturescenery; ! Object BathroomWater "WATER", ! with name "WATER" "LIQUID", article "some", ! before [; ! take: ! if (JugEmpty notin player) ! "YOU HAVE NO CONTAINER"; ! else ! { remove JugEmpty; ! move JugFull to player; ! "YOUR PITCHER IS FULL"; ! } ! drink: ! "OK"; ! pour: ! if (JugFull notin Player) ! "I SEE NO WATER"; ! remove JugFull; ! move JugEmpty to player; ! "THE PITCHER IS EMPTY"; ! ], ! has edible; !============================================================================ ! The NPCs Object People EntryHall, with name "people", description [; "THE PEOPLE WERE EXPLAINED AT THE BEGINNING OF THE GAME."; ], has scenery picturescenery; NPC Orestis "Orestis" EntryHall, ! Orestis, once Tom with name "Orestis", has male; Corpse TomCorpse "glass box" MoistBasement, with name "glass" "box", description [; "ORESTIS: My brother is not mine. My brother dies^ By this my hand. The dark is cold. The gears^ Will bear my dying curse across the years.^ (A long pause.)^ Vross. You silenced him, his flute; silence^ Is all"; ]; ! Held by Tom's corpse Object flower "DAISY" MoistBasement, with name "FLOWER" "DAISY", has scenery; NPC Gyre "Gyre" EntryHall, ! Gyre, once Sam with name "Gyre", has male; Corpse SamCorpse "Sam's body" BackYard, with description [; "IT IS SAM, THE MECHANIC. HE HAS BEEN HIT IN THE HEAD BY A BLUNT OBJECT"; ]; NPC Yvenna "Yvenna" EntryHall, ! Yvenna, once Sally with name "Yvenna", has female; Corpse SallyCorpse "glass box" SmallBedroom, with name "glass" "box", description [; "Yvenna sits head in hands, fingers obscured by the fire-fall of hair. Her waist is bare of blade, or lover's comfort. The line of her back is absolutely rigid.^ ^ YVENNA: Take your toys away. Take the edge^ From the blade. Go, take it all^ Away, the shadows from the sun, the music^ From the birds, the gears, the awl.^ (Offstage, there is a laugh, piercing and unpitying. Yvenna's fingers clench.)"; ]; NPC Vross "Vross" EntryHall, ! Vross, once Dr. Green with name "Vross", has male; Corpse GreenCorpse "glass box" Nursery, with name "glass" "box", description [; "A woman's moonlit smile, half-seen behind velvet and smoke.^ ^ VROSS: The dearest coin of all. The sweetest fall.^ ^ (The clink of silver coins, or gears, or rings. You cannot tell which.)"; ]; NPC Brien "Brien" EntryHall, ! Brien, once Joe with name "Brien", has male; NPC JoeGravedigger "JOE" Cemetary, with name "Joe", description [; "IT IS JOE, THE GRAVEDIGGER. HE HAS JUST FINISHED DIGGING THE SIX GRAVES"; ], react_before [; take: if (noun == shovel) "JOE WON'T LET YOU"; ], life [; ask, tell, answer: "HE DOESN'T TALK MUCH"; attack: "WITH WHAT?"; ]; Corpse JoeCorpse "Joe's body", with description [; "IT IS JOE, THE GRAVEDIGGER"; ]; NPC Inesse "Inesse" EntryHall, ! Inesse, once Bill with name "Inesse", has female; ! fixed the sex Corpse BillCorpse "glass bowl" pond, with name "glass" "bowl", description "A woman's ringed fingers trail through water. She watches for some pattern only she knows, and can therefore step outside.^ ^ INESSE: Every thing that lives within the eye,^ Every fish aspiring to the sky,^ Every dragon born from summer rain--^ These I was, and I shall be again.^ (Rings of gold, of amber and heliotrope, drop into unfathomable depths.^ The downpour begins.)"; ! Corpse InesseCorpse "Inesse's voice" carp_pond, ! should be Corpse ! with ! description [; ! "A woman's ringed fingers trail through water. She watches for some ! pattern only she knows, and can therefore step outside.^ ! ^ ! INESSE: Every thing that lives within the eye,^ ! Every fish aspiring to the sky,^ ! Every dragon born from summer rain--^ ! These I was, and I shall be again.^ ! (Rings of gold, of amber and heliotrope, drop into unfathomable ! depths.^ ! The downpour begins.)"; ! ]; NPC Rhio "Rhio" EntryHall, ! Rhio, once Daisy with name "Rhio", react_before [; take: if (noun == Note_4 && self hasnt general) "DAISY WON'T LET YOU"; ], number 0, daemon [; ! Prevent Daisy from rising from the dead to kill you again if (self has general) { StopDaemon(self); rtrue; } ! Make Daisy kill after a couple of moves in the attic if (self in location) { self.number++; if (self.number > DAISY_PATIENCE) { print "DAISY STABBED YOU. YOU ARE DEAD^"; <>; } } ], life [; attack: "WITH WHAT?"; ], description [; if (self has general) "SHE IS DEAD"; if (location == Tower) "SHE IS GOING TO KILL YOU"; rfalse; ], has female; [ ClearEntry; remove Orestis; remove Gyre; remove Inesse; remove Yvenna; remove Brien; remove Vross; remove People; move Rhio to Tower; ]; !============================================================================ ! Entry point routines Object Darkness_Daemon, with found_in [; rtrue; ], react_before [; if (Matches in player && Matches has light) rfalse; if (self.number > NIGHTFALL && TestScope(CandleLit)==0) { if (action == ##quit) rfalse; "^Shadows loom. Light is swallowed."; } ], number 0, daemon [; if (self has general) rfalse; self.number++; if (self.number > NIGHTFALL) { if (CandleLit in player) rfalse; give self general; StopDaemon(self); "^Shadows loom. Light is swallowed."; } if ((self.number > TWILIGHT) && (CandleLit notin player)) "^Shadows lengthen."; ], has scenery; [ Initialise; ! sets the starting room of the game -- if you remove this, you should ! replace it with another location = ... instruction location = FrontYard; ! like the VERBOSE command -- sets the computer to print a room ! description every time you enter lookmode = 2; ! starts the countdown to darkness -- remove this line to prevent ! darkness from occurring in the game at all. StartDaemon(Darkness_Daemon); ! turns off proportional fonts, creating a monospace effect as in ! the original game font off; picwin.redraw(titlePIC); ! duplicate of the original start-up screen print "Mystery House^...Taken Over^^ Enter G for game or I for instructions^^^^"; if (GOrI()) FullInstructions(); ]; Constant I__WD = 'i//'; [ GOrI i j; for (::) { #Ifdef TARGET_ZCODE; if (location == nothing || parent(player) == nothing) read buffer parse; else read buffer parse DrawStatusLine; j = parse->1; #Ifnot; ! TARGET_GLULX; KeyboardPrimitive(buffer, parse); j = parse-->0; #Endif; ! TARGET_ if (j) { ! at least one word entered i = parse-->1; if (i == I__WD) rtrue; } rfalse; } ]; [ Pause j; for (::) { #Ifdef TARGET_ZCODE; if (location == nothing || parent(player) == nothing) read buffer parse; else read buffer parse DrawStatusLine; j = parse->1; #Ifnot; ! TARGET_GLULX; KeyboardPrimitive(buffer, parse); j = parse-->0; #Endif; ! TARGET_ rtrue; } ]; [ FullInstructions; Instructions(); Pause(); Instructions2(); Pause(); Instructions3(); Pause(); Instructions4(); Pause(); Instructions5(); Pause(); Instructions6(); Pause(); print "^^^^"; ]; [ Instructions; print "INSTRUCTIONS FOR HI-RES ADVENTURE^^"; print "ADVENTURE IS ONE OF THE MOST FACINATING AND CHALLENGING GAMES AVAILABLE FOR YOUR APPLE COMPUTER. WINNING IS QUITE A CHALLENGE IN A GAME WHERE IT MAY TAKE HOURS TO MOVE AND WEEKS TO SOLVE A PUZZLE. HI-RES ADVENTURE #1 ('MYSTERY HOUSE') TAKES PLACE IN AN OLD HOUSE WITH MANY ROOMS. AS YOU ENTER THE HOUSE, SEVEN OTHER PERSONS WILL BE IN THE LIVING ROOM. EVENTUALLY THEY ARE DISPERSED THROUGHOUT THE HOUSE AND YOU START FINDING THEM - DEAD! YOU MUST FIND THE KILLER BEFORE HE(SHE?) ENDS UP KILLING YOU.^^"; print "PRESS RETURN TO CONTINUE^^"; ]; [ Instructions2; print "YOU PROGRESS THROUGH THE HOUSE BY PROVIDING TWO WORD COMMANDS WHICH USUALLY CONTAIN A VERB AND THEN A NOUN BUT AREN'T ALWAYS IN THAT ORDER. EXAMPLES ARE 'WATER ON' AND 'OPEN DOOR'. IF A SET OF WORDS DOESNT SEEM TO BE WORKING TRY DIFFERENT TERMINOLOGY^^"; print "IF YOU SHOULD FIND A STAIRCASE YOU MAY TRY 'UP STAIRS' OR 'GO STAIRS'. SOME OF THE ACTIONS YOU CAN TAKE ARE GET, DROP, GO, LOOK, READ, CLIMB MOVE, HIT, KILL ETC.^^"; print "PRESS RETURN TO CONTINUE^^"; ]; [ Instructions3; print "A NOTE OF CAUTION: CARRYING MORE THAN ONE NOTE MAY BE CONFUSING AS THE COMPUTER WILL ARBITRARILY DECIDE WHICH ONE TO READ OR DROP.^^"; print "SHOULD YOU WISH TO REVIEW PAST COMMANDS YOU MAY PRESS RETURN WITHOUT TYPING TO FLIP/FLOP BETWEEN GRAPHICS AND TEXT.^^"; print "IF YOUR COPY SHOULD EVER FAIL TO LOAD (OR GET MUNCHED BY A HUNGRY DISK DRIVE) SEND IT WITH FIVE DOLLARS TO:^^"; print " ON-LINE SYSTEMS^"; print " 36575 MUDGE RANCH ROAD^"; print " COARSEGOLD CA. 93614^^"; print "PRESS RETURN TO CONTINUE^^"; ]; [ Instructions4; print "YOU MAY GO IN THE DIRECTIONS NORTH, SOUTH, EAST, WEST, UP AND DOWN. TYPE NORTH OR N TO GO NORTH. THE OTHER DIRECTIONS MAY ALSO BE ABBREVIATED AS WELL. WHEN YOUR WAY IS BLOCKED AND YOU CAN'T USE DIRECTIONS TO MOVE YOU MAY HAVE TO REFER TO THE ACTUAL OBJECT IN YOUR WAY. IN THESE CASES, YOU COULD TYPE 'GO DOOR', 'GO HOLE', 'GO GATE' ETC.^^"; print "PRESS RETURN TO CONTINUE^^"; ]; [ Instructions5; print "IN GENERAL THE TOP OF THE SCREEN IS NORTH, THE BOTTOM IS SOUTH, THE LEFT SIDE IS WEST AND THE RIGHT SIDE IS EAST. BECAUSE OF THE DIFFICULTY OF DRAWING DOORWAYS TO THE SOUTH OR THE BOTTOM OF THE SCREEN, THERE ARE ONE OR TWO ROOMS WHERE THE DOORWAYS DO NOT MATCH UP TO THE NORMAL DIRECTIONS.^^"; print "IF YOU WANT A CLOSER LOOK AT SOMETHING SAY LOOK (OBJECT). TO RETURN TO THE MAIN VIEW SAY LOOK ROOM.^^"; print "SAVE GAME AND RESTORE GAME MAY ALSO BE USED.^^"; print "PRESS RETURN TO CONTINUE^^"; ]; [ Instructions6; print "AT THE START OF THE GAME THERE WILL BE SEVEN OTHER PEOPLE IN THE HOUSE WITH YOU. THEIR NAMES, OCCUPATIONS, AND HAIRCOLOR ARE AS FOLLOWS:^^"; font off; print "TOM SAM SALLY^"; print "BLOND BRUNETTE REDHEAD^"; print "PLUMBER MECHANIC SEAMSTRESS^^"; print "DR. GREEN JOE BILL^"; print "BRUNETTE BRUNETTE BLOND^"; print "SURGEON GRAVEDIGGER BUTCHER^^"; print "DAISY^"; print "BLOND^"; print "COOK^^"; font on; print "PRESS RETURN TO BEGIN PLAY^^"; ]; !============================================================================ ! Standard and extended grammar Include "Grammar"; !============================================================================ ! Special Mystery House commands Extend "look" * noun -> Examine * "room" -> Look; Verb "water" * "on" -> TurnOnWater * "off" -> TurnOffWater; ! Do these water-actions still apply?--YHL [ TurnOnWaterSub; if (location == Kitchen) { move water to sink; "WATER IS RUNNING INTO THE SINK"; } else { "I SEE NO WATER"; } ]; [ TurnOFFWaterSub; if (location == Kitchen) { if (water in sink) remove water; "OK"; } else { "I SEE NO WATER"; } ]; Verb "pour" * noun -> Pour; [ PourSub; "Not all things have such fluid nature."; ]; Verb "use" "WITH" * noun -> Use; [ UseSub; "Not applied in this fashion."; ]; Verb "help" * topic -> Help; [ HelpSub; if (location ofclass ForestRoom) "IF ONLY I COULD TELL IF I'D BEEN HERE BEFORE..."; "TRY GOING IN SOME DIRECTION^ EX:NORTH,SOUTH,EAST,WEST,UP,DOWN"; ]; Verb "shoot" "fire" * noun -> Shoot; [ ShootSub; "I DON'T UNDERSTAND WHAT YOU MEAN"; ]; ! commented out ! Verb "flush" * noun -> Flush; ! [ FlushSub; ! "I DON'T UNDERSTAND WHAT YOU MEAN"; ! ]; Extend only "read" first * noun -> Read; [ ReadSub; if (noun provides text) { if (noun in player) noun.text(); ! changed text--YHL else "Outside your grasp."; } else <>; ]; Extend "unlock" first * noun -> UnlockEasy; [ UnlockEasySub key; if (noun provides with_key) key = noun.with_key; if (key && key in player) { give noun ~locked; "OK"; } else { "YOU HAVE NOTHING TO UNLOCK IT WITH"; } ]; Extend only "remove" replace * noun -> Rub; Extend only "unscrew" replace * noun -> Loosen; Verb "loosen" "unbolt" * noun -> Loosen; [ LoosenSub; "I DONT UNDERSTAND WHAT YOU MEAN"; ]; Extend "look" * "room"/"around" -> Look; !============================================================================ ============= ! Entry point routines Object Darkness_Daemon, with found_in [; rtrue; ], react_before [; ! if (Matches in player && Matches has light) rfalse; if (self.number > NIGHTFALL && TestScope(CandleLit)==0) { if (action == ##quit) rfalse; "^Shadows loom. Light is swallowed."; } ], number 0, daemon [; if (self has general) rfalse; self.number++; if (self.number > NIGHTFALL) { if (CandleLit in player) rfalse; give self general; StopDaemon(self); "^Shadows loom. Light is swallowed."; } if ((self.number > TWILIGHT) && (CandleLit notin player)) "^Shadows lengthen."; ], has scenery; [ Initialise; ! sets the starting room of the game -- if you remove this, you should ! replace it with another location = ... instruction location = FrontYard; ! like the VERBOSE command -- sets the computer to print a room ! description every time you enter lookmode = 2; ! starts the countdown to darkness -- remove this line to prevent ! darkness from occurring in the game at all. StartDaemon(Darkness_Daemon); ! turns off proportional fonts, creating a monospace effect as in ! the original game font off; picwin.redraw(titlePIC); ! duplicate of the original start-up screen print "Mystery House^...Taken Over^^ Enter G for game or I for instructions^^^^"; if (GOrI()) FullInstructions(); ]; Constant I__WD = 'i//'; [ GOrI i j; for (::) { #Ifdef TARGET_ZCODE; if (location == nothing || parent(player) == nothing) read buffer parse; else read buffer parse DrawStatusLine; j = parse->1; #Ifnot; ! TARGET_GLULX; KeyboardPrimitive(buffer, parse); j = parse-->0; #Endif; ! TARGET_ if (j) { ! at least one word entered i = parse-->1; if (i == I__WD) rtrue; } rfalse; } ]; [ Pause j; for (::) { #Ifdef TARGET_ZCODE; if (location == nothing || parent(player) == nothing) read buffer parse; else read buffer parse DrawStatusLine; j = parse->1; #Ifnot; ! TARGET_GLULX; KeyboardPrimitive(buffer, parse); j = parse-->0; #Endif; ! TARGET_ rtrue; } ]; [ FullInstructions; Instructions(); Pause(); Instructions2(); Pause(); Instructions3(); Pause(); Instructions4(); Pause(); Instructions5(); Pause(); Instructions6(); Pause(); print "^^^^"; ]; [ Instructions; ! print "INSTRUCTIONS FOR HI-RES ADVENTURE^^"; ! print "ADVENTURE IS ONE OF THE MOST FACINATING ! AND CHALLENGING GAMES AVAILABLE FOR ! YOUR APPLE COMPUTER. WINNING IS QUITE ! A CHALLENGE IN A GAME WHERE IT MAY TAKE ! HOURS TO MOVE AND WEEKS TO SOLVE A ! PUZZLE. HI-RES ADVENTURE #1 ('MYSTERY ! HOUSE') TAKES PLACE IN AN OLD HOUSE ! WITH MANY ROOMS. AS YOU ENTER THE ! HOUSE, SEVEN OTHER PERSONS WILL BE ! IN THE LIVING ROOM. EVENTUALLY THEY ! ARE DISPERSED THROUGHOUT THE HOUSE AND ! YOU START FINDING THEM - DEAD! YOU MUST ! FIND THE KILLER BEFORE HE(SHE?) ENDS UP ! KILLING YOU.^^"; print "Instructions for Mystery House Taken Over: Glass Boxes^^"; print "Glass Boxes invites you into a world where the distinction between play and player blurs, and the villain of the piece may well be coming after you. The story with its betrayals and intrigues unfolds around you as you walk through the theatre--or is it, in truth, merely a theatre?^^"; print "(Press RETURN to continue.)^^"; ]; [ Instructions2; ! print "YOU PROGRESS THROUGH THE HOUSE BY ! PROVIDING TWO WORD COMMANDS WHICH ! USUALLY CONTAIN A VERB AND THEN A ! NOUN BUT AREN'T ALWAYS IN THAT ORDER. ! EXAMPLES ARE 'WATER ON' AND 'OPEN DOOR'. ! IF A SET OF WORDS DOESNT SEEM ! TO BE WORKING TRY DIFFERENT TERMINOLOGY^^"; ! print "IF YOU SHOULD FIND A STAIRCASE YOU MAY ! TRY 'UP STAIRS' OR 'GO STAIRS'. ! SOME OF THE ACTIONS YOU CAN TAKE ARE ! GET, DROP, GO, LOOK, READ, CLIMB ! MOVE, HIT, KILL ETC.^^"; print "You progress through the theatre by providing two-word commands that usually contain a verb, then a noun, but aren't always in that order. Examples include UNLOCK DOOR and POUR TEA. If a set of words does not seem to work for you, try different terminology. Some of the actions you can take are GET, DROP, GO, LOOK, READ, CLIMB, MOVE, USE, HIT, KILL, and so on.^^"; print "(Press RETURN to continue.)^^"; ]; [ Instructions3; ! print "A NOTE OF CAUTION: CARRYING MORE THAN ! ONE NOTE MAY BE CONFUSING AS THE ! COMPUTER WILL ARBITRARILY DECIDE WHICH ! ONE TO READ OR DROP.^^"; ! print "SHOULD YOU WISH TO REVIEW PAST COMMANDS ! YOU MAY PRESS RETURN WITHOUT TYPING TO ! FLIP/FLOP BETWEEN GRAPHICS AND TEXT.^^"; ! print "IF YOUR COPY SHOULD EVER FAIL TO LOAD ! (OR GET MUNCHED BY A HUNGRY DISK DRIVE) ! SEND IT WITH FIVE DOLLARS TO:^^"; ! print " ON-LINE SYSTEMS^"; ! print " 36575 MUDGE RANCH ROAD^"; ! print " COARSEGOLD CA. 93614^^"; print "Items that you may take with you are often visible as smaller images in the secondary window below the main view of your location. However, be aware that some are tucked away in unexpected places, and you may have to look around to discover them. The world of the play may permit some unexpected actions.^^"; print "(Press RETURN to continue.^^"; ]; [ Instructions4; ! print "YOU MAY GO IN THE DIRECTIONS NORTH, ! SOUTH, EAST, WEST, UP AND DOWN. TYPE ! NORTH OR N TO GO NORTH. THE OTHER ! DIRECTIONS MAY ALSO BE ABBREVIATED AS ! WELL. WHEN YOUR WAY IS BLOCKED AND ! YOU CAN'T USE DIRECTIONS TO MOVE ! YOU MAY HAVE TO REFER TO THE ACTUAL ! OBJECT IN YOUR WAY. IN THESE CASES, ! YOU COULD TYPE 'GO DOOR', 'GO HOLE', ! 'GO GATE' ETC.^^"; print "You may go in the cardinal compass directions, NORTH, SOUTH, EAST, and WEST, also abbreviated as N, S, E, and W. When your way is blocked or you can't use directions to move, you may refer to the object in your way, e.g. GO DOOR, GO HOLE, GO GATE, etc.^^"; print "(Press RETURN to continue.)^^"; ]; [ Instructions5; ! print "IN GENERAL THE TOP OF THE SCREEN IS ! NORTH, THE BOTTOM IS SOUTH, THE LEFT ! SIDE IS WEST AND THE RIGHT SIDE IS ! EAST. BECAUSE OF THE DIFFICULTY OF ! DRAWING DOORWAYS TO THE SOUTH OR THE ! BOTTOM OF THE SCREEN, THERE ARE ONE ! OR TWO ROOMS WHERE THE DOORWAYS DO NOT ! MATCH UP TO THE NORMAL DIRECTIONS.^^"; ! print "IF YOU WANT A CLOSER LOOK AT SOMETHING ! SAY LOOK (OBJECT). TO RETURN TO THE ! MAIN VIEW SAY LOOK ROOM.^^"; ! print "SAVE GAME AND RESTORE GAME MAY ! ALSO BE USED.^^"; print "In general, the top of the screen is NORTH, the bottom is SOUTH, the left side is WEST, and the right side is EAST. Because of the difficulty of drawing doorways to the SOUTH or the bottom of the screen, there are one or two rooms where the doorways do not match up to the normal directions.^^"; print "If you want to examine an item more closely, use LOOK (OBJECT). To return to the main view, use LOOK ROOM. SAVE GAME and RESTORE GAME may also be used.^^"; print "(Press RETURN to continue.)^^"; ]; [ Instructions6; ! print "AT THE START OF THE GAME THERE ! WILL BE SEVEN OTHER PEOPLE IN ! THE HOUSE WITH YOU. THEIR NAMES, ! OCCUPATIONS, AND HAIRCOLOR ARE ! AS FOLLOWS:^^"; ! font off; ! print "TOM SAM SALLY^"; ! print "BLOND BRUNETTE REDHEAD^"; ! print "PLUMBER MECHANIC SEAMSTRESS^^"; ! print "DR. GREEN JOE BILL^"; ! print "BRUNETTE BRUNETTE BLOND^"; ! print "SURGEON GRAVEDIGGER BUTCHER^^"; ! print "DAISY^"; ! print "BLOND^"; ! print "COOK^^"; ! font on; print "Dramatis Personae^^"; print "Yvenna, a woman of uncommon poise, crippled within by the deformity of her face^^"; print "Inesse, Yvenna's mad cousin, who is capable of deeper plans than most suspect^^"; print "Rhio, an experimenter in all things art and mort, to whom Yvenna is betrothed^^"; print "Vross, Rhio's clandestine lover, who takes pleasure in all things silver or sable^^"; print "Gyre, Vross's guardian, an artificer of no small repute^^"; print "Brien, a musician-artist, cousin and sometime-confidant of Rhio^^"; print "Orestis, Brien's brother, a scholar of great ideas and greater doubts^^"; print "(Press RETURN to begin play.)^^"; ]; !============================================================================ ! Standard and extended grammar Include "Grammar"; !============================================================================ ! Special Mystery House commands Extend "look" * noun -> Examine * "room" -> Look; Verb "water" * "on" -> TurnOnWater * "off" -> TurnOffWater; ! Do these water-actions still apply?--YHL [ TurnOnWaterSub; if (location == Kitchen) { ! move water to sink; "Water arrives."; } else { "There is no water here."; } ]; [ TurnOFFWaterSub; if (location == Kitchen) { ! if (water in sink) remove water; "Done."; } else { "There is no water here."; } ]; Verb "pour" * noun -> Pour; [ PourSub; "Not all things have such fluid nature."; ]; Verb "use" "WITH" * noun -> Use; [ UseSub; "Not applied in this fashion."; ]; Verb "help" * topic -> Help; [ HelpSub; if (location ofclass ForestRoom) "Reflections and refractions."; "You might choose a direction."; ]; Verb "shoot" "fire" * noun -> Shoot; [ ShootSub; "Is this applicable?"; ]; ! commented out ! Verb "flush" * noun -> Flush; ! [ FlushSub; ! "I DON'T UNDERSTAND WHAT YOU MEAN"; ! ]; Extend only "read" first * noun -> Read; [ ReadSub; if (noun provides text) { if (noun in player) noun.text(); ! changed text--YHL else "Outside your grasp."; } else <>; ]; Extend "unlock" first * noun -> UnlockEasy; [ UnlockEasySub key; if (noun provides with_key) key = noun.with_key; if (key && key in player) { give noun ~locked; "Unlocked."; } else { "You have nothing to unlock it with."; } ]; Extend only "remove" replace * noun -> Rub; Extend only "unscrew" replace * noun -> Loosen; Verb "loosen" "unbolt" * noun -> Loosen; [ LoosenSub; "This is not understood."; ]; Extend "look" * "room"/"around" -> Look; !============================================================================