!% !============================================================================ Constant Story "MYSTERY HOUSE"; Constant Headline "^...Taken Over.^ Adapted by Michael Gentry. Playtested by and Terrence Bosky, Matt Boyle, and Jason Love.^ Type INFO for some helpful information.^"; !============================================================================ ! 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 cemeteryPIC = 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 carkeysPIC = 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 large_key_itemPIC = 107; Constant basement_noflower_stairsPIC = 108; Constant picture_itemPIC = 109; Constant sledgehammer_itemPIC = 110; Constant gun_itemPIC = 111; Constant cemetery_no_joePIC = 112; Constant cnj_gate_open_shovelPIC = 113; Constant cnj_gate_open_no_shovelPIC = 114; Constant cnj_gate_closed_no_shovelPIC = 115; Constant dagger_itemPIC = 116; Constant towel_itemPIC = 117; ! No 118 Constant basement_noflowerPIC = 119; Constant basement_noflower_nobrickPIC = 120; Constant basement_stairsPIC = 121; Constant basement_noflower_noalgaePIC = 122; Constant basement_nobrickPIC = 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_noalgaePIC = 131; Constant shovel_itemPIC = 132; Constant attic_hammer_doorPIC = 133; Constant attic_hammer_door_closedPIC = 134; ! Additional object sprites Constant hair_itemPIC = 152; Constant flower_itemPIC = 153; Constant gas_itemPIC=164; Constant journalPIC=183; ! Additional rooms and room states Constant treetop_window_openPIC = 154; Constant bathroom_window_openPIC = 155; Constant bathroom_bare_window_openPIC = 156; Constant cemetery_opencrypt_closedgatePIC=157; Constant cemetery_opencrypt_opengatePIC=158; Constant cryptPIC=159; Constant vanPIC=160; Constant van_door_openPIC=161; Constant van_interiorPIC=162; Constant van_interior_nogasPIC=163; Constant tower_daisydeadPIC=165; Constant tower_nogunPIC=200; Constant tower_nokeyPIC=167; Constant tower_allgonePIC=168; Constant storage_cameraPIC=169; Constant storage_camera_openPIC=170; Constant attic1_cameraPIC=171; Constant attic_no_hammer_cameraPIC=172; Constant attic2_td_cameraPIC=173; Constant attic2_cameraPIC=174; Constant attic_hammer_door_cameraPIC=175; Constant attic_hammer_closed_cameraPIC=176; Constant cavernPIC=177; Constant cavern_joedeadPIC=178; Constant cavern_seal_brokenPIC=179; Constant nestPIC=12; Constant crawlspace_nobookPIC=182; Constant small_bedroom_nohairPIC=184; Constant doorway_westPIC=201; Constant doorway_eastPIC=186; Constant doorway_northPIC=187; !Additional misc. images Constant grassPIC = 150; Constant huskPIC = 151; Constant firePIC = 203; #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,SETHEIGHT); ], 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.) ! !============================================================================ !============================================================================ ! 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 [; Examine: if (lm_n == 2) { print "Just "; if (lm_o hasnt pluralname) print "an "; "ordinary ", (name) noun, "."; } Go: if (lm_n==3 && lm_o==trapdoor) "The trap door is closed."; if (lm_n==5) print_ret (The) lm_o, " is closed."; Miscellany: switch (lm_n) { 5: "Would you like to RESTART, RESTORE a saved game, UNDO your last move, or QUIT?"; 19: <>; 39: "No need to worry about that now."; } Smell: if (lm_o==nothing && gas_smell in location) "This place smells strongly of gasoline."; if (lm_o==player) { if (gasoline has general || slime has general) { print "You smell strongly of "; if (gasoline has general) { print "gasoline"; if (slime has general) ", though the stench from the crypt-slime mostly covers it."; "."; } "that awful slime from the crypt."; } } "You smell nothing unexpected."; Take: if (lm_n==44) "There's not anything here you can take."; Taste: "Probably not a good idea to stick your tongue on that."; ]; ! To get back standard Inform behavior for any of these, remove both the ! replace command and the subsequent routine of the same name. Replace ScoreSub; Replace InvSub; Include "VerbLib"; Include "dirs_2"; [ InvSub item number_carried; print "You are carrying "; objectloop (item in player) { if (item ~= rash) { give item workflag; number_carried++; } else give item ~workflag; } if (number_carried == 0) print "nothing"; else WriteListFrom (child(player), FULLINV_BIT + ENGLISH_BIT + RECURSE_BIT + WORKFLAG_BIT); print ".^You have an odd rash on your right arm"; if (slime has general) print ".^You still smell from where the slime from the crypt got on you"; if (gasoline has general) print ".^You are covered with gasoline"; "."; ]; [ ScoreSub; "This game does not keep score. Though if the state of your arm is any indication, you're not winning yet."; ]; !============================================================================ ! Object classes Class Room with name "wall" "walls" "dust" "door" "doorway", image [; return 1; ], cant_go "There's nowhere to go in that direction.", has light; Class NPC with description [; print (name) self, " looks very pale"; if (random(3) == 1 && self ~= Daisy or Joe) { print ". "; if (self has female) print "She"; else print "He"; print " keeps scratching at an odd rash on "; switch (self) { Tom: "the side of his neck."; Sam: "the back of his hand."; Sally: "her cheek."; DrGreen: "his shoulder."; Bill: "his chest."; } } "."; ], life [; Kiss: "Yours and ", (the) self, "'s isn't that sort of relationship."; WakeOther: print_ret (CTheyreorThats) self, " awake, just confused."; Give, Show: print_ret (CThatorThose) self, " doesn't seem interested."; Ask, Answer, Order, Tell: self.dialogue (); rtrue; ], has animate proper; Class Corpse, with name "body" "corpse" "cadaver", short_name "body", describe "There is a dead body here.", before [; Take: "It is too heavy."; ], has proper; !============================================================================ ! The rooms Room FrontYard "Front Yard", with name "yard" "front" "grass" "lawn", image [; return front_yardPIC; ], description "You are in the front yard of a large abandoned Victorian house. Stone steps lead up to a wide porch.", u_to FrontStairs, n_to FrontStairs, in_to FrontStairs, s_to Clearing; Object FrontStairs "stairs", with name "stairs" "steps" "stairway" "porch" "stone" "crack" "cracks", found_in [; if (location == FrontYard or Porch) rtrue; rfalse; ], description "The stone is cracked in many places.", door_dir [; if (location == FrontYard) return n_to; return s_to; ], door_to [; if (location == FrontYard) return Porch; return FrontYard; ], has scenery open ~openable door; Room Porch "Porch", with image [; if (FrontDoor has open) return front_door_openPIC; return porchPIC; ], description "You are on the porch. Stone steps lead down to the front yard.", d_to FrontStairs, s_to FrontStairs, out_to FrontStairs, in_to FrontDoor, n_to FrontDoor; Object FrontDoor "front door", with found_in EntryHall Porch, name "front" "door" "doorway", before [; Open, Close, Examine: if (location==Porch) picwin.closeup=Porch.image(); ], door_dir [; if (location == EntryHall) return s_to; else return in_to; ], door_to [; if (location == EntryHall) return Porch; else return EntryHall; ], with_key large_key, has scenery openable lockable door; Room EntryHall "Entry Hall", 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 swings shut behind you. You hear an ominous *click*."; } ], description "You are in an entry hall. Doorways lead in all directions, and a stairway goes up.", e_to Library, w_to Kitchen, n_to DiningRoom, s_to FrontDoor, out_to FrontDoor, u_to EntryHallStairs; Room Library "Library", with image [; if (SideYardDoor has open) return lib_openPIC; return libraryno_notePIC; ], description [; "You are in the old, dusty library."; ], w_to EntryHall, e_to SideYardDoor, out_to SideYardDoor; Object SideYardDoor "door", with name "side" "door" "double" "doors" "doorway", description "A wide set of double doors leading out to the side yard.", 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 "Side Yard", with name "yard", image [; if (SideYardDoor hasnt open) return side_yard_closedPIC; return side_yardPIC; ], description [; "You are in the side yard. You can follow the fence to the north."; ], w_to SideYardDoor, in_to SideYardDoor, n_to BackYard; Room BackYard "Back Yard", with name "yard", 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; } ], description "You are in the fenced back yard. The fence follows the side of the house around to the east.", e_to SideYard, s_to BackYardDoor, in_to BackYardDoor, n_to Gate; Object Gate "gate", with name "gate", found_in BackYard Cemetery, description "It creaks slightly on its hinges.", describe [; print "The gate to the "; if (location==Cemetery) print "south "; else print "north "; print "is "; if (self has open) "open."; "closed."; ], door_dir [; if (location == Cemetery) return s_to; else return n_to; ], door_to [; if (location == BackYard) return Cemetery; else return BackYard; ], has static picturescenery openable door; Room Cemetery "Cemetery", with image [; if (Joe notin location) { if (Gate hasnt open) { if (CryptDoor has open) return cemetery_opencrypt_closedgatePIC; if (shovel has moved) return cnj_gate_closed_no_shovelPIC; return cemetery_no_joePIC; } if (CryptDoor has open) return cemetery_opencrypt_opengatePIC; if (shovel hasnt moved) return cnj_gate_open_shovelPIC; else return cnj_gate_open_no_shovelPIC; } if (Gate hasnt open) return gate_closedPIC; return CemeteryPIC; ], after [; Go: if (noun==w_obj) print "You stumble out of the undergrowth and into the cemetery.^"; ], description "You are in a small fenced cemetery. There are six newly dug graves. A family crypt stands nearby.", s_to Gate, in_to CryptDoor, cant_go [; if (noun==d_obj) <>; if (noun==e_obj && Forest_1 has visited) "Try as you might, you can't find the path again."; ]; Object CryptDoor "crypt door" Cemetery with name "door" "doorway" "family" "crypt" "stairs" "steps" "step" "stairway", description [; print "The crypt is very old. Its rust-stained door"; if (self has open) " stands open."; " is closed."; ], when_open "The crypt door is open.", door_dir [; if (location==Cemetery) return in_to; return out_to; ], door_to [; if (location==Cemetery) return InsideCrypt; return Cemetery; ], before [; Open: if (self hasnt general) "The door is stuck shut."; Climb: <>; Unlock: if (second==shovel) { if (self has general) "The door is no longer stuck."; give self general; give self open; picwin.closeup = Cemetery; "Using the shovel, you pry the crypt door open."; } ], after [; if (location==InsideCrypt) rfalse; Open: if (Gate hasnt open) picwin.closeup = cemetery_opencrypt_closedgatePIC; else picwin.closeup = cemetery_opencrypt_opengatePIC; Close: if (Gate hasnt open) picwin.closeup = cnj_gate_closed_no_shovelPIC; else picwin.closeup = cnj_gate_open_no_shovelPIC; ], has static picturescenery openable door; Room InsideCrypt "Crypt" with name "coffin" "coffins" "casket" "caskets", image [; return cryptPIC; ], description "You are in the family crypt.", out_to CryptDoor, u_to CryptDoor; Room Clearing "Forest Clearing" with name "clearing" "forest" "woods" "tree" "trees", image [; if (van_exterior hasnt open) return vanPIC; return van_door_openPIC; ], description "You are in a clearing in the woods.", n_to FrontYard, e_to Forest_4, in_to van_exterior, cant_go [; if (noun==u_obj or d_obj) "There's nowhere to go in that direction."; "As you head in that direction, you start to feel very tired. A sharp smell assails your nostrils, and you become dizzy. Soon, you have to turn back."; ]; Object van_exterior "van" Clearing with name "vehicle" "van" "door" "ignition", found_in Clearing InsideVan, describe [; if (location==InsideVan) rtrue; print "The van is parked here"; if (self has open) ". Its door is open."; "."; ], description "This is the van you came here in.", door_dir [; if (location == InsideVan) return out_to; return in_to; ], door_to [; if (location==InsideVan) return Clearing; return InsideVan; ], with_key car_keys, before [; SwitchOn: if (location==InsideVan) "The ignition gives only a dead click."; "You'll need to get inside it first."; ], after [; Open: if (location==InsideVan) rfalse; picwin.closeup = van_door_openPIC; Close: if (location==InsideVan)rfalse; picwin.closeup = vanPIC; ], has static door openable lockable locked; Room InsideVan "Inside the Van" with name "seat" "seats" "steering" "wheel", image [; if (gasoline hasnt moved) return van_interiorPIC; return van_interior_nogasPIC; ], description [; print "You are in the van. Film equipment and monitors crowd the back"; if (self hasnt visited) { rash.number++; print ".^Looking over the equipment, memories start to come back to you. You and your friends drove out here in order to shoot part of a documentary on old, abandoned houses - ~Mystery Houses~ was your working title. You arrived, you explored a bit. ^You went down into the basement. ^After that... everything's fuzzy. Absently, you scratch at your arm"; } "."; ], out_to van_exterior; Room Kitchen "Kitchen", 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. ! ! (I've removed the western door to the forest, so some of these ! options are now meaningless. -- Gentry) ! if (Kitchen_Door has open) x = x + 1; if (cabinet has general) x = x + 2; if (cabinet has open) x = x + 4; if (refrigerator has open) x = x + 8; 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 "You are in the kitchen. There is a refrigerator, stove, and cabinet.", in_to [; if (Hole_Kitchen in Kitchen) return Hole_Kitchen; rfalse; ], w_to [; if (Hole_Kitchen in Kitchen) return Hole_Kitchen; rfalse; ], e_to EntryHall; Room DiningRoom "Dining Room", with number 0, image [; if (CandleUnlit hasnt moved) { if (BackYardDoor has open) return dining_room_openPIC; return dining_roomPIC; } else { if (BackYardDoor has open) return dining_no_candle_openPIC; return dining_roomno_candlePIC; } ], before [; if (Darkness_Daemon has general && self hasnt general && rug hasnt general) { give self general; print "You trip over the rug and fall"; if (CandleLit in player) { print ", nearly dropping your candle"; } print_ret ". There seems to be something under the rug where you tripped."; } ], description "You are in the dining room.", s_to EntryHall, n_to BackYardDoor, out_to BackYardDoor; Object BackYardDoor "back door", with name "back" "door" "doorway" "double" "doors", description "A wide set of double doors leading out to the back yard.", 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 scenery picturescenery openable door; !============================================================================ ! Upstairs area Room Junction "Junction", with image [; return junctionPIC; ], description "You are at the junction of an east/west hallway and a hallway going north.", d_to EntryHallStairs, e_to Doorway_3, w_to Doorway_1, n_to Stairway_1; Object EntryHallStairs "stairs", with found_in Junction EntryHall, name "stairs" "steps" "stairway", description "The steps creak beneath your feet.", before [; Climb: <>; ], 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 image [; return doorwayPIC; ], description "There is a doorway here.", e_to Junction, w_to Doorway_2, n_to NurseryDoor, in_to NurseryDoor; Object NurseryDoor "door", with name "door" "doorway", found_in [; if (location == Doorway_1 or Nursery) rtrue; rfalse; ], door_dir [; if (location == Doorway_1) return n_to; return s_to; ], door_to [; if (location == Doorway_1) return Nursery; return Nursery; ], has open ~openable static scenery picturescenery door; Room Nursery "Nursery", with name "stain" "stains", image [; return nurseryPIC; ], description "You are in an old nursery.", s_to Doorway_1, out_to Doorway_1; Room Doorway_2 "Doorway", with image [; return doorway_westPIC; ], description "There is a doorway here.", e_to Doorway_1, n_to BoysBedroomDoor, in_to BoysBedroomDoor; Object BoysBedroomDoor "door", with name "door" "doorway", found_in [; if (location == Doorway_2 or BoysBedroom) rtrue; rfalse; ], door_dir [; if (location == Doorway_2) return n_to; return s_to; ], door_to [; if (location == Doorway_2) return BoysBedroom; return Doorway_2; ], has open ~openable static picturescenery scenery door; Room BoysBedroom "Boy's Bedroom", with image [; ! includes NOTE return boys_bedroomPIC; ], description "You are in a boys bedroom.", s_to Doorway_2, out_to Doorway_2; Room Doorway_3 "Doorway", with image [; return doorwayPIC; ], description "There is a doorway here.", w_to Junction, e_to Doorway_4, n_to LargeBedroomDoor, in_to LargeBedroomDoor; Object LargeBedroomDoor "door", with name "door" "doorway", found_in [; if (location == Doorway_3 or LargeBedroom) rtrue; rfalse; ], door_dir [; if (location == Doorway_3) return n_to; return s_to; ], door_to [; if (location == Doorway_3) return LargeBedroom; return Doorway_3; ], has open ~openable static picturescenery scenery door; Room LargeBedroom "Large Bedroom", with image [; if (dagger has moved) return large_bedroom_barePIC; return large_bedroomPIC; ], initial [; if (self hasnt visited && DaisyCorpse notin Tower) { move dagger to self; "A dagger is thrown at you from outside the room. It misses!"; } ], description "You are in a large bedroom.", s_to Doorway_3, out_to Doorway_3; Room Doorway_4 "Doorway", with image [; return doorway_eastPIC; ], description "There is a doorway here.", w_to Doorway_3, n_to SmallBedroomDoor, in_to SmallBedroomDoor; Object SmallBedroomDoor "door", with name "door" "doorway", found_in [; if (location == Doorway_4 or SmallBedroom) rtrue; rfalse; ], door_dir [; if (location == Doorway_4) return n_to; return s_to; ], door_to [; if (location == Doorway_4) return SmallBedroom; return Doorway_4; ], has open ~openable static picturescenery scenery door; Room SmallBedroom "Small Bedroom", with image [; if (hair has moved) return small_bedroom_nohairPIC; return small_bedroomPIC; ], description "You are in a small bedroom.", s_to Doorway_4; Room Stairway_1 "stairway", with image [; return at_stairwayPIC; ], description "You are at a stairway.", s_to Junction, u_to AtticStairs, n_to Doorway_5; Object AtticStairs "stairs", with found_in Attic Stairway_1, name "stairs" "steps" "stairway", description "These stairs are steep and winding.", before [; climb: <>; ], door_dir [; if (location == Attic) return d_to; return u_to; ], door_to [; if (location == Attic) return Stairway_1; return Attic; ], has scenery static picturescenery open ~openable door; Room Doorway_5 "Doorway", with image [; return doorway_northPIC; ], description "There is a doorway here.", s_to Stairway_1, n_to StudyDoor, in_to StudyDoor; Object StudyDoor "door", with name "door" "doorway", found_in [; if (location == Study or Doorway_5) rtrue; rfalse; ], door_dir [; if (location == Study) return s_to; return n_to; ], door_to [; if (location == Study) return Doorway_5; return Study; ], has open ~openable static picturescenery door scenery; Room Study "Study", with image [; if (SecretDoor in location) return study2PIC; if (button in location) return Study_ButtonPIC; return study1PIC; ], description [; "You are in the study."; ], n_to [; if (SecretDoor in location) return SecretDoor; rfalse; ], e_to Bathroom, s_to Doorway_5; Object SecretDoor "wall", with name "wall" "door" "secret", found_in MustyCrawlspace Study, when_open [; if (location==Study) "A secret panel in the north wall stands open."; "A secret panel in the south wall stands open."; ], door_to [; if (location == Study) return MustyCrawlspace; return Study; ], door_dir [; if (location == Study) return n_to; return s_to; ], has door open ~openable absent; Room MustyCrawlspace "Musty Crawlspace", with image [; if (journal hasnt moved) return crawlspacePIC; return crawlspace_nobookPIC; ], description "You are in a musty crawlspace.", s_to [; if (SecretDoor in location) return SecretDoor; rfalse; ]; Room Bathroom "Bathroom", with name "tree", image [; if (BathroomWindow hasnt open) { if (towel hasnt moved) return bathroomPIC; return bathroom_barePIC; } else { if (towel hasnt moved) return bathroom_window_openPIC; return bathroom_bare_window_openPIC; } ], description "You are in the bathroom.", w_to Study, e_to BathroomWindow, out_to BathroomWindow; Object BathroomWindow "window", with name "window", found_in Bathroom Treetop, description [; print "It was boarded up, but it looks like the boards were recently pried loose"; if (location==Bathroom) print ". You can see a tall tree growing right outside"; "."; ], before [; Search: <>; ], after [; Open: if (location == Bathroom) { if (towel hasnt moved) picwin.closeup = bathroom_window_openPIC; else picwin.closeup = bathroom_bare_window_openPIC; } else picwin.closeup = treetop_window_openPIC; Close: if (location == Bathroom) { if (towel hasnt moved) picwin.closeup = bathroomPIC; else picwin.closeup = bathroom_barePIC; } else picwin.closeup = treetopPIC; ], door_dir [; if (location==Bathroom) return e_to; return w_to; ], door_to [; if (location==Bathroom) return Treetop; return Bathroom; ], has door openable scenery picturescenery; Room StorageRoom "Storage Room", with image [; if (camera in location){ if (trunk hasnt open) return storage_cameraPIC; return storage_camera_openPIC; } if (trunk has open) return open_trunkPIC; return storage_roomPIC; ], description "You are in a storage room.", w_to Attic, out_to Attic; Room Attic "Attic", with image [; ! actually, we should have a third picture here for the present ! but closed trap door if (camera in location) { if (trapdoor hasnt concealed) { if (trapdoor has open) { if (hammer hasnt moved) return attic_hammer_door_cameraPIC; else return attic2_cameraPIC; } else { if (hammer hasnt moved) return attic_hammer_closed_cameraPIC; else return Attic2_td_cameraPIC; } } else { if (hammer hasnt moved) return attic1_cameraPIC; return attic_no_hammer_cameraPIC; } } 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 [; "You are in the attic."; ], d_to AtticStairs, e_to StorageRoom, in_to StorageRoom, u_to [; if (trapdoor notin location) "The ladder leads up to the ceiling and stops."; return trapdoor; ]; Object trapdoor "trap door", with name "trapdoor" "trap" "door", 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 scenery picturescenery concealed absent; Room Tower "Tower", with image [; if (Daisy in Tower)return towerPIC; if (gun has moved && large_key has moved) return tower_allgonePIC; if (gun has moved) return tower_nogunPIC; if (large_key has moved) return tower_nokeyPIC; return tower_daisydeadPIC; ], initial [; if (Daisy in Tower) { StartDaemon(Daisy); } ], description "You are in the tower.", d_to trapdoor, out_to trapdoor; !============================================================================ ! Tunnel and tree Room TreeTop "Top Of The Tree", with name "tree" "branch" "branches" "leaf" "leaves", image [; if (BathroomWindow has open) return treetop_window_openPIC; else return treetopPIC; ], description "You are at the top of a very tall tree. One sturdy branch extends nearly to an upstairs window.", before [; Go: if (noun == FrontYard) print "You drop from one of the lower branches."; rfalse; ], w_to BathroomWindow, in_to BathroomWindow, d_to FrontYard; !============================================================================ ! Forest Maze ! I've ripped out most of the forest maze, because that shit ! never made a lick of sense. -msgC Class ForestRoom, class room, with short_name "Forest", name "forest" "woods" "tree" "trees", image [; return ForestPIC; ], description "You are in a forest.", cant_go [; if (noun == u_obj or d_obj) "There's nowhere to go in that direction."; "As you head in that direction, you start to feel very tired. A sharp smell assails your nostrils, and you become dizzy. Soon, you have to turn back."; ]; ForestRoom Forest_1, with before [; Go: if (noun==w_obj) { if (People in EntryHall) ClearEntry(); else move Joe to Cavern; } ], w_to Cemetery, e_to Forest_2, s_to Forest_5; ForestRoom Forest_2, with w_to Forest_1, s_to Forest_6; ForestRoom Forest_3, with n_to Forest_5, e_to Forest_4; ForestRoom Forest_4, with n_to Forest_6, w_to Forest_3; ForestRoom Forest_5, with n_to Forest_1, s_to Forest_3, e_to Forest_6; ForestRoom Forest_6, with n_to Forest_2, s_to Forest_4, w_to Forest_5; !============================================================================ ! Basement and pantry area Room SmallPantry "Small Pantry", with name "jars" "jar" "bottles" "bottle", image [; return pantryPIC; ], description "You are in a small pantry.", out_to Hole_Kitchen, e_to Hole_Kitchen, d_to PassageStairs; Object PassageStairs "Stairs", with name "stairs" "steps" "stairway", description [; if (location==SmallPantry) "Stone steps lead down into the earth."; "Stone steps lead back up to the pantry."; ], before [; Climb: <>; ], 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; Room Passage "Passage", with image [; return passagewayPIC; ], description "You are at the north end of a narrow north/south passageway.", u_to PassageStairs, s_to MoistBasement; Room MoistBasement "Moist Basement", with image [ x; if (MoistStairs in location) { if (flower hasnt moved) return basement_stairsPIC; return basement_noflower_stairsPIC; } if (brick has moved) { if (flower hasnt moved) return basement_nobrickPIC; return basement_noflower_nobrickPIC; } if (algae has general) { if (flower hasnt moved) return basement_noalgaePIC; return basement_noflower_noalgaePIC; } if (flower hasnt moved) return basementPIC; return basement_noflowerPIC; ], description [; print "You are in a moist basement"; if (Algae in location) print ". Damp algae covers the walls"; "."; ], n_to Passage, d_to [; if (MoistStairs notin location) rfalse; else return Moiststairs; ]; Object MoistStairs "upper stairs", with name "steps" "stairs" "stairway" "upstairs", description "These steps are slick with mold.", before [; Climb: <>; ], found_in Stairway_2 MoistBasement, door_to [; if (location == Stairway_2) return MoistBasement; return Stairway_2; ], door_dir [; if (location == Stairway_2) return u_to; return d_to; ], has door open ~openable scenery absent; Room Stairway_2 "Stairway", with image [; return on_stairwayPIC; ], description "You are on a stairway.", d_to MustyStairs, u_to MoistStairs; Object MustyStairs "lower stairs", with name "lower" "downstairs" "steps" "stairs" "stairway", description [; if (location==Stairway_2) "These steps lead even further down."; "These steps lead back up to the surface."; ], before [; climb: <>; ], found_in Stairway_2 Tunnel, door_to [; if (location == Tunnel) return Stairway_2; return Tunnel; ], door_dir [; if (location == Tunnel) return u_to; return d_to; ], has door open ~openable scenery; Room Tunnel "Tunnel", with name "tunnel", image [; return tunnelPIC; ], description "You are at the south end of a long tunnel.", n_to Cavern, u_to MustyStairs; Room Cavern "Cavern" with name "cave" "cavern" "stalagmite" "stalagtite", image [; if (seal has general) return cavern_seal_brokenPIC; if (JoeCorpse in location) return cavern_joedeadPIC; return cavernPIC; ], initial [; if (Joe in self && self hasnt visited) StartDaemon(Joe); ], description "You are in a large underground cavern.", s_to Tunnel, n_to seal, in_to seal; Object seal "Waxy Seal" with name "wax" "seal" "waxy" "fissure" "opening" "hole", found_in Cavern Nest, describe [; print "A fissure in the "; if (location==Cavern) print "north "; else print "south "; print "wall is plugged by a thick, waxy seal"; if (self has general) ". An opening has been broken through the seal, just wide enough for you to squeeze through."; "."; ], description [; print "The seal is dull yellow in color, and very thick"; if (self has general) ". The opening is narrow and jagged, but you could probably squeeze through if you weren't carrying too much."; ". It stretches across the entire width of the fissure."; ], before [; Attack: if (self has general) "The seal is already broken."; if (second == nothing) "Your bare hands won't do much good against that."; if (second ~= hammer) "That wouldn't be very effective."; give self general; "With a few good swings, you break an opening through the seal."; ], door_dir [; if (location == Cavern) return n_to; return s_to; ], door_to [; if (self hasnt general) "The waxy seal blocks the fissure completely."; if (gasoline in player) "You can't squeeze through there carrying that gasoline can."; if (gas_empty in player) "You can't squeeze through there carrying that gasoline can."; if (shovel in player) "You can't squeeze through there carrying that shovel."; if (hammer in player) "You can't squeeze through there carrying that sledgehammer."; if (children(player) > 2) "You're still carrying too much to squeeze through."; print "You just manage to squeeze through the opening.^"; if (location == Cavern) return Nest; return Cavern; ], has door open; Room Nest "The Nest" with name "holes" "honeycomb" "bugs" "bug" "insect" "insects" "cave" "cavern" "stalagmite" "stalagtite", image [; return nestPIC; ], description "You are in the center of the nest. The walls are covered with a thick coating of dry, sticky fibers. Beneath this, the stone is honeycombed with thousands of dime-sized holes, through which millions of bugs crawl in and out of the chamber.", s_to seal, out_to seal; !============================================================================ ! 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 [except for all the shit I added and changed -- MSG], with the same names (or as close as Inform will accept). Object rash "rash" with name "rash" "bumps" "bump" "welts" "welt" "arm" "wrist" "skin" "nodule" "nodules" "blood" "blood" "crack" "cracks" "pulse", description [; print "There's a patch of raised red bumps "; switch (self.number) { 0: "along the inside of your right wrist. The skin around it is inflamed and itchy."; 1: "along the inside of your right forearm. Some of the bumps have swelled and hardened into nodules that are sore to the touch."; 2: "spreading up and down your right forearm. It looks like it's spreading."; 3: "all up and down your right arm. It looks really bad. The skin is swollen, and some of the bumps have broken open and are bleeding."; 4: "covering your entire arm. Your skin is cracked and weeping everywhere. In some places, you can see a visible, irregular pulse, as though something were crawling just underneath the surface."; } ], before [; Touch: "It's painful to the touch."; Rub: "Scratching brings only momentary relief."; Take, Drop, LookUnder: "You can't do that without peeling off your skin."; ], number 0, daemon [; if (self hasnt general) give self general; else { StopDaemon(self); "Something itches on your arm."; } ], has static scenery; Object houseexterior "house" with name "house" "mansion" "old" "victorian" "abandoned" "chimney" "roof" "tower", found_in FrontYard BackYard SideYard Porch, description [; print "Old, rambling, decrepit. A precarious tower rises from one side of the roof"; if (self hasnt general) { give self general; ". Bits and pieces are coming back to you. You came here to make... some sort of documentary...?"; } else "."; ], before [; Examine: rfalse; Touch: if (self in FrontYard) { "It's too far away."; } else "Beneath the crumbling paint, the wood is soft, rotten."; Enter: <>; default: "That's not something you can do to a house."; ], has static scenery; Object fronttree "tree" FrontYard, with name "tree" "branches" "branch", description "Twisted and colorless, even in midsummer. Its branches scrape against the side of the house.", before [; Climb, Enter: "The branches are too high."; ], has picturescenery scenery static; Class Note, with parse_name [ n ord ord2; switch (self.number) { 1: ord = 'first'; ord2 = '1st'; 2: ord = 'second'; ord2 = '2nd'; 3: ord = 'third'; ord2 = '3rd'; 4: ord = 'fourth'; ord2 = '4th'; } while (NextWord() == 'note' or 'memo' or 'letter' or 'paper' or ord or ord2) n++; return n; ], short_name [; switch (self.number) { 1: print "first "; 2: print "second "; 3: print "third "; 4: print "fourth "; } print "note"; rtrue; ], describe [; if (self.number > 0) rfalse; NoteOrder(self); rfalse; ], article "the", sprite [; return note_itemPIC; ], description "There is writing on it."; Note Note_1 EntryHall, with number 0, image [; return note1PIC; ], text "IT IS TOO LATE. THEY HAVE TAKEN OVER."; Note Note_2 Library, with number 0, image [; return note2PIC; ], text "ONLY ONE WAY TO STOP THEM - KILL THEM ALL!"; Note Note_3 BoysBedroom, with number 0, image [; return note3PIC; ], text "THEY MUST NEVER GET OUT! I MUST FINISH THIS!!"; Note Note_4 Tower, with number 0, image [; return note4PIC; ], text "THE HEART -- IT'S IN THE BASEMENT!"; [ NoteOrder current n biggest; biggest = 0; objectloop (n ofclass Note) { if (n.number > biggest) biggest = n.number; } current.number = ++biggest; ]; Object WelcomeMat "welcome mat" Porch, with name "welcome" "mat", description "Scuffed and damp. Lying next to it is a tiny insect husk.", before [; Take, Push, PushDir: "It's fine where it is."; LookUnder: "Just a damp spot on the stone."; ], has scenery picturescenery; Object husk "insect husk" Porch, with image [; return huskPIC; ], name "insect" "bug" "beetle" "shell" "husk", description [; picwin.closeup = self; "It rests on its back, tiny legs curled up and brittle. It looks a bit like an empty cicada shell, only more beetle-like."; ], before [; Take, Touch: "A dead bug? No thank you."; ], has scenery picturescenery; Object CandleUnlit "unlit candle" DiningRoom, with name "candle" "candlestick" "unlit", sprite [; return candle_itemPIC; ], description "The old candle is half-melted and yellowed.", before [; Burn: if (self notin player) "You dont have it."; if (~~(IndirectlyContains(player, matches))) "You have nothing to light it with."; else { remove self; move CandleLit to player; "The candle gives off a feeble light."; } BlowOut: "It's out already."; ]; Object CandleLit "lit candle", with name "candle" "candlestick" "lit", sprite [; return candle_itemPIC; ], description "The candle gives off a feeble light.", before [; BlowOut: remove self; move CandleUnlit to player; "You blow out the candle."; Drop, PutOn, Insert: "You should blow it out first."; ], has light; Object Cabinet "cabinet" Kitchen, with name "cabinet" "cupboard", image [; if (self hasnt open) return Kitchen.image(); if (matches notin self) return cabinetemptyPIC; return cabinetPIC; ], description [; if (self has open) <>; "It is unlocked."; ], before [; LookBehind: if (self hasnt general) "There's a large hole in the wall, concealed by the cabinet."; Take: "It's too heavy to lift."; Push: if (self has general) "It won't move any farther."; else { give self general; give Hole_Kitchen ~concealed; give Hole_Kitchen ~absent; move Hole_Kitchen to Kitchen; rash.number++; picwin.closeup = Kitchen; "The wall behind it was bricked up, but someone has broken a hole through the bricks - recently, it appears.^ You remember something... did you and your friends do this? Did you go down into the basement? What did you find down there?^ Your arm is itching again."; } Open, Close, Search, Examine: picwin.closeup = self; ], has container openable scenery; Object Hole_Kitchen "hole" with name "hole" "bricks" "brick" "wall", found_in SmallPantry Kitchen, describe [; print "A hole has been knocked in the "; if (location==Kitchen) "west wall."; "east wall."; ], description "The plaster and bricks are broken in, as though someone went after them with a sledgehammer.", door_to [; if (location==SmallPantry) return Kitchen; return SmallPantry; ], door_dir [; if (location==SmallPantry) return out_to; return in_to; ], has door open ~openable static picturescenery concealed absent; ! 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 "matches" Cabinet, with name "matches" "match" "matchbox", number 0, sprite [; return matches_itemPIC; ], description "It's an ordinary matchbox, containing several matches.", before [; Burn: ! NB. that this code restarts the fuse if you light ! an already-lit match. This is true to the original. if (gasoline has general) { picwin.redraw(firePIC); print "The match flares in your hand, and then the flame catches on your gasoline-soaked clothes and races up your arm. In seconds you are engulfed, a human torch. The fire crackles as hundreds of panicking insects attempt to burrow free of your flesh, are caught in the flames, and burst."; if (location==Nest) { deadflag=2; "^The queen worm recoils. You stagger forward, leaving a trail of fire behind you. Around you, nest-fibers shrivel, blacken, and burst into flame. It spreads very quickly. Your last sight on this earth is of the queen worm's own pale flesh, blistered and cracking. Her thrashing cracks the cavern ceiling. Debris rains down, and soon the conflagration is crushed beneath the cave-in. Though your own death quickly follows, you have the satisfaction of knowing that it was not in vain. The nest is destroyed. Those who come to this place after you will find only an abandoned van, a ruined house, and yet another mystery -- but the monstrous danger is gone."; } deadflag=1; "^Though brutal, your sacrifice is of course in vain. You have stopped the infestation within you, but the insects' nest survives. Other people will some day find their way here, and the bugs will spread. It is small comfort to you, as you die, that you will not be alive to see the horror that will eventually, inevitably, ensue."; } if (self.number > 0) "The match is already burning."; give self light; StartDaemon(self); "The match flares to life."; BlowOut: if (self.number == 0) "The match isn't lit."; give self ~light; StopDaemon(self); self.number=0; "With a puff, the match goes out."; Attack: if (verb_word == 'strike') <>; ], after [; Drop: if (self.number > 0) { give self ~light; StopDaemon(self); self.number = 0; if (gas_smell notin location) "The match goes out."; deadflag=1; picwin.redraw(firePIC); "The match lands in a puddle of gasoline and ignites it, engulfing the whole area in flames. Unfortunately, you are caught in the middle. Within seconds, you are on fire as well. The searing agony of the flames is matched only by your horror at the things crawling out of your own skin to escape them... fortunately, you are soon unaware of either."; } Examine: if (self has light) "One of the matches is lit."; ], daemon [; self.number++; if (self.number == MATCH_DURATION) { give self ~light; StopDaemon(self); self.number = 0; "The match goes out."; } ], has pluralname; Object Stove "stove" Kitchen, with name "stove" "range" "gas", description "A dilapidated old relic.", before [; SwitchOn, Burn: "Just a dusty click. No gas."; ], has scenery; Object Refrigerator "refrigerator" Kitchen, with name "refrigerator" "fridge" "freezer" "icebox" "refridge" "door", image [; if (self hasnt open) return Kitchen.image(); if (JugEmpty in self) return refrigeratorPIC; else return refrigeratoremptyPIC; ], description "The refrigerator door is rust-stained and askew.", before [; Open, Close, Search: picwin.closeup = self; Examine: if (self has open) <>; ], has scenery container openable; Object JugEmpty "empty pitcher" Refrigerator, with name "pitcher" "Empty" "jug", article "an", sprite [; return pitcher_itemPIC; ], before [; Receive: if (noun == gasoline or gas_empty or hammer or shovel) "That won't fit."; ], capacity 1, has container open; Object Sink "sink" Kitchen, with name "sink" "faucet" "faucets" "tap" "taps" "water", image [; if (Butterknife in self) return sinkPIC; return sinkemptyPIC; ], after [; Search: picwin.closeup = self; ], before [; Examine: <>; SwitchOn: "Just a dry squeak. No running water."; ], has container switchable open ~openable scenery; Object Butterknife "butterknife" Sink, with name "butterknife" "knife" "butter", sprite [; return butterknifePIC; ]; ! Appears underneath the carpet, and opens the chest with the gun ! in it. Object rug "rug" DiningRoom, with name "rug" "carpet" "corner" "bump", parse_name [ n w; if (self has general) w = "bump"; else w= "rug"; while (NextWord() == 'rug' or 'carpet' or 'corner' or w) n++; return n; ], image [; if (self hasnt general) rfalse; if (car_keys hasnt moved) return carkeysPIC; return holePIC; ], describe [; if (DiningRoom hasnt general) rtrue; if (self has general) "A corner of the rug has been pulled back."; "There is a small bump under one corner of the rug."; ], description [; if (DiningRoom hasnt general) "It's worn in places, but still thick"; self.describe(); ], before [; Take: "There's too much heavy furniture on top of it."; Pull, Push, LookUnder: if (self has general) "There's nothing else under the rug."; give self general; move car_keys to DiningRoom; picwin.closeup = self; "You pull back a corner of the rug, revealing a set of car keys."; Examine: if (self has general) { if (car_keys has moved) picwin.closeup = self; picwin.closeup = self; } ], has static picturescenery; Object car_keys "car keys" with name "car" "key" "keys", sprite [; return key_itemPIC; ], after [; Take: if (self hasnt moved) { give self moved; picwin.closeup = rug; "You remember, now. You drove here in a van, and parked it somewhere just south of the house. These must be the keys. Why were they hidden under the rug?"; } ], has pluralname; Object slime "yellowish slime" InsideCrypt, with name "slime" "goo" "jelly" "yellowish" "yellow" "sphere" "spheres" "egg" "eggs", describe "The walls and ceiling are coated with a yellowish, jelly-like slime.", description "It's the same consistency as pudding, and has a pungent smell. Thousands of tiny, gelid spheres are suspended in the goo.", before [; Kiss, Taste: "That's disgusting."; Touch, Take, Rub: give self general; print "You try to scrape some off the wall, but it sticks to your hand. Wiping it off just smears it around more"; if (self hasnt general) { print ". The smell of it is very strong"; if (gasoline has general) ", masking the scent of the gasoline."; "."; } "."; Smell: "It smells strong, a mixture of yeast and cloves."; ], has static picturescenery; Object monitor "monitor" InsideVan with name "video" "equipment" "monitor" "monitors" "screens" "screen" "television" "TV", image [; return trapdoorPIC; ], describe [; if (camera has on) "One monitor is still showing a picture."; rtrue; ], description [; if (camera hasnt on) "The monitors are all dark."; print "One monitor is receiving an image froma a camera inside the house. "; if (camera in StorageRoom) "You see a shot of the storage room."; if (Daisy notin Tower) "You see a shot of the attic. There is a ladder against the wall in the background."; if (trapdoor has concealed) { give trapdoor ~concealed; give trapdoor ~absent; move trapdoor to Attic; picwin.closeup = self; "You see a shot of the attic. There is a ladder against the wall in the background. As you watch, Daisy enters the frame! She glances at the camera, then climbs the ladder and enters a trap door you didn't see before."; } "You see a shot of the attic. There is a ladder against the wall in the background. Above the ladder, you can just make out the outline of the trap door."; ], has static picturescenery; Object gasoline "can of gasoline" InsideVan with name "gas" "gasoline" "petrol" "can" "cannister" "nozzle", invent [; if (inventory_stage==2) rtrue; ], description "There's about a half gallon of gasoline sloshing around the bottom.", sprite [; return gas_itemPIC; ], image [; return firePIC; ], before [; Smell: "Smells like gasoline."; Drink, Taste: "Probably not a good idea."; Search: <>; Burn: if (~~(IndirectlyContains(player, matches))) "You have nothing to light it with."; deadflag=1; picwin.redraw(firePIC); "The gas can explodes, killing you instantly."; Receive: "The nozzle is too small."; Take: if (self hasnt moved) picwin.closeup = van_interior_nogasPIC; Pour: move gas_empty to parent(self); remove self; move gas_smell to location; StartDaemon(gas_smell); "You pour out the gasoline. The whole area now reeks of it."; PourOn, EmptyT: move gas_empty to parent(self); remove self; move gas_smell to location; StartDaemon(gas_smell); if (second ~= player) "You pour gasoline over ", (the) second, ", but it mostly just splashes everywhere."; give self general; StartDaemon(self); print "Your lift the can above your head and pour the gasoline all over yourself. The cold, sharp odor stings your nostrils"; if (slime has general) print ", though it cannot quite cut through the odor of the slime you got on yourself in the crypt"; print ".^"; if (matches in player && matches.number > 0) <>; rtrue; Insert, PourIn, Transfer: if (second==Sink or BathroomSink or Toilet or Shower) { move gas_empty to parent(self); remove self; "The gasoline swirls down the drain and disappears."; } if (second==JugEmpty) "It's probably safer to keep it in the can."; <>; ], daemon [; if (self.number-- == 0) { give self ~general; StopDaemon(self); "The gasoline has evaporated."; } ], number 10, has container; Object gas_empty "empty can" with name "can" "cannister" "nozzle" "gas" "gasoline" "petrol" "Empty", sprite [; return gas_itemPIC; ], description "The gasoline can is empty.", before [; Smell: "The smell of gas is still strong, even though the can is empty."; Drink, Taste, Burn, Search, Pour, PourOn, EmptyT: "The can is empty."; Receive: "The nozzle is too small."; ], has container open; Object gas_smell "gasoline smell", with name "scent" "odor" "gasoline" "gas" "vapor" "vapors", before [; Smell: "Smells like gasoline."; default: "It's just a smell."; ], number 10, daemon [; if (self.number-- == 0) { StopDaemon(self); remove self; } ], has static scenery; ! Daisy has the key. She drops it when she's dead. Object large_key "large key" with name "large" "skeleton" "key", sprite [; return large_key_itemPIC; ], description "It's a large, heavy key. The kind of thing you might lock a dungeon with.", initial "A large key has dropped out of Daisy's pocket."; ! will be thrown at you in the large bedroom Object Dagger "dagger", with name "dagger" "knife", sprite [; return dagger_itemPIC; ], before [; ThrowAt: "You have no idea how to throw a knife properly. You'd just hurt yourself or, at best, miss."; ], description "It's a wicked-looking blade."; Object Towel "towel" Bathroom, with name "towel" "cloth", sprite [; return towel_itemPIC; ], description "Threadbare, but servicable."; ! using the butterknife on the picture will loosen it, ! allowing you to take it Object Picture "picture" Study, with name "picture" "portrait" "painting" "landscape", sprite [; return picture_itemPIC; ], description "It's a nice landscape. Not exactly your cup of tea.", before [; LookBehind: if (self hasnt general) <>; Turn, Loosen: if (self has general) "They're already loosened."; if (second==nothing) "You can't loosen them with your bare hands. You need something thin and flat."; if (second==Dagger) "The point is too narrow for that."; if (second~=butterknife) "That won't work."; give self general; "You loosen the screws enough to remove the picture."; Take: if (self hasnt general) "It is fastened to the wall with screws."; else { give self ~scenery; give self ~static; rfalse; } ], after [; Take: if (self hasnt moved) { move Button to location; "There is a button on the wall."; } ], has static scenery transparent picturescenery; Object screws "screws" Picture, with name "screw" "screws" "bolt" "bolts" "flathead", description "They're ordinary flathead screws.", before [; Turn, Loosen: <>; ], has static scenery pluralname; ! hidden behind picture Object Button "button", with name "button" "knob", description "It seems to control some sort of mechanism inside the wall.", before [; Push: move SecretDoor to location; give SecretDoor open; give SecretDoor ~absent; "Part of the wall opens."; ], has static scenery; Object Journal "journal" MustyCrawlspace, with name "book" "journal" "diary", sprite [; return journalPIC; ], initial "An old book rests in the corner.", description "It's a journal, written by the original owner of this house, sometime in the 18th century.", before [; Read: "AN ACCOUNTE OF FELLE HAPPENYNGS, WHYCH DID OCCURRE DURING THE MONTHE OF THIS AUGUSTE LASTE, IN THE YEARE OF OUR LORDE SEVENTEENE HUNDREDE NINETY & TWO, AS SETTE DOWNE BYE WILBUR GANTRY, A GOODE CHRISTIAN & EDUCATED GENTLEMAN. ^^Ye savages whych dwelle in landes as yette unsettled to ye west of here, do relate legendes of a star whych, coming unfixed from its position appointed bye God, did plummette to ye earthe & awash these landes with a radiance moste unholie. I wot not ye trewth of suche legendes, & yette betimes I phant'sie that trewth they surely be, & that in ye olden tayles lies ye source of all ye troubles I have come upon of late. ^Onlie a weeke hath passed synce, whylst making divers excavations for an extension unto mine roote cellar, I burste threwe a partition of soyle & stone & into a tunnelle carved bye forces natural -- or suche were mine perceptions at ye tyme. In the dayes synce, have mine memories growne no clearer, yette hast mine healthe & mental condition grown steadily worse. Ye affliction of mine skinne hast spredde acrosse ye surface entire of mine bodie. Its cause have I determined, threwe divers experimentations & deductions logickal, to be an infestation of insectes, of a species hitherto unknowne. Tho' no recollection of that whych inflicted this upon me remains, I apprehende the darke fayte that awaites me welle enough. ^Ye strange floweres that grow alonge ye edge of ye woodes seeme to have some influence moste bale-full upon these bugges; they become somnolent & con-fused of sense when exposed to ye muskie scente. Indeede, ye scente hast suche strength that I may not venture beyonde an hundrede yardes of mine house, lest mine owne senses, linked to ye insectes bye some connection infernal, growe con-fused alsoe. For this I thanke ye Providence of our Lorde, for bye it I deduce that ye infestation is contayned, tho' trapped I be alsoe, & beyonde the succour of worldly aide. ^It is mine intente to burne these creatures out at their verie neste, by whych strategie I hope to defeate this moste insidious plague. I have accumulated a goodlie store of lamp-oil with whych to putte this strategie to actione, & I shall assay the attempt to-nighte. To hurrie is mine hyghest prioritie, for I feare that ye insectes have consumed ye greater parte of that within me, & soone mine angencie shall mine owne no longer be. ^God's mercie be upon me, & upon us all."; ]; Object Hammer "sledgehammer" Attic, with name "sledge" "hammer" "sledgehammer", sprite [; return sledgehammer_itemPIC; ], description "Its iron head is heavy and scarred.", has picturescenery; Object Ladder "ladder" Attic, with name "ladder", description "The ladder is bolted to the wall, for some reason.", before [; Climb: if (location == Attic) { if (trapdoor has concealed) "The ladder leads up to the ceiling and stops."; else <>; } ], has static scenery picturescenery; Object camera "camera" StorageRoom with name "camera" "tripod" "video" "viewfinder" "lens" "light", describe "You see a video camera mounted on a tripod.", description "It's Joe's camera. Looking at it brings vague memories back to you... you were making a documentary here, before things got crazy.", before [; Search: "You see the room through the camera's viewfinder."; Take: "It's too heavy to lift. You might be able to push it, though."; Push: "You'll have to specify a direction."; PushDir: if (location == Attic && second == d_obj) "You can't push the camera down stairs. It would fall over and break."; AllowPushDir(); rtrue; ], after [; SwitchOn: "You turn the camera on. A little blinking light on the side indicates that it's transmitting the picture to somewhere nearby."; ], has static switchable; Object Algae "algae" MoistBasement, with name "algae" "mold" "slime", description "Slimy, blackish-green. It covers the lower half of the walls, glistening with moisture.", before [; Rub: if (self has general) "There is nothing else under the algae."; if (second == nothing) "You swipe at the algae with your bare hands, but your efforts only smear the stuff around."; if (second ~= towel) print_ret "That isn't very effective."; give self general; move Brick to MoistBasement; ! reveal the brick "The wall is exposed. There is a loose brick."; ], has static scenery; ! visible only after you have moved the algae Object Brick "brick", with name "loose" "brick", sprite [; return Brick_itemPIC; ], description [; if (self hasnt moved) "The brick is loose."; rfalse; ], after [; take: if (self has general) rfalse; ! don't do this more than once give self general; move keyhole to location; "Removing the brick, you discover a large keyhole set into the wall."; ]; Object keyhole "keyhole" with name "keyhole" "hole" "mechanism", description "It's a keyhole to some sort of mechanism built into the wall.", before [; Receive: if (noun == large_key) <>; "That won't fit in the keyhole."; ], after [; Unlock, Lock: if (self has general) "You hear a rusty click, nothing more."; give self general; move MoistStairs to location; give MoistStairs ~absent; "A portion of the west wall slides back, revealing a staircase."; ], with_key large_key, has container lockable locked scenery; Object Shovel "shovel" Cemetery, with name "shovel" "spade", sprite [; return shovel_itemPIC; ]; Object Trunk "trunk" StorageRoom, with name "trunk" "chest" "impression" "antique" "sea-chest" "sea", image [; return chestemptyPIC; ], description "It's an antique sea-chest, old but still sturdy.", before [; Search: if (self hasnt open) ; if (children(self)==0) { picwin.closeup = self; "The chest is empty. An impression at the bottom looks like it was made to hold a gun."; } ], has static scenery picturescenery container openable lockable; Object Gun "gun" Tower, with name "gun" "pistol" "revolver", number AMMUNITION, sprite [; return gun_itemPIC; ], description [; if (self.number==1) "There is one bullet in the gun."; "The gun is empty."; ], react_before [; Shoot: if (second==self) "There are no bullets left."; ], has concealed; Object fibers "fibers" Nest, with name "web" "webbing" "threads" "thread" "fiber" "fibers" "webs", description "Some sort of dried secretion from the queen worm's skin.", before [; Burn: if (matches notin player) "You haven't anything to burn them with."; "A single match isn't enough to set this stuff on fire."; ], has static scenery; Object queen "queen worm" Nest with name "queen" "worm" "grub", describe [; print "The queen worm is here. Her long, bloated body nearly fills the entire cavern"; if (self hasnt general) { give self general; ".^It comes back to you in a rush -- THIS is what you found, deep beneath the basement... THIS is the thing that laid her eggs inside you and your friends, and then left you to wander free, hoping you'd carry her brood to a more populated place... THIS is the source, the heart of the infestation... this -- this monstrous, blind grub!"; } "."; ], description "She is disgusting, horrific... magnificent.", each_turn [; if (gasoline has general) { if (slime hasnt general) { deadflag=1; "The queen worm's body tenses as she detects the odor of gasoline wafting from you and recognizes it as a threat. More quickly than you would have thought possible, she lashes out, crushing you to a pulp beneath her body."; } "The queen's colossal, eyeless head sways towards you. The fleshy palps surrounding her mouth test the air tentatively. She seems to smell something, but is confused by the scent."; } if (++self.number == 3) { deadflag=1; "Agitated by this proximity to their queen, the bugs inside your flesh finally awaken. They burst forth from the rash on your arm -- then from your mouth, nose, and other orifices. The last thing you see (before the bugs begin burrowing out from behind your eyes) is a moving carpet of the beetle-like creatures, crawling lovingly across their mother's vast skin."; } ], react_before [; Go: "You feel rooted to the spot, transfixed in awe of this hideous thing."; ], before [; Examine: rfalse; default: "That would hardly be effective against this thing."; ], life "Except as a source of food or a fertile host for her eggs, you are beneath this creature's notice.", number 0, has animate female; !-- SOME additional scenery not on the original list Object Books "books" Library, with name "books" "book", description "What books are left are moldy and chewed-on by worms.", before [; Take: "They'd just fall apart in your hands."; ], has static scenery pluralname picturescenery; Object Shelves "shelves" library, with name "shelves" "bookshelf" "bookshelves", description "The shelves are mostly empty. They are still bowed, slightly, from the phantom weight of the books they used to hold.", has static scenery pluralname picturescenery; Object Sofa "sofa" Library, with name "couch" "sofa" "davenport" "divan", description "The sofa is threadbare and sagging.", has static scenery supporter enterable picturescenery; Object LibTable "table" Library, with name "table" "coffee", description "Just a small coffee table.", has static scenery supporter picturescenery; Object Fireplace "fireplace" Library, with name "fireplace" "chimney" "hearth", description "The fireplace is cold and empty.", before [; Search: <>; ], has static scenery picturescenery; Object fence "fence" with name "wooden" "fence", found_in FrontYard SideYard BackYard Cemetery, description "The wooden fence is old, but still too sturdy to break through and too high to climb.", before [; Climb: "It's too high."; ], has scenery; Object Grave "graves" Cemetery, with name "graves" "grave", description "Six open graves, freshly dug.", before [; Enter: "You're not too keen on the idea of climbing into an open grave."; Dig: "They look deep enough already."; Receive: "You'd rather not have to climb in after it."; Search: "Empty. Thank goodness."; ], has static scenery picturescenery; Object Tombstone "tombstone" Cemetery, with name "gravestone" "tombstone", description "The writing is too worn down to read.", text [; <>; ], has static scenery picturescenery; Object Lamp "hanging lamp" DiningRoom, with name "light" "lamp" "hanging" "chandelier", description "The hanging lamp is covered with dust.", before [; Examine: rfalse; default: "You can't reach it."; ], has static scenery picturescenery; Object DiningRoomTable "table" DiningRoom, with name "table", description "You could have sat a dozen people at this table, once.", has supporter static scenery picturescenery; Object Rocker "rocker" Nursery, with name "rocker" "rocking" "chair", description "It's old and dilapidated. One of the rockers is cracked.", before [; Enter: "It looks like it might collapse if you sat in it."; ], has static scenery supporter enterable picturescenery; Object Crib "crib" Nursery, with name "cradle" "crib" "sheets", description "This little bed held a child, once. The sheets are dusty and stained.", has static scenery 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 BedroomCabinet "chest of drawers" with name "cabinet" "cupboard" "drawers" "chest" "of" "bureau" "drawer", found_in BoysBedroom Nursery LargeBedroom, description "An old, empty chest of drawers.", before [; Receive: "No point."; Open: "The drawers are all either missing or jammed shut."; ], has static scenery container openable picturescenery; Object Bed "bed" with name "bed" "mattress", found_in BoysBedroom LargeBedroom SmallBedroom, before [; LookUnder: "Nothing but dust."; ], has supporter static scenery picturescenery; Object OutsideWindows "window" with name "window" "windows", found_in FrontYard SideYard BackYard Porch Attic Study Kitchen BoysBedroom Nursery LargeBedroom SmallBedroom Tower, description [; if (location==FrontYard or SideYard or BackYard) "All the windows are boarded up, except for one on the second floor."; "All the windows are boarded up."; ], before [; Enter, Search: self.description(); rtrue; ], has scenery picturescenery; Object cobwebs "cobwebs" with name "web" "cobweb" "webs" "cobwebs", found_in Attic BoysBedroom MustyCrawlspace DiningRoom Library Study, description "They infest the corners of most of the rooms.", before [; Take, Rub: "There's not much point. They'll just grow back."; ], has pluralname scenery; Object boxes "boxes" StorageRoom, with name "boxes" "box", description "Old empty boxes are piled in the corners.", before [; Search, Open: "The boxes are all empty."; Take, Receive: "No point."; ], has static scenery pluralname container open picturescenery; Object StudyDesk "desk" Study, with name "desk" "antique" "table", description "The old desk's surface stained and warped from years of neglect.", has static scenery picturescenery; Object StudyChair "chair" Study, with name "chair", has static scenery picturescenery; Object Toilet "toilet" Bathroom, with name "toilet" "potty" "john", before [; Enter: "Now's not the time."; ], has static scenery supporter picturescenery; Object Shower "shower" Bathroom, with name "shower", before [; Enter, Take: "You can't -- no running water."; ], has static scenery enterable picturescenery; Object BathroomSink "sink" Bathroom, with name "sink" "faucet" "faucets" "tap" "taps" "water", before [; SwitchOn: "Just a dry squeak. No running water."; ], has switchable container open ~openable static scenery picturescenery; Object BasementTable "table" MoistBasement, with name "table", description "Just an old, wobbly table.", before [; Enter: "It's too wobbly."; ], has scenery static picturescenery supporter enterable; Object Pantryshelves "shelves" SmallPantry, with name "shelf" "shelves", description "A few grime-encrusted jars still sit on the shelves.", has scenery static picturescenery pluralname; !============================================================================ ! The NPCs Object People EntryHall, with name "people" "film" "crew" "friends" "crowd" "everyone" "everybody", describe "The rest of your film crew are here. They look as groggy and confused as you feel.", description "Looks like everyone's accounted for: Tom, Daisy, Sam, Sally, Dr. Green, Joe, and Bill. They're milling around slowly, oblivious to the fact that you've just accidentally locked them all in.", react_before [; Go: if (noun == e_obj or w_obj or n_obj or u_obj) { print "As you leave the room, the rest of your friends wander off."; ClearEntry(); } ], life [; Kiss, Attack: "That seems a bit far-fetched."; WakeOther: "They're awake, just confused."; Give, Show, Tell, Ask, Answer, Order: "You try to get everyone's attention, but they're too confused to notice you. No one seems to have any idea what's happened in the last three or four hours."; ], has animate pluralname picturescenery; Object deadbugs "dead insects" with name "dead" "insect" "insects" "bug" "bugs" "husk" "husks", found_in [; if (location==MoistBasement or BackYard or SmallBedroom or Nursery or Bathroom) rtrue; if (location==Tower && DaisyCorpse in location) rtrue; if (location==Cavern && JoeCorpse in location) rtrue; ], description "There are a number of dead insects lying around the corpse's head.", before [; Take, Touch, Taste, Eat: "Dead bugs? Not likely."; ], has scenery pluralname; NPC Tom "Tom" EntryHall, with name "Tom", dialogue "~I don't know,~ he mutters. ~I don't know what happened...~", has male scenery; Corpse TomCorpse "Tom's body" MoistBasement, with name "Tom" "Tom^s", description "It's Tom. He seems to have been stabbed."; ! Held by Tom's corpse Object flower "flower" MoistBasement, with sprite [; return flower_itemPIC; ], name "flower" "dandelion" "red", initial "Clutched loosely in his hand is a strange-looking flower.", description "It looks a bit like a dandelion, but bigger. Its down is coarser than an ordinary dandelion's, and tinged with red.", after [; Take: if (self hasnt moved) "You gingerly pry the flower from Tom's cold fingers."; ], before [; Smell: "It has a sharp, musky smell, like strong spice. Sniffing it makes you feel briefly dizzy."; ]; NPC Sam "Sam" EntryHall, with name "Sam", dialogue "~There was something... I remember going down into the basement...~", has male scenery; Corpse SamCorpse "Sam's body" BackYard, with name "Sam" "Sam^s", description "It's Sam. He's been hit in the head by a blunt object."; NPC Sally "Sally" EntryHall, with name "Sally", dialogue "She just shakes her head. And keeps shaking it, as though to trying to twitch something loose.", has female scenery; Corpse SallyCorpse "Sally's body" SmallBedroom, with name "Sally" "Sally^s", description [; print "It's Sally. She has a large lump on her head"; if (hair has concealed) { give hair ~concealed; ". There is a strand of blond hair on her dress."; } else "."; ], before [; Search: give hair ~concealed; if (hair hasnt moved) "You find a strand of blond hair on her dress."; ]; Object hair "blond hair" SmallBedroom, with sprite [; return hair_itemPIC; ], name "long" "blond" "blonde" "strand" "of" "Sally^s" "hair", initial "There is a long, blond hair stuck to Sally's dress.", description "It's about Daisy's length.", before [; Cut: "What would you do with half a hair?"; ], after [; Take: if (self hasnt moved) "You gently pluck the hair from her dress."; ], has concealed; NPC DrGreen "Dr. Green" EntryHall, with name "Dr" "Green" "Doctor", dialogue "~We have to get out!~ Dr. Green shouts, to no one in particular. ~We have to get out of here!~", has male scenery; Corpse GreenCorpse "Dr. Green's body" Nursery, with name "Dr" "Doctor" "Green" "Green^s", description "It's Dr. Green. It appears he has been stabbed."; NPC Joe "Joe" EntryHall, with name "Joe", describe "Joe is here.", description [; switch (location) { EntryHall: "Joe looks utterly shell-shocked."; Cemetery: "Joe is wandering among the graves, scraping absently at the dirt with the shovel."; Cavern: "He looks completely mad. His eyes are cold and dead, but his skin writhes with little bumps, crawling around just beneath the surface."; } ], dialogue [; switch (location) { EntryHall: "~Where did I leave the camera?~ Joe asks in a shaky voice. ~Does anyone remember where I left the camera?~"; Cemetery: "~It was around here, somewhere,~ Joe mutters, not really listening to you. ~I smelled something... I thought...~ He trails off."; Cavern: "Joe just grins. You can see things squirming behind his teeth."; } ], react_before [; Examine: rfalse; Go: if (location~=Cavern) rfalse; if (noun==n_obj) <>; if (noun==s_obj) { StopDaemon(self); if (self.number < 11) { self.number = 5; print "~Take your time,~ Joe calls after you, with that horrible voice. ~There's nowhere you can go, and nothing you can do to stop them.~^"; } else self.number = 13; rfalse; } default: if (noun==shovel && location==Cemetery) "Joe jerks the shovel away from you. ~Mine,~ he snaps."; if (noun==seal) "Joe steps in front of you. ~Not until you're ready,~ he whispers."; ], number 0, daemon [; if (self in location) { switch (++self.number) { 1: "~You made it,~ chuckles Joe. His voice is full of dead clicks and rustling."; 2: "~I thought maybe Daisy got to you. She's insane, you know. To serve the Queen is not an affliction; it is an honor.~"; 3: "~They've changed me completely now,~ says Joe. ~Inside and out.~ A small, beetle-like insect scurries out of his nostril and flies off. ~You're nearly there, too. I can tell. Soon, they'll wake up, and come out, and our transformation will be complete.~"; 4: rash.number++; "~We'll bring back more people. We'll find a way to break the boundaries of this place, and escape!~ He smiles, and your arm itches abominably."; 5: "~It's just a matter of time. Meanwhile,~ Joe stands in front of the fissure, ~the Queen has granted me the privilege of guarding her gates, to see that nothing goes wrong.~"; 6: StopDaemon(self); 11: "Joe coughs, still trying to clear his head."; 12: "Joe seems to be coming around."; 13: give self ~general; StopDaemon(self); "~You'll pay for that,~ Joe snarls."; } } ], each_turn [; if (self.number >= 13) { deadflag = 1; picwin.redraw(cavernPIC); "Joe lunges at you with inhuman speed. His hands lock around your neck. His mouth stretches open, and a torrent of clicking insects pours out onto your face. They immediately start to burrow into your flesh. The pain is terrible, but not half so horrifying as the sensation of all the insects that were already inside you, stirring in response..."; } ], life [; Attack: if (location == Cemetery) { deadflag = 1; "Joe reacts much faster than you. The edge of the shovel hits your skull and everything goes black."; } if (location == Cavern) { if (self hasnt general) { deadflag = 1; "You swing, but Joe grabs your wrist and holds it in an iron grip. He starts to laugh, and you can see things, clicking and scuttling down in the darkness of his throat. A searing pain slashes up your arm. The rash is swelling, splitting, and dozens of bugs are crawling out of the flesh. That is the last thing you see -- and Joe's laughter, the last thing you hear -- before the bugs burst out of your eyes."; } if (second~=shovel && second~=dagger && second ~= hammer) "That's not an effective weapon."; StopDaemon(self); remove self; move JoeCorpse to location; if (second==shovel) print "You swing the shovel with all your strength and connect with Joe's skull. "; if (second==dagger) print "You lunge forward and bury the dagger to the hilt in Joe's chest. "; if (second==hammer) print "You swing the hammer as hard as you can, smashing Joe in the face. "; "Joe drops like an empty sack. Bugs vomit out of his mouth, nose, and ears, scattering across the cavern floor and disappearing into dozens of crevices."; } Show, Give: if (noun == flower) <>; <>; ThrowAt: if (noun~=flower) rfalse; move flower to location; if (location==Cavern) { self.number = 10; StartDaemon(self); give self general; "The flower hits Joe square in the face. He jerks back, shaking his head, disoriented."; } if (location==Cemetery) "Joe jerks away from the flower as it lands at his feet. He gives you a suspicious look."; ], has male scenery; Corpse JoeCorpse "Joe's body", with name "Joe" "Joe^s", description "Joe's lifeless body is twisted and empty-looking."; NPC Bill "Bill" EntryHall, with name "Bill", dialogue "~That awful smell,~ Bill remarks absently, ~it's making my head hurt.~^ Funny, you don't smell anything.", has male scenery; Corpse BillCorpse "Bill's body" Bathroom, with name "Bill" "Bill^s", description "It's Bill. He's been strangled with a pair of pantyhose."; Object pantyhose "pantyhose" Bathroom, with name "panty" "hose" "pantyhose" "stocking" "stockings", description "They're wrapped around Bill's neck so tightly, they cut into his skin.", before [; Take, Pull: "They're wrapped too tightly; you can't get them loose."; Cut: "That won't save Bill, and you don't need the pantyhose that badly."; ], has scenery pluralname; NPC Daisy "daisy" EntryHall, with name "Daisy", react_before [; Examine: rfalse; Go: if (noun == d_obj or out_obj && location==Tower) { remove self; StopDaemon(self); move DaisyCorpse to Tower; move large_key to Tower; give gun ~concealed; rash.number++; if (LargeBedroom hasnt visited) give dagger moved; print "Daisy makes no move to stop you as you climb back down the ladder. When you reach the bottom, you hear a loud BANG from the tower above.^"; } default: if (noun == Note_4 or gun) "Daisy waves the gun at you menacingly. You back off."; ], describe [; if (location == Tower && self.number == 0) "Daisy is here, holding a revolver."; rfalse; ], dialogue [; if (location==EntryHall) { if (self hasnt general) { give self general; "She gives you a strange look. ~I didn't hear you come in,~ she says."; } else "She seems too distracted by something to answer."; } "She's not listening to you. She seems hysterical."; ], number 0, before [; Examine: rfalse; default: if (location==Tower) "~Get back!~ she cries, pointing the gun at you. ~Get away from me!~"; ], life [; Give, Show, ThrowAt: if (noun==flower) "~You can't save me with that,~ Sally moans. ~It confuses them, slows them down... but it can't reverse what's already been done.~"; ], daemon [; if (self in location) { switch (++self.number) { 1: "~So,~ she says, ~you finally found me.~"; 2: "~Don't you get it? They're in you already. They were in ALL of us!~"; 3: "~I couldn't let them get out. I had to stop them. I sabotaged the van, hid the keys.~"; 4: "~But I couldn't get them all.~ Daisy's voice cracks. ~I couldn't keep killing all of my friends.~"; 5: remove self; StopDaemon(self); move DaisyCorpse to location; move large_key to location; gun.number=0; give gun ~concealed; if (LargeBedroom hasnt visited) give dagger moved; rash.number++; "~There's only one bullet left in this gun,~ she says. Her voice suddenly becomes even again. ~I'm sorry we can't share it. But I don't want to be the one left behind... to see what happens when they wake up... and come out.~ ^And before you can react, she puts the muzzle to the side of her head -- and pulls the trigger."; } } ], description [; if (location == Tower) "She seems to be suffering from some sort of breakdown. There are bright red welts on her neck, where she's been scratching at the rash creeping up from her collar."; else "She's the only one here who doesn't look utterly confused. She tugs at a strand of her long, blonde hair and glances at the open doorways."; ], has female scenery; Corpse DaisyCorpse "Daisy's body" with name "Daisy" "Daisy^s", description "It's Daisy. She's shot herself through the head. A spray of dead insects litters the floor behind her."; [ ClearEntry; remove Bill; move Joe to Cemetery; give Joe ~scenery; remove DrGreen; remove Sally; remove Sam; remove Tom; remove People; move Daisy to Tower; give Daisy ~scenery; ]; !============================================================================ ! Entry point routines Object Darkness_Daemon, with found_in [; rtrue; ], number 0, daemon [; if (self has general) rfalse; self.number++; if (self.number > NIGHTFALL) { give self general; StopDaemon(self); "Suddenly, you realize that it is quite dark. You can still see, however. Everything has a slightly grainy, sepia tone, but somehow you can see quite clearly. ^As you ponder this, the itch on your arm flares up again."; } if (self.number > TWILIGHT) "It is getting dark."; ], has scenery; [ Initialise; picwin.redraw(grassPIC); print "You wake up itching.^ It looks like late afternoon. Insects buzz in the tall grass. You stand up, and your head throbs painfully.^ There's the house, just to the north. But where are your crew? Why were you unconscious on the lawn? What happened here?^"; Pause(); ! 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); move rash to player; StartDaemon(rash); ! turns off proportional fonts, creating a monospace effect as in ! the original game ! font off; ! duplicate of the original start-up screen !print "MYSTERY HOUSE^^SIERRA ON-LINE INC^^ !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; print "^[ press any key to continue ]^^"; KeyCharPrimitive(); ! 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; ! } ]; [ FullInstructionsSub; Instructions(); Pause(); Instructions2(); Pause(); Instructions3(); Pause(); Instructions4(); Pause(); Instructions5(); Pause(); Instructions6(); Pause(); print "^^^^"; ]; [ Instructions; print "Welcome to Mystery House... Taken Over.^^"; print "This is an adaptation of Sierra On-Line's seminal classic, ~Mystery House~. Much of the original game has been left intact. For the most part I have confined my tinkering to the game's backstory -- the who's, the why's, the how's, and the how-to-win's. In the process, I've trimmed the map a little bit, revised some of the puzzles, and added a handful of scenes. You will find, however, that in its essentials this is still a murder mystery, and that your own hands will be bloodied before the game is done."; ]; [ Instructions2; print "Although I have added a great deal of descriptive text to bring the objects of the game to life, I have for the most part tried to adhere to the original game's short, minimalist prose style. Where I have embellished the original art, I have used simple lines and stick-figures. That I cannot draw for beans is not related to this decision at all."; ]; [ Instructions3; print "For this adaptation, I have implemented the full Inform library parser. You are no longer limited to two-word commands. However, along with the expanded vocabulary comes an obligation to be more precise in your wording. Specifically, the verb ~use~ will no longer suffice for most puzzles. It will be necessary to describe exactly what you are doing, to what, and with what to reach the end of the game."; ]; [ Instructions4; 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. There are one or two rooms where the doorways in the picture do not match up to the proper directions. In all such cases, the map will always remain consistent; in other words, if you enter a room by going north, you will always leave the room by going south, even if the doorway now appears at the top of the screen. Use the command ~EXITS~ at any time for a list of the directions available."; ]; [ Instructions5; print "Objects depicted in the main picture window are always recognized by the game, even if they don't appear in the text description. Most portable objects will appear in the main picture window when you first encounter them. They will also usually appear as a line of icons just underneath the main picture. An icon always represents an item that you can, at least theoretically, take with you, though you might need to solve a puzzle before you can acquire it. If you pick up an object and then later drop it, it will not reappear in the main picture, but only as an icon."; ]; [ Instructions6; print "A word of caution: this game contains scenes of graphic violence - quite a bit more so than the original game. There are also situations that may disturb readers who have a phobia of insects. Please prepare yourself accordingly."; ]; [ LookRoutine; picwin.closeup = location; ]; [ ChooseObjects obj code; if (code < 2) { if (obj has scenery or static) return 2; rfalse; } ]; !============================================================================ ! Standard and extended grammar Include "Grammar"; Verb meta "information" "info" "inf" * -> FullInstructions; Verb "talk" * animate -> Tell * animate "about" topic -> Tell * "to" animate -> Tell * "to" animate "about" topic -> Tell; Verb "pour" * held -> Pour * "out" held -> Pour * held "out" -> Pour * held "on" noun -> PourOn * held "in"/"into" noun -> PourIn; [ PourSub; "That's not something pourable."; ]; [ PourOnSub; if (noun==d_obj) <>; "That's not something pourable."; ]; [ PourInSub; "That's not something pourable."; ]; Verb "use" * noun -> Use; [ UseSub; "You'll need to be more specific."; ]; Verb "shoot" * noun "with" held -> Shoot * held "at" noun -> Shoot reverse; Verb "fire" * held "at" noun -> Shoot reverse; [ ShootSub; "That wouldn't be very effective."; ]; Extend only "read" first * held -> Read; [ ReadSub; if (noun provides text) { picwin.closeup = noun; noun.text(); } else <>; ]; Extend "unlock" first * noun -> UnlockEasy; [ UnlockEasySub key; if (noun hasnt lockable) "That's not something you can lock or unlock."; if (noun hasnt locked) "It's unlocked already."; if (noun provides with_key) key = noun.with_key; if (key && key in player) <>; "You don't have the proper key."; ]; Verb "loosen" "tighten" "unbolt" = "turn"; Extend "turn" * noun "with" held -> Loosen; Extend only "tighten" "screw" replace * noun "with" held -> Tighten; [ LoosenSub; "That would accomplish little."; ]; [ TightenSub; "That would do little good."; ]; Extend "look" * "room"/"around" -> Look * "out" noun -> Search * "behind" noun -> LookBehind; Verb "scratch" "itch" = "rub"; Extend "clean" * noun "with" held -> Rub; Verb "start" * noun -> SwitchOn * "up" noun -> SwitchOn; Verb "lift" "raise" * noun -> LookUnder; Verb "ascend" "descend" = "climb"; Extend "attack" replace * noun "with" held -> Attack; Verb "extinguish" = "blow"; Extend "blow" * "out" noun -> BlowOut; Extend "put" * "out" noun -> BlowOut; [ BlowOutSub; "That doesn't accomplish much."; ]; [ LookBehindSub; "You don't see anything interesting back there."; ]; Extend "stand" replace * -> Stand * "up" -> Stand * "on" noun -> Stand; [ StandSub whatyourin; whatyourin = parent(player); if (noun hasnt static or scenery) "That wouldn't support your weight."; if (noun ~= nothing) "Probably best not to climb on things."; if (whatyourin hasnt enterable) "You're already standing."; <>; ]; !============================================================================