!\--------------------------------------------------------------------------- GB1.HUG Part One of Guilty Bastards by Kent Tessman (c) 1998 Including: The Pelican Hotel Rocket Pictures Studios Cindy Painter's apartment ---------------------------------------------------------------------------\! #set PART1 #ifset MODULE #if undefined InitModule routine InitModule { location = cindysapartment player = you move volvo to nationalblvd move volvokeys to you move envelope to you envelope is open move cindyskey to you } #endif #endif routine InitPart1 { Activate(milt_daemon) } !---------------------------------------------------------------------------- ! THE PELICAN HOTEL: !---------------------------------------------------------------------------- !----------------- ! YOUR HOTEL ROOM !----------------- room yourroom "your hotel room" { noun "room" adjectives "hotel", "my" long_desc { if counter < 12*60 "Morning"; else "Afternoon"; " sunlight filters through the gauzy drapes. Old wooden night table, fan overhead, the usual trappings. The door leads out into the hallway. The neatly made bed looks exactly the same as it did when you saw it this morning--from where you woke up slumped in the chair in the corner." } extra_scenery "chair", "sunlight", "light", "chain", "chains", \ "ceiling", "wall" out_to outsidehotel d_to outsidehotel before { location MovePlayer { if roomdoor is not open "You open the door and "; else "You "; "leave, closing the door behind you, then head down the stairs and outside to the street." roomdoor is not open return false } } graphic IMAGES1, "inthotel" } scenery roomwindow "window" { in yourroom nouns "window", "curtains", "drapes" adjective "gauzy" article "a" long_desc "Through the drapes, looking out the window, you can see your cousin's Volvo parked on the street below." door_to "You'll really have better luck using the door." before { object DoOpen { "The window is either stuck or painted shut or was never meant to be opened in the first place." } } is openable, not open, transparent } distant_class distant_volvo "Volvo" { found_in yourroom, cindysapartment nouns "volvo", "car", "auto", "automobile", "vehicle", "sportscar", \ "convertible" adjective "my", "cousin's", "volvo", "sports" article "your cousin's" real_object volvo } door roomdoor "hotel room door" { found_in yourroom noun "door" adjectives "hotel", "room", "my" article "your" door_to outsidehotel } scenery ceilingfan "ceiling fan" { in yourroom noun "fan", "blades" adjective "ceiling", "antique", "wooden" long_desc "Hanging about a foot below the ceiling, wooden blades. An antique, really." before { object { if verbroutine = &DoLook return false else "You can't reach the ceiling fan from here." } } } scenery yourbed "bed" { in yourroom nouns "bed" adjectives "neatly", "made" article "a" long_desc "There's nothing too remarkable about the bed. It's comfortable enough, from what you remember." before { object DoLookUnder { "The distressing thing is not that you don't find anything. The distressing thing is that you're looking under the bed for some kind of direction in the first place." } object DoEnter { "Really, it would be a shame to wrinkle such a neatly made bed. And besides, you have better things to do. Or at least you should." } } is platform, enterable capacity 50 } scenery dresser "night table" { in yourroom nouns "table", "dresser", "stand", "nightstand", "nighttable", \ "night-table" adjective "night", "old", "wooden" article "a" long_desc { "The night table is off to the left of the door, set along the wall. "; if child(self) Perform(&DoLookIn, self) else "There's nothing on it." } is platform capacity 50 list_contents return true ! "hide" the keys initially before { object DoLook, DoLookIn { ! Disable list_contents preempting self.list_contents = 0 return false } xobject DoGet, DoPutIn { self.list_contents = 0 return false } xobject DoGet { self is not quiet return false } } } object envelope "envelope" { in yourroom noun "envelope" adjectives "small", "white" article "an" initial_desc "The desk clerk must've slipped an envelope under the door sometime early this morning." long_desc "It's addressed to you in handwriting. Plain white envelope, no return address, no postmark." analysis "They didn't find anything unusual about it. No identifiable fingerprints or anything."; before { object DoOpen { if self is not moved { "(taking the envelope first)" if not Acquire(player, self) return true } return false } } after { object DoGet { if self is not special { "You scoop the envelope up off the floor." self is special } else return false } } is container, openable, readable } object note "small note" { in envelope noun "note", "paper", "letter" adjective "small", "little", "piece" article "a" long_desc { "Handwritten, again, but this time on Rocket Pictures stationery.\n\n\ \"8:30 at the studio.\n\n \_ --MW\"" if self is not special { "\n(which of course stands for Milt Walker)" PrintFootnote(1) } } graphic IMAGES1, "note" analysis "They didn't find anything unusual about it. No identifiable fingerprints or anything."; size 2 is readable } object studiopass "studio pass" { in envelope noun "pass", "permit" adjectives "studio", "drive-on", "drive", "on" article "a" long_desc "It's a drive-on parking pass for the Rocket Pictures Studios lot dated today." size 3 is readable } !--------------------------- ! OUTSIDE THE PELICAN HOTEL !--------------------------- room outsidehotel "Pelican Hotel" { noun "hotel" adjective "my", "pelican" article "the" is driving_location long_desc "The exterior of the Pelican has been painted so many times that its peeling shell is probably suitable protection against radioactive fallout. Warm Los Angeles sunlight glows through the hazy blue-gray of the summer sky. The rather quiet street outside the hotel runs south toward Sunset Blvd." extra_scenery "exterior", "paint", "shell", "sky", "sunset", "street" arrive_desc "You drive back to the Pelican and park on the street outside." driving_coordinates 10, 10 ! right in the middle in_to yourroom u_to yourroom door_to yourroom s_to "Okay. First rule: this is L.A.--you're not going to get very far without a car." graphic IMAGES1, "exthotel" is known } !---------------------------------------------------------------------------- ! ROCKET PICTURES STUDIO: !---------------------------------------------------------------------------- !------------- ! STUDIO GATE !------------- global no_studio_pass room studiogate "studio gate" { nouns "studio", "gate", "pictures", "studios", "lot" adjective "studio", "rocket", "pictures" article "the" long_desc { "Welcome to Rocket Pictures Studios. It's everything a Hollywood studio should be: it has a bold, impressive gate; the grounds of the lot extending to the north are lined with rows of pale hangar-like soundstage buildings and ceramic-roofed bungalows; there's a staggering abundance of motorhomes; it has its own watertower; and it's not actually in Hollywood at all." if self is not special { Indent "(This last is demonstrated by the fact that there are one- and two-story shopping plazas and office buildings stretching as far as the eye can see instead of souvenir shops and T-shirt stands.)" PrintFootnote(8) self is special } } extra_scenery "grounds", "soundstage", "soundstages", "building", \ "buildings", "bungalows", "motorhomes", "watertower" is driving_location arrive_desc { "You drive midtown to the main gate of Rocket Pictures Studios"; if FindObject(studiopass, volvo) { " and park in Visitor Parking." no_studio_pass = false } else { ", except you don't have a pass to get on the lot." no_studio_pass = true } if soundtrack_stage = 0 and audio.current_music ~= "michelle" PlayMusic(MUSIC1, "michelle", true) } driving_coordinates 5, 5 n_to { if no_studio_pass = false or FindObject(studiopass, player) return backlot else "Except that you don't have a pass to get on the lot. A security guard points this out to you, then sends you away." } is known graphic IMAGES1, "maingate" } character securityguard "studio security guard" { nouns "guard" adjective "studio", "security" article "a" is known } !---------------- ! STUDIO BACKLOT !---------------- room backlot "studio backlot" { n_to mainbuilding s_to studiogate w_to sidebuilding long_desc "It wouldn't be the hardest thing in the world to get lost back here among the soundstages, each of them nearly identical to the next except for the identifying number stenciled on it in faded white paint. If you keep going straight to the north, eventually you'll get to the main building. Or you could turn around and head back to the parking lot. More buildings of an administrative flavor are over to the west." graphic IMAGES1, "backlot" } !--------------- ! MAIN BUILDING !--------------- room mainbuilding "main building" { nouns "building", "offices" adjective "main", "executive", "office" article "the" long_desc "You're just in front of the main administrative building. \ Somewhere behind these walls are the executive offices of Rocket Pictures: a motley assemblage of manic creative near-genius, mediocre posturing, epidemic insecurity, monumental bravado, white-knuckle risk-taking, milquetoast acquiescence, stark paranoia, and great leather furniture." s_to backlot n_to "It's by trying to get into the main building that you learn\ --if you didn't know already--that trying to get into an office on a studio lot is like a maximum security jailbreak in reverse. The Pentagon would be easier to get into. \ Especially looking like a potential wannabe filmmaker, starved of sleep and cash the way you are. Milt Walker's assistant has never heard of you, and the friendly yet stern gentleman behind the security desk suggests you get yourself on an appointment list." in_to return self.n_to before { object DoEnter { Perform(&DoGo, n_obj) } } is enterable graphic IMAGES1, "mainbldg" } object policereport "police report" { noun "report", "file" adjective "lapd", "police", "homicide", "murder" article "a" graphic IMAGES1, "report" long_desc "The report is titled \"LAPD HOMICIDE REPORT\". It describes how on May 23, Cindy Painter, a twenty-four year-old actress, was found strangled in her apartment on National Boulevard. \ Forensics suggest that she opened the door to have the intruder burst in on her. The body was found in the bedroom; there were no signs of assault other than strangulation." before { object DoAnalyze { "Um. Chances are you're not going to want to be advertising to the police that you've gotten your mitts on that report." } } is readable } #include "milt.hug" ! Milt Walker's character !--------------- ! SIDE BUILDING !--------------- room sidebuilding "side building" { nouns "building" adjective "side" article "the" long_desc "The people who work in this building are the people who all hope that one day they'll end up working in the other building. Not that this building is bad--not that it's a fire hazard or anything like that--although the budget allocated for repairs to the roof probably went into new oak paneling inside the main building. And maybe this place someone like you could at least get into. Probably just by leaving the shade of this tree and climbing up the set of three stairs that leads to the door." extra_scenery "parking", "lot" n_to reception in_to reception u_to reception e_to backlot door_to reception is enterable graphic IMAGES1, "sidebldg" } scenery tree "big green tree" { found_in sidebuilding, behindtree noun "tree" adjective "big", "green" article "a" long_desc "The big green tree shades some of the cars in the parking lot just outside the entrance to the side building." hide_preposition "behind" before { object DoClimb { "You clutch onto an overhead branch and try to get some footing against the bark of the tree, to no avail. Apparently your tree-climbing skills aren't what they used to be." } } after { object DoHide { if location = behindtree "You're already hiding behind the tree!" else { "You slip out of sight around the far side of the big, green tree." MovePlayer(behindtree) } } } } scenery cars "cars" { in sidebuilding nouns "cars", "car", "vehicles", "automobiles", "bmws", "toyotas" article "some" long_desc "The parking lot is filled with fairly newish cars, from Toyotas to high-end BMWs." before { object { if verbroutine = &DoLook return false else "Come on now, start messing with the cars and it's just going to lead to grand theft auto. Or at least a rap on the noggin by one of the owners." } } } scenery studiostairs "stairs" { in sidebuilding nouns "stair", "stairs", "stairwell", "stairway", "entrance" adjectives "set", "three" article "some" long_desc "Garden-variety stairs. Sturdy enough to step on, which is about all you need them for." before { object DoClimb { Perform(&DoGo, in_obj) } } } !----------------- ! BEHIND THE TREE !----------------- room behindtree "behind the tree" { long_desc "You're crouching in the shadows of the big, green tree with a fairly clear view of the side building and parking lot." out_to { "You step out from behind the tree." return sidebuilding } u_to Perform(&DoClimb, tree) cant_go "If you want to get out from behind the tree, just say so." } !---------------- ! RECEPTION AREA !---------------- room reception "reception area" { long_desc "You could plunk yourself down in one of the two comfy-\ looking high-backed chairs while waiting for someone. The minty-blue hospital tint to the walls could take some getting used to, though. A hallway of office doors extends to the west, or you can go back outside to the south." extra_scenery "desk", "nameplate" ! i.e., Anne's desk graphic IMAGES1, "reception" out_to sidebuilding s_to sidebuilding w_to "Now, seeing as you don't know your way around here, the best you can hope for is to wind up wandering the halls and maybe getting security called on you. Better to wait here if there's someone you need to see." each_turn { if random(8) = 1 { event_flag = true PlaySound(SOUNDS1, "phone") "\nThe phone rings. Anne answers it"; if random(2) = 1 " and takes down a message." else ", listens briefly, then transfers the call." } } } scenery offices "offices" { in reception nouns "offices", "doors", "door", "hallway" adjective "office", "non-descript" article "some" long_desc "The hallway disappears around the corner five or six non-descript doors down." before { object DoGo, DoEnter { Perform(&DoGo, w_obj) } } } scenery comfychair "comfy chair" { in reception nouns "chair", "chairs", "furniture" adjectives "comfy", "looking", "comfy-looking", "high", "backed", \ "high-backed", "one" article "a" long_desc "The subtle floral pattern manages not to clash with the minty-blue walls. And damn, they do look comfy." is enterable is platform after { object DoEnter {"You sit down on one of the comfy chairs."} object DoExit {"You stand up from the comfy chair."} } capacity 50 holding 0 } scenery mintywalls "minty-blue walls" { in reception nouns "walls", "wall" adjectives "minty", "blue", "minty-blue" article "the" long_desc "Yeah, well. They're the kind of thing nobody can remember ever saying \"Hey, that's a great idea\" to." before { object DoClimb {"If you stare at them long enough you will."} } is plural } compound "hugs", "and" ! "hugs and kisses" to "hugsandkisses" compound "hugsand", "kisses" object cindysmovie "Cindy's movie" ! for conversational reference { nouns "movie", "hugsandkisses", "picture", "flick" adjectives "cindy's", "cindy", "painter's", "motion", "hugs", \ "kisses" is known } object screeningreport "screening report" { noun "report", "results" adjectives "preview", "screening", "test", "hugsandkisses" article "a" long_desc "It's a report from a test screening of \"Hugs and Kisses\" starring Cindy Painter. Now, you may not be a seasoned studio executive, but you probably don't need to be to know that an overwhelming number of people at the screening checking the \"Very Disappointed\" box on their reaction cards and calling the movie \"awful\" and \"terrible\" in their written comments can't possibly be a good thing." analysis { if foldednote is not analyzed "Well, they managed to get some fingerprints off it, but they couldn't identify them."; else "The fingerprints from the screening report matched the ones from the folded note."; } is readable } object negatives "negatives" { noun "negatives" adjective "photo", "photograph" article "some" long_desc "You can tell with a quick glance and without looking too hard that these are the negatives for the pictures of Holly Golden and Billy Van Earl." analysis "They did a whole lot of holding them up to the light, but other than being able to tell it was a couple of people in flagrante delicto, there wasn't much else to find."; is plural size 5 } #include "stuart.hug" ! Stuart Fina's character !---------------------------------------------------------------------------- ! CINDY PAINTER'S APARTMENT: !---------------------------------------------------------------------------- !-------------------- ! NATIONAL BOULEVARD !-------------------- room nationalblvd "National Boulevard" { ! nouns "blvd", "boulevard" ! adjectives "national" nouns "blvd", "boulevard", "apartment", "building", "complex" adjectives "national", "cindy", "painter's", "cindy's", "apartment" parse_rank { if verbroutine = &DoDriveTo return 5 else return -1 } long_desc "The sidewalk leads south from the street to Cindy Painter's building, which is a three-story apartment complex. Maybe it's not Beverly Hills, but you know, it's not bad. National extends to the east, and also to the west before curving away to the north." is driving_location arrive_desc { "You drive "; if location = santamonica "east"; else "south"; " to National Blvd. and pull over to the curb next to Cindy Painter's apartment building." if soundtrack_stage = 0 PlayMusic(MUSIC1, "mx-peace", true) } driving_coordinates 10, 20 e_to "Going east will just get you further away from your car and where you want to be." w_to "Going west will just take you past the back of the building to the south, away from your car and where you want to be." n_to "Sure, you \Icould\i go for a stroll now, but what would that accomplish?" sw_to { if alley is not known "Walking around toward the back of the building reveals a back alley." alley is known return alley } s_to apartmentbuilding in_to apartmentbuilding door_to apartmentbuilding is enterable, known graphic IMAGES1, "national" } scenery building_object "Cindy Painter's apartment building" { found_in nationalblvd, apartmentbuilding nouns "building", "complex" adjectives "cindy", "painter's", "cindy's", "apartment", "building" long_desc "It's an unpretentious three-story walk-up apartment complex, not all that different from the other buildings around and behind it." before { object DoEnter { if player in apartmentbuilding "Sure--except you're already there." else Perform(&DoGo, s_obj) } } is enterable } scenery alley_object "back alley" { in nationalblvd nouns "alley", "alleyway", "building" adjective "back", "behind", "around", "apartment", \ "cindy", "cindy's", "painter's" article "a" long_desc { "The back alley disappears behind the building." alley is known } door_to alley parse_rank -1 ! no confusion with "building", above is enterable } !------------ ! BACK ALLEY !------------ room alley "back alley" { long_desc "A narrow sliver of pavement between two buildings, one of them being Cindy Painter's. The kind of narrow sliver that would be hell trying to maneuver through for parking, not to mention the miracle that the guys driving the garbage truck to get that dumpster must have to perform." extra_scenery "pavement" e_to "There's a locked fence between you and the building." w_to Perform(&DoEnter, otherbuilding) ne_to nationalblvd out_to nationalblvd graphic IMAGES1, "alley" } scenery backofbuilding "back of Cindy Painter's apartment building" { in alley nouns "building", "complex" adjectives "cindy", "painter's", "cindy's", "back", "apartment" article "the" long_desc "From here you can see the back of the building." before { object DoEnter {Perform(&DoGo, e_obj)} } parse_rank { if location = alley return 1 else return 0 } is enterable } scenery otherbuilding "other building" { in alley noun "building" adjective "other" long_desc "From here you can see the back of the other building." door_to "You can't enter the other building, especially from back here." is enterable } scenery fence "locked fence" { in alley nouns "fence", "wire" adjective "locked", "tall", "chain", "link", "chain-link", \ "nasty", "looking", "nasty-looking", "top" article "a" long_desc "The chain-link fence is at least eight-feet tall. Plus it has some nasty-looking wire at the top." before { object DoClimb { "That nasty-looking wire at the top of the fence is a powerful persuader against any climbing plans you might have. They don't put those babies up for decoration." } } key_object 1 ! no "real" key is locked, lockable } component fencelock "lock" { part_of fence noun "lock" long_desc "As solid a lock as they come. Good for anyone wanting to keep people out; bad for anyone wanting to get in." before { object DoGet, DoOpen {"That lock isn't going anywhere. It's staying closed."} } key_object 1 ! i.e., a phantom (non-existent) key is lockable, locked, openable, not open } scenery dumpster "dumpster" { in alley nouns "dumpster", "bin", "lid" adjectives "garbage", "trash", "dented", "beaten", "up", \ "beaten-up", "lid", "sundry", "traces", "bits" article "a" long_desc { "Dented and beaten-up and "; if self is open "half-full of trash."; else "closed at the moment."; " Scattered on the ground around the dumpster are sundry bits and traces of garbage." } contains_desc "The dumpster contains, well, a lot of garbage, including"; list_contents { ! Skip contents-listing if not looking specifically inside if verbroutine ~= &DoLookIn return 1 else return 0 } before { object DoEnter { "God help us. Considering that you can check out what's in the dumpster by standing beside it, peeking in, and maybe at worst poking around a little, wanting to climb inside is the sign of real problem on your part." } object DoSearch { Perform(&DoLookIn, self) } } after { object DoClose {"You let the lid fall with a noisy clang."} object DoOpen {"With a bit of effort you manage to force the lid of the dumpster open."} } capacity 500 holding 0 is enterable, container, openable, not open } scenery garbage "garbage" { in dumpster nouns "garbage", "trash", "refuse", "crap" adjective "domestic", "assorted" article "some" long_desc "What doesn't qualify as actual domestic garbage is just assorted crap that people have thrown out." } ! An array of garbage bags and their contents: #include "garbage.hug" ! The only important evidence is in dull_orange_garbagebag: plural_class cards "cards" { noun "cards" single_noun "card" plural_of birthdaycard, torncard } object birthdaycard "birthday card" { in dull_orange_garbagebag noun "card" adjectives "birthday" article "a" plural_is cards is readable long_desc { "A birthday card with bright cartoon balloons drawn all over the front. Inside:\n\n \_ \"Cindy Baby,\n\n \_ Happy birthday, baby! You're a real inspiration for me and my music and the whole band. Me and Funkzilla wouldn't be the same without you.\n\n \_ Billy xoxo\"" funkzilla is known billy is known } analysis { if cassettetape is not analyzed "They couldn't really tell me anything. "; "One woman did say that if this was the best \"Billy\" could do, then \"Cindy Baby\" should dump him but quick."; if cassettetape is analyzed " Oh, and apparently it's the same handwriting as on the cassette tape."; } } object torncard "torn business card" { in dull_orange_garbagebag noun "card" adjectives "torn", "business", "tattered" article "a" plural_is cards size 2 long_desc { "More like the tattered corner of what used to be a business card. The only word you can really make out is \"...Bixby\"." chuck is known } analysis "They seemed kinda hassled by me bringing in the corner of a business card to have them analyze. They said their in-depth analysis showed it was the corner of a business card."; is readable } !------------------------------------ ! CINDY PAINTER'S APARTMENT BUILDING !------------------------------------ room apartmentbuilding "Cindy Painter's apartment building" { long_desc "The sidewalk leads south from the street and under the thick greenery hanging lazily from a concrete overhang to the base of the stairs leading up." n_to nationalblvd u_to stairs s_to stairs graphic IMAGES1, "aptwalk" } scenery thickgreenery "thick greenery" { in apartmentbuilding nouns "greenery", "plants", "foliage", "fauna", "shrubs", \ "trees", "plant", "vines", "vine" adjectives "thick", "green", "hanging", "basic" article "some" long_desc "Your basic plants or hanging vines or whatever." } scenery apartmentstairs "apartment stairs" { found_in apartmentbuilding, stairs nouns "stairs", "steps", "stair", "step" adjectives "apartment", "sheltered" long_desc "The sheltered apartment stairs lead up to the door of Cindy Painter's apartment, and back down to the ground." before { object DoClimb, DoGo { if location = stairs Perform(&DoGo, d_obj) else Perform(&DoGo, u_obj) } } } !------------------ ! APARTMENT STAIRS !------------------ room stairs "apartment stairs" ! 'special' once apt. has been entered once { long_desc "You stand on the cool cement steps outside Cindy Painter's apartment. At least you assume it's hers on account of all the yellow \"POLICE LINE--DO NOT CROSS\" tape crisscrossing the door, which is closed. The doors to the other apartments are closed, too. You can go back down to the ground from here." extra_scenery "railing", "rail", "stairs", "steps", "stair", "step" d_to apartmentbuilding n_to return self.in_to u_to return self.in_to w_to Perform(&DoEnter, otherdoor) in_to { if cindyskey not in player "Would help, of course, if you actually had a key to get into the place." else { "You unlock the door and go in, ducking under the tape and closing the door quietly behind you." if self is not special { "\n(Now keep in mind that this is a crime scene, and you may want to be fairly judicious about what you disturb--or at least leave disturbed.)" self is special } return cindysapartment } } after { location MovePlayer { ! Let's also quickly do an audit to see if the player ! should get busted for messing with the crime scene: if old_location = cindysapartment and CrimeSceneAltered { ! The police will round up the player in ! ten minutes: Activate(bust_player, 10) } return false } } graphic IMAGES1, "aptstair" } ! In conjunction with CrimeSceneAltered, this gets the player arrested ! if the apartment is left in a state of disarray: fuse bust_player {} event in bust_player { if not self.tick { local obj obj = CrimeSceneAltered "\nShortly, however, you find the police appearing on your elbow, wanting you to come to the station to talk about Cindy Painter. Seems someone saw somebody--you--sneaking around her apartment (and "; if obj is open or obj is switchedon { print "leaving "; The(obj); if obj is open " open"; else " turned on"; } elseif obj is static print "messing with "; The(obj); elseif parent(parent(obj)) { print "leaving "; The(obj); if parent(obj) is container print " on "; else print " in "; print The(parent(obj)); } else The(obj) " gave you away)." MovePlayer(policestation) "\nYou're immediately hidden away in a back room for an \"interview\" (which consists of them asking you repeatedly what you had to do with Cindy Painter's murder, and if you didn't have anything to do with it, then what you know about whoever had something to do with it). You try starting several times to explain about Milt Walker, but it doesn't seem to sway them. Eventually this'll all get sorted out, of course. Just not right away. And not by you." endflag = 3 } } ! Not a real door built from the door class, since we never want this one ! to be open scenery cindysdoor "Cindy Painter's door" { found_in stairs, cindysapartment noun "door", "apartment" adjectives "cindy", "painter's", "cindy's", "apartment" parse_rank 2 ! prefer to otherdoor, cindyskey before { object DoKnock { "No one answers. And it's pretty uncool to be knocking on a police-sealed door, by the way." } object DoUnlock { "If you're going to go "; if player in stairs "in, go in."; else "out, go out."; " Don't just stand there messing with a police-\ sealed door that, by law, you shouldn't be messing with in the first place." } object DoLock { if player in cindysapartment "Probably don't want to lock yourself \Iin\i the apartment of a homicide victim." else "It's already locked." } object DoOpen, DoEnter, DoGo { if player in cindysapartment Perform(&DoGo, out_obj) else Perform(&DoGo, in_obj) } } is lockable, locked, openable, not open } object cindyskey "apartment key" { noun "key" adjective "cindy's", "cindy", "painter's", "apartment" article "Cindy Painter's" long_desc "An unremarkable apartment key, other than the fact that it'll get you into Cindy Painter's apartment." parse_rank 1 ! prefer to Volvo keys } scenery policetape "police tape" { part_of { if player in stairs return cindysdoor else return 0 } noun "tape", "ribbon" adjective "police", "yellow", "plastic" article "some" long_desc "Yellow plastic ribbon with the words: \"POLICE LINE--DO NOT CROSS\" stencilled on it." before { object DoGet, DoMove { "Best not to mess with the police tape. They don't call it \"police tape\" so you'll go messing with it." } } is readable } scenery otherdoor "other door" { in stairs nouns "door", "doors", "others", "apartment" adjectives "someone", "else's", "someone's", "other", "one", \ "apartment" article "the" before { object DoOpen, DoEnter, DoGo { "Seeing as none of the other doors belongs to you, you'll probably have a hard time doing that without getting arrested." } object DoKnock { "You do; there's no answer. That either means that nobody's home, or that whoever is supposed to be answering saw you skulking around and didn't like the looks of you." } } } !----------------------------- ! CINDY PAINTER'S LIVING ROOM !----------------------------- room cindysapartment "Cindy Painter's living room" { long_desc "Rather sparsely decorated: a fairly new sofa sitting in the middle of the hardwood floor commands your attention. There's a television in the corner. The sole bedroom is to the north. East takes you into the kitchen, or you can go back out into the stairwell." s_to return self.out_to out_to { if cindyskey in player { "You go out, ducking under the police tape before closing and locking the door behind you again." return stairs } else "You'd better have the key in order to lock up again before you think about leaving." } e_to kitchen n_to "Not a good idea: everything in the bedroom has been covered with plastic--presumably to protect the crime scene from contamination--so you'd be best not to go tromping around all over it." after { location MovePlayer { if bust_player is active Deactivate(bust_player) return false } } graphic IMAGES1, "livingrm" } ! If the crime scene has been altered by the player in any noticeable ! way, CrimeSceneAltered returns the object that gave the player away ! ! Note: This routine requires a lot of attention, since it directly ! refers to things such as contents, numbers of objects, attributes, etc. ! If something is changed, such as a new object is added, this routine will ! need to be changed. routine CrimeSceneAltered { ! Living room: ! left something in living room if sibling(tv): return sibling(tv) ! left something on TV if child(tv): return child(tv) ! left something on sofa if child(sofa): return child(sofa) ! left TV turned on if tv is switchedon: return tv ! Kitchen: ! left something in kitchen if sibling(juicecarton): return sibling(juicecarton) ! left something on counter if child(kitchencounter): return child(kitchencounter) ! left something in sink if child(sink): return child(sink) ! left something on stove if child(stove): return child(stove) ! left fridge open if fridge is open: return fridge ! left something in fridge if child(fridge): return child(fridge) ! left cupboard open if cupboard is open: return cupboard ! swiped the garbage bags ! if garbagebags_box not in cupboard, nothing: return garbagebags_box ! put something else in the cupboard ! if sibling(garbagebags_box): return sibling(garbagebags_box) } scenery plasticsheeting "plastic" { in cindysapartment noun "plastic", "sheeting" adjectives "sheets", "clear", "see-through", "transparent", \ "plastic" article "some" long_desc "Sheets of clear plastic sheeting covering the floor and the bed--making it pretty much impossible to venture into the room at all." } scenery floorandbed "bedroom floor and bed" { in cindysapartment nouns "floor", "bed" adjective "bedroom" article "the" long_desc "The bedroom floor and the bed are covered with plastic." } scenery sofa "sofa" { in cindysapartment nouns "sofa", "couch", "furniture", "chesterfield", "ottoman" article "a" prep "on", "off" long_desc { "The sofa is cloth-covered, off-white, relatively new, low almost to the floor, and not the cheapest you could possibly find." } is enterable, platform reach sofa holding 0 capacity 50 before { object DoLookUnder { if cassettetape in nothing { move cassettetape to cindysapartment run cassettetape.initial_desc } else: return false } } after { object DoEnter { "You sit down on the sofa. "; if self is special "Damned comfortable." else print newline self is special } object DoExit {"You get up from sitting on the sofa."} } } object cassettetape "cassette tape" { noun "tape", "label" adjective "cassette" article "a" parse_rank 1 ! prefer to police tape is readable initial_desc "A cassette tape is half-sticking out from under the sofa, probably overlooked by the police." long_desc "Handwritten on the cassette label is \"New Songs - May 15\". If the the tape player in the Volvo worked, you'd even be able to give it a listen. The contact address on the tape is in Santa Monica." analysis { if birthdaycard is analyzed "The handwriting on the label is the same as that on the birthday card."; else "They can't really tell much about it--but one of the guys said if I knew where they were playing live to let him know."; } } ! Might as well put this here, since it's only useful with reference to ! the cassette tape: component tapeplayer "tape player" { part_of volvo nouns "player", "deck", "tapedeck" adjective "tape", "cassette" article "a" long_desc "The tape player doesn't look like it has worked in a long time." before { object DoSwitchOn { "The tape player is broken. Trying to switch it on doesn't do anything." } xobject DoPutIn { if object ~= cassettetape "Why, praytell, are you trying to put that in a tape player?" else "The tape player is broken. You can't even get the tape in." } } is container, open, switchable, not switchedon } scenery cindyswindow "window" { in cindysapartment nouns "window", "curtains", "drapes" adjectives "living", "room" article "a" long_desc "Sunlight shines through the window, giving the living room a bright, lazy glow. On the street outside you can see your cousin's car." door_to "You're really better off using the door." is openable, transparent before { object DoOpen, DoClose { "Probably better not to be displaying your mug right in front of the window. This is, if you'll remember, a murder scene." } } } scenery tv "television" { in cindysapartment nouns "tv", "television", "tube", "set" adjectives "tv" article "a" is platform, switchable, not switchedon holding 0 capacity 20 misc 1 ! channel (1-12) long_desc { "The fairly expensive television is sitting on the floor in the way in of a fairly expensive television just purchased by someone who has yet to buy a nice wall-unit for it. "; if self is switchedon { "\n\n(on television)" WhatsOnTV(true) } else "The TV is turned off." } before { object DoGet { "It's a little heavy to be strolling around with. Unless of course you plan to steal it and stow it in your cousin's Volvo--in which case we've been going at this all wrong, i.e., in a non-\ criminal sort of way." } } after { object DoSwitchOn { "You turn the television on. "; WhatsOnTV(true) } } } scenery tvchannel "channel" { part_of tv nouns "channel", "station" adjectives "television", "tv" article "a" long_desc WhatsOnTV(true) } routine WhatsOnTv(keep_same_channel) { local last_channel if tv is not switchedon { "The television isn't even on, for starters." return } ! keep_same_channel will not be set if called by, for example, ! a grammar line ! if not keep_same_channel { last_channel = tv.misc while tv.misc = last_channel tv.misc = random(12) "(You flip through the channels to find something new.)" } select tv.misc ! channels number 1-12 case 1 "The local L.A. news is on the current channel. There's a brief mention of Cindy Painter's death, with no details other than that police are investigating." case 2 "On TV is a show about personal finance. Some guy is giving tax advice: none of which, you note sadly, you followed." case 3 "This channel is the Monster Truck Network. Currently playing: \"The Best of Classic Monster Trucks 1987\". \ Better get comfy, obviously." case 4 "You watch a few seconds of Bob Cracker's Prayer Power Hour and briefly consider calling in to ask for a kind word or two for this case." case 5 "An Elvis movie! The one, uh, the one where he's at the beach." case 6 { "On now is one of those manic children's shows that scare the hell out of grown-ups with their constant chatter, ear-torturing songs, and frightening, lunatic, googly-eyed puppets." PrintFootnote(11) } case 7 "It's the Canadian Parliament channel. No one seems to be doing much, and you wonder (once again) if the time is right for an invasion." case 8 { "\"The Strongest Man In The World Competition\" is on. You watch, half-aghast and half-fascinated, for about a minute before snapping out of it." PrintFootnote(12) } case 9 "You wouldn't have believed there was a All-Mime Network, but here it is. The 500-channel universe is a scary place." case 10 "You're not quite sure what this show is supposed to be, but it seems to consist of a mustached man drinking schnapps and swearing at the audience in Serbian or Croatian or something as he tries to make it through the half-hour." case 11 { "Today on The Interactive Fiction Channel: watch two upstart challengers take on two rec.games.int-fiction regulars in a Colossal Cave speed-match." PrintFootnote(14) } case else "There's nothing decent on. Your distinct lack of surprise at that is not, well, surprising." return true ! since this is a verb routine } !--------- ! KITCHEN !--------- room kitchen "kitchen" { long_desc "Refrigerator, stove, sink, kitchen window. An empty carton of grapefruit juice sitting on the counter. The living room is back out to the west." out_to cindysapartment w_to cindysapartment graphic IMAGES1, "kitchen" } scenery kitchenwindow "kitchen window" { in kitchen noun "window" adjective "kitchen" article "a" is transparent long_desc { "Through the window you can see behind the building, where a narrow alley plays host to a garbage dumpster." dumpster is known } door_to "You'll really have better luck using the door." } distant_class distant_dumpster "dumpster" { in kitchen nouns "dumpster", "bin", "lid" adjectives "garbage", "trash", "dented", "beaten", "up", \ "beaten-up", "lid", "sundry", "traces", "bits" article "a" long_desc "The dumpster sits in the back alley behind the building." real_object dumpster is openable, open } scenery stove "stove" { in kitchen nouns "stove", "oven" article "a" is platform, openable ! openable platform?--not really; ! see before/DoOpen holding 0 capacity 50 long_desc "Done in the same style and color as the refrigerator: part of a matching set." before { object DoOpen { "You're either hungry or you've suddenly been struck by the urge to cook. Neither is really what you should be thinking about right now." } } } scenery fridge "refrigerator" { in kitchen nouns "refrigerator", "fridge" article "a" is openable, not open, container holding 0 capacity 50 long_desc { "Done in the same style and color as the stove: part of a matching set. "; if self is open "The fridge is open." else "The fridge is closed." } before { object DoLookIn { if children(self) = 0 "The refrigerator is curiously empty of anything edible." else return false } } } scenery kitchencounter "kitchen counter" { in kitchen nouns "counter", "tiles", "tile" adjectives "kitchen" article "a" is platform holding 0 capacity 100 long_desc "The counter face is made up of smooth, clean tiles. \ Sitting on the counter is a carton of grapefruit juice." before { object DoLookUnder { "There's a cupboard under the counter. That's about it." } } } scenery sink "kitchen sink" { in kitchen noun "sink", "tap", "faucet" adjectives "kitchen", "stainless", "steel", "stainless-steel", \ "single" article "the" prep "in" ! as opposed to "inside" is container holding 0 capacity 50 long_desc "It's pretty much your average stainless-steel kitchen sink and faucet combo. Entirely appropriate for washing dishes or rinsing vegetables or anything like that. The boring tangle of plumbing is likely concealed in the cupboard beneath the sink." before { object DoLookUnder { "There's a cupboard beneath the sink." } } } scenery cupboard "cupboard" { in kitchen noun "cupboard", "cupboards", "cabinet", "cabinets", "doors", "door" article "a" is container, openable, not open holding 0 capacity 50 long_desc { "The cupboard has two doors that open away from each other"; if self is open " (like they are now)." else ". They're currently shut, however." } } object plumbing "plumbing for the kitchen sink" { in cupboard noun "plumbing", "pipes", "pipe" adjective "copper", "space", "behind", "around" article "the" initial_desc { "You can see the kitchen sink's plumbing in the "; if verbroutine = &DoLookAround "open "; "cupboard." } long_desc "Copper pipes for the sink and faucet, presumably nothing more." before { object DoLookUnder, DoSearch, DoLookIn { if garbagebags_box in nothing { move garbagebags_box to cupboard "You find a box of garbage bags tucked away behind the pipes." } else return false } } is static, container } object cleaningsupplies "cleaning supplies" { in cupboard nouns "supplies", "rags", "rag", "cleanser", "cleansers", "disinfectant", \ "disinfectants" adjective "cleaning" article "some" initial_desc return self.long_desc long_desc "Various cleaning supplies--rags, cleansers, disinfectants, etc.--\ are tucked away in the cupboard in the space around and behind the plumbing." before { object DoGet {"Not unless you're intent on doing some cleaning."} object DoSearch, DoLookUnder {return Perform(&DoSearch, plumbing)} } is static, plural } object garbagebags_box "box of garbage bags" { nouns "bags", "box" adjectives "dull", "orange", "box", "garbage", "plastic", "stretchy" article "a" initial_desc "Nestled behind the pipes is a box of garbage bags." long_desc "The garbage bags are stretchy plastic and dull orange in color." } component single_garbagebag "garbage bag" { part_of garbagebags_box noun "bag", "sack" adjectives "dull", "orange", "empty", "garbage", "trash", \ "plastic", "stretchy" long_desc return garbagebags_box.long_desc before { object DoGet { "Probably not necessary unless you have some garbage you absolutely have to throw out right now." } } } ! Why is this here? Because it's in the picture, of course... scenery juicecarton "carton of grapefruit juice" { in kitchen nouns "juice", "drink", "beverage" adjectives "empty", "carton", "grapefruit", "fruit", "juice", \ "happy", "brand" article "a" long_desc "It's \"Happy Grapefruit\" brand grapefruit juice." before { object DoGet { "It's empty, not to mention the fact that it may be forensic evidence or something. Meaning there's no big win for you in packratting off with it." } } }