!\--------------------------------------------------------------------------- GB2.HUG Part Two of Guilty Bastards by Kent Tessman (c) 1998 Santa Monica Malibu Wilshire Blvd. - fire alarm ---------------------------------------------------------------------------\! #set PART2 #ifset MODULE #if undefined InitModule routine InitModule { billy.lying_about_cindy = false move cindyskey to you location = beachhouse move volvo to beachhouse move volvokeys to you } #endif #endif routine InitPart2 { #ifset DEBUG combination[0] = 18 ! safe in Chuck Bixby's office combination[1] = 9 combination[2] = 47 #else ! This randomizes the combination: combination[0] = random(20) + 10 combination[1] = random(10) combination[2] = random(30) + 40 #endif } !---------------------------------------------------------------------------- ! SANTA MONICA !---------------------------------------------------------------------------- !--------------------------- ! SANTA MONICA (OCEAN AVE.) !--------------------------- room santamonica "Santa Monica" { nouns "monica", "beach" adjectives "santa" is driving_location long_desc "This is about as far west as you can get on the mainland United States and not be driving on the sand. Ocean \ Avenue extends north and south, lined with palm trees and brightly colored, Santa Monica-ish buildings. You can get a better view of the beach to the west." arrive_desc { "You drive to Santa Monica and park along Ocean Avenue." if funk_music is not special and ! i.e., not stopped soundtrack_stage = 0 { self.misc = audio.current_music PlayMusic(MUSIC1, "barbare3", true) } } driving_coordinates 1, 1 w_to overlookingbeach n_to "You could go for a nice stroll up and down Ocean Ave., but it wouldn't really get you anywhere now, would it?" s_to return self.n_to misc "" ! for saving currently playing music before_driving { if funk_music is not special and soundtrack_stage = 0 PlayMusic(MUSIC1, self.misc, true) } graphic IMAGES1, "oceanav" is known } scenery beach_object "beach" { found_in santamonica, overlookingbeach noun "beach" article "the" parse_rank 1 long_desc { if location = santamonica "You can't really see the beach from here." else run overlookingbeach.long_desc } door_to { if location = santamonica return overlookingbeach else Perform(&DoGo, d_obj) } } !------------------- ! OVERLOOKING BEACH !------------------- room overlookingbeach "overlooking the beach" { long_desc "From here you can see the hazy mist hanging over the Pacific Ocean and the long curve of the coastline north past Malibu. A cement stairway descends to the beach from here, or you can go back east to where the Volvo is parked." extra_scenery "mist", "coastline", "malibu" e_to santamonica d_to { "You climb down the cement steps to the sandy beach below." return beach } after { location MovePlayer { if old_location = beach PlaySound(SOUND_STOP) } } graphic IMAGES1, "overbch" } scenery ocean "Pacific Ocean" { found_in overlookingbeach, beach, beachhouse nouns "ocean", "sea", "water" adjectives "pacific" article "the" parse_rank 1 ! for questions, etc. long_desc "The endless blue of the Pacific stretches as far as you can see, falling away over the horizon." before { object DoGo, DoEnter { "Probably not a good time for a swim. I mean, does it seem to \Iyou\i like a good time for a swim?" } } } scenery cementstairs "cement stairway" { found_in overlookingbeach, beach nouns "stairs", "stair", "stairway", "steps", "step" adjectives "concrete", "cement" long_desc "The cement stairway, while cracked and weatherbeaten, a fairly solid-looking structure connecting the beach to the street level above it." door_to { if location = beach return overlookingbeach else return beach } before { object DoClimb {Perform(&DoGo, self)} } } !------- ! BEACH !------- room beach "beach" { long_desc "You're facing south on a walking/running/rollerblading/\ whatever path that parallels the beach north-south along the ocean. Quite a few people are involved in beach-ish activities. You could follow the coastline further to the south, or go back up to the higher ground overlooking the beach." u_to overlookingbeach s_to beachhouse n_to "North is the way to Malibu, which is a drive more than a walk." w_to "West is the ocean. The ocean is wet and deep. Hence you're not going to get very far on foot going west." before { location DoSwim { if object = malibu "Well, I would wish you luck and go home, but seeing as you do have a crime to get to the bottom of, I should probably encourage you to save the Iron Man for another day." else Perform(&DoGo, ocean) } } after { location MovePlayer { PlaySound(SOUNDS1, "surf", true) } } graphic IMAGES1, "beach" } scenery activepeople "people" { in beach nouns "people", "runner", "runners", "rollerblader", "rollerbladers" article "some" long_desc "Just people: Some running, some walking, others rollerblading. Surprisingly few skulking around like you, though." before { object { if verbroutine ~= &DoLook "Oh, let's leave the people alone for now." else return false } } is plural, living } scenery lamppost "lamp post" { found_in beach, beachhouse noun "post", "lamppost", "light" adjective "lamp" article "a" long_desc "A row of identical lamp posts lines the north-south path along the beach." before { object DoClimb { "Unfortunately there's nothing on the post to get a handhold or foothold on, not to mention that it's particularly smooth and probably well-night impossible to climb." } } } !------------------------ ! BILLY VAN EARL'S HOUSE !------------------------ room beachhouse "Billy Van Earl's house" { nouns "house", "balcony" adjectives "billy's", "billy", "van", "earl's" parse_rank { if location = self return 1 else return 0 } long_desc { "The house is archetypically tall and thin--the norm for houses along this row on the Santa Monica beach. A balcony looks out from the second story"; if funk_music is not special "--you can hear music from above"; ". There's a doorbell here at path level." } graphic IMAGES1, "bchhouse" n_to beach s_to "Keep wandering aimlessly along the beach, and you'll become one of those people who wanders aimlessly along the beach." u_to return self.in_to in_to { if billy in location "Billy's not exactly inviting you in, you see." else "No one's here to let you in." } before { location DoListen { if not object Perform(&DoListen, funk_music) else return false } object DoGo, DoEnter { Perform(&DoGo, in_obj) } } after { location MovePlayer { if old_location = beach PlaySound(SOUND_STOP) } } is enterable } scenery doorbell "doorbell" { in beachhouse nouns "bell", "doorbell", "buzzer", "button" adjectives "door" article "a" long_desc "The doorbell looks a little weatherbeaten--it does face the ocean, after all--but other than that it looks ready to be pressed." before { object DoPush { "You push the doorbell and hear a muffled ring indoors." RingDoorbell } object DoKnock { "You knock on the door." RingDoorbell } } } scenery funk_music "music" ! 'special' if not playing { in beachhouse noun "music", "sound", "sounds", "tune", "beat", "song", "disc" adjective "funk", "el", "thump", "cd", "compact" article "the" before { object { if verbroutine ~= &DoListen "You can't do that with the music. \ Obviously." elseif self is not special "Sounds like a little bit of funk, it does." else "Billy must've turned the music off." } } } #include "billy.hug" ! Billy Van Earl's character !---------------------------------------------------------------------------- ! MALIBU !---------------------------------------------------------------------------- !------------------- ! HILLS OVER MALIBU !------------------- room malibu "Malibu" { noun "malibu" adjective "hills", "over", "hill" article "the" long_desc "Climbing up into the hills here over Malibu is a reminder that Los Angeles is built on a desert. With no irrigation or water sprinklers, the grass is dry and the yellowy-brown of straw. The road itself weaves in and around the hills--\ although you can go on foot north from here to one of the reclusive residential areas. Far below you to the west is the Pacific Ocean." extra_scenery "grass", "road" graphic IMAGES1, "malibu" is driving_location arrive_desc { "After driving north of Los Angeles, you turn off the Pacific Coast Highway, climb for a minute or two, then pull off to the side of the road and park." if soundtrack_stage = 0 PlayMusic(MUSIC1, "mx-faith", true) PlaySound(SOUNDS1, "surf", true) } before_driving PlaySound(SOUND_STOP) driving_coordinates 1, 10 n_to belowhouse is known } ocean malibu_ocean "Pacific Ocean" { found_in malibu, belowhouse ! graphic IMAGES1, "ocean" } !---------------------------- ! BELOW HOLLY GOLDEN'S HOUSE !---------------------------- room belowhouse "below the house" { long_desc "You're down the hill from what must be Holly Golden's house, overlooking the Pacific Ocean behind you. Continuing north will take you in the direction of the driveway; you parked the Volvo just south of here." graphic IMAGES1, "blwhouse" s_to malibu n_to { PlaySound(SOUND_STOP) return driveway } u_to return self.n_to after { location DoGo { PlaySound(SOUNDS1, "surf", true) return false } } } scenery hollyshouse "Holly Golden's house" { found_in belowhouse, driveway, outsidehouse noun "house" adjectives "holly's", "holly", "golden's" parse_rank { if location = belowhouse, driveway, outsidehouse return 1 else return 0 } long_desc "It's the kind of place you wish you lived in. Hell, you'd be happy just knowing someone who lived in a place like it just so you could hang out." door_to { if location = belowhouse "Not unless you plan on playing Sherpa right up the side of that hill." elseif location = driveway Perform(&DoGo, in_obj) elseif holly in location "Holly doesn't look too eager to have a houseguest. \ Actually, she might be okay with a houseguest--it's just that she doesn't look to eager to have \Iyou\i as a houseguest." else "You don't live here. You'd have to break in. That, you shouldn't have to be reminded, is a Bad Thing." } is enterable } !---------- ! DRIVEWAY !---------- room driveway "driveway" { noun "driveway" article "a" long_desc { "You're standing at the top of the driveway that leads east "; if self is not special "(that is, away from the ocean) "; self is special "in toward the house itself. There's a small sign just to the right of the driveway." } extra_scenery "driveway" graphic IMAGES1, "driveway" d_to belowhouse s_to belowhouse e_to outsidehouse in_to outsidehouse } scenery sign "sign" { in driveway noun "sign" article "a" long_desc "\"Private Road - No Trespassing.\"" graphic IMAGES1, "sign" before { object DoGet { "The sign is pretty firmly planted. And besides, yanking it out isn't going to change the fact that there's no trespassing." } } is readable } !---------------------- ! HOLLY GOLDEN'S HOUSE !---------------------- ! This location is 'special' once Holly has already come down once room outsidehouse "Holly Golden's house" { long_desc "The bottom of the driveway is secluded and shaded by the thick greenery around it. The garage is attached to the house, which stretches out along the hillside to the south. An old, disused basketball hoop hangs over the garage. You can walk back out to the street to the west." extra_scenery "driveway" graphic IMAGES1, "garage" s_to "The hillside isn't passable up here--you'd have to actually be in the house to go south." n_to "The driveway actually extends up to the west." u_to driveway w_to driveway out_to driveway in_to Perform(&DoEnter, hollyshouse) before { location DoJump { if basketball in player "You jump, holding the basketball, doing your best Michael Jordan imitation." else return false } location DoYell { if holly in location { "Holly scowls at you. \"This is my home--\ can't you shut up?\"" } else { "Your shout echoes off the house and the surrounding hills." if holly_arriving is not active Activate(holly_arriving, 5) } } } after { location MovePlayer { ! If Holly has already wandered out once: if holly_arriving is special Activate(holly_arriving, 5) return false } } } scenery garage "garage" { in outsidehouse noun "garage", "door" adjective "garage" article "a" long_desc "Somewhere in there is, you're relatively sure, a Porsche or a Jaguar or a Ferrari or a Lambourghini--not that you'll ever see it." door_to "The garage is closed--you can't get in." key_object -1 ! non-existent key is openable, not open, lockable, locked } scenery driveway_greenery "greenery" { in outsidehouse noun "greenery", "bushes", "bush", "trees", "tree", "plants", \ "plant", "shrubs", "shrub", "shrubbery" article "some" long_desc { "Thick, professionally groomed shrubbery surrounds driveway, giving it a great deal of privacy."; if basketball in nothing { print " "; run basketball.initial_desc move basketball to location } else print newline } before { object DoLookIn { Perform(&DoLook, self) } } is container ! for "look in bushes" } object basketball "basketball" { nouns "ball", "basketball" adjective "basket" article "a" initial_desc "Nestled at the base of the bushes is a basketball." long_desc "The orange rubber is scuffed from participation in cement driveway basketball games." } scenery basket "basketball hoop" { in outsidehouse nouns "basket", "hoop", "net", "netting", "baskets", "hoops" adjective "basketball", "weatherbeaten" article "a" long_desc "The weatherbeaten hoop looks like it has had rain more than anything else fall through it in the last couple of years. The netting is tattered and hanging loosely." before { object DoShoot { if basketball in player Perform(&DoThrowAt, basketball, self) else "You have nothing to shoot baskets with (like, say, a basketball)." } object { if verbroutine ~= &DoLook "You can't reach the basketball hoop from the ground, even if you were to jump." else return false } xobject DoThrowAt { if object~=basketball { "You throw "; The(object) " at the basketball hoop, but "; if object.size<=10 "after a bounce off the rim, "; "you miss. Chances are you could find something better to throw at a basketball hoop, no?" move object to location return true } ! This is one of those gags that potentially far too much work went ! into: ! Disallow further basketball if either the Home or ! Away score exceeds 20 if self.misc #1 >= 20 or self.misc #2 >= 20 { "Get a grip on yourself! You're spending far too much time playing basketball here!" return true } ! If we get here, the basketball was thrown local r ! Figure out how good a shot it was r = random(100) if r < 10 "A fade-away jumper and--\Iit's in\i...! \ Like it was going home." elseif r < 30 "You set it up high, nothing fancy, and it drops in for two." elseif r < 40 "A good start, but in actual flight it looks a little too much like a rock and bounces off the rim." elseif r < 60 { "You miss the basket. Hell, you miss the backboard." move basketball to location } elseif r < 80 "You shoot and watch hopefully as the ball bounces tantalizingly off the rim three or four times before falling outside." else "You shoot, but you're a little wide and the basketball makes a rubbery \Ithump\i against the backboard before bouncing away from the basket." if r < 30: self.misc += 2 ! player (home) if r >= 60 and random(2) = 2 self.misc #2 += 2 ! visitor print_basketball_score = true ! And summon Holly to find out what all the racket's ! about: if holly not in location and holly_arriving is not active Activate(holly_arriving, 5) elseif holly in location { r = random(3) select r case 1 "\n\"What are you \Idoing\i?\" Holly asks." case 2 "\n\"Put that down,\" Holly demands." case 3 "\n\"Great. Why don't you play a little basketball?\" Holly asks." } } } misc 0, 0 ! home/visitor scores--see after/xobject/DoThrowAt } ! PrintBasketballScore is a fake statusline that is called by Main--again ! this is probably too much code for one little gag, but what the hell: global print_basketball_score ! true if faking statusline routine PrintBasketballScore { window display.statusline_height { color YELLOW, RED cls Font(PROP_OFF) print "Home: "; number basket.misc; \ to (display.screenwidth/2); \ "Away: "; number basket.misc #2; Font(DEFAULT_FONT) color TEXTCOLOR, BGCOLOR } print_basketball_score = false } #include "holly.hug" ! Holly Golden's character !---------------------------------------------------------------------------- ! WILSHIRE BLVD. !---------------------------------------------------------------------------- attribute banned_from_wilshire room wilshire "just off Wilshire Blvd." { nouns "blvd", "boulevard" adjective "wilshire" long_desc "This quiet, palm-tree-lined street runs south toward Wilshire Blvd. and the old office building at the corner." graphic IMAGES1, "palms" parse_rank ! Prefer to wilshirelobby, below, as a driving ! location { if verbroutine = &DoDriveTo return 1 else return 0 } is driving_location driving_coordinates 20, 10 arrive_desc "You drive east along Wilshire, away from Beverly Hills and toward downtown. You pull off onto a quiet side street and park." s_to { if alarm_fuse is active "The fire department is making everyone stay across the street from the building while the alarm is going off." elseif player is banned_from_wilshire "You barely make it to the door of the building before security meets you and steers you away. Apparently you're not welcome here after what you pulled." else return wilshirelobby } is known } room wilshirelobby "Wilshire Blvd. building lobby" { nouns "building", "lobby", "offices", "blvd", "boulevard" adjectives "old", "sunwashed", "stone", "office", "wilshire" long_desc "You're standing right in the entrance to an old sunwashed stone office building at the corner of Wilshire and, well, somewhere just west of La Brea. The lobby is about what you'd expect to find: office directory on one wall, small maintenance closet, fire alarm, ventilation grill. Actually, of some interest but little use is the out-of-commission movie theater here on the ground level. Other than that, you can go up and in to the offices." extra_scenery "entrance", "sign" ! sign from movietheater graphic IMAGES1, "wilshire" n_to wilshire u_to {return self.in_to} in_to { "You climb the stairs until you find the door to \"Chuck Bixby - Talent Agent\"." return chucksoffice } e_to "As much fun as it would be to tour eastward and maybe check out the La Brea Tar Pits and the rest of the Miracle Mile, you do have a job to do here." before { location DoGo { ! Stop any further *_to messages if the player is ! holding the tied string if ObjectisAttached(player, location, chucksoffice) return true else return false } } door_to chucksoffice } scenery movietheater "movie theater" { in wilshirelobby nouns "theater", "cinema", "theatre" adjectives "movie", "motion", "picture" article "a" long_desc "By the looks of it, the theater stopped showing first-run pictures a long time ago. Now, a sign promises \"classic\" pornography and New Age religion on alternating nights." before { object DoGo, DoEnter { "The theater doesn't show feature films anymore--\ didn't you read the sign? And if you're here for either of the other two, well, let's not and say we did." } } is enterable } scenery officedirectory "office directory" { in wilshirelobby nouns "directory", "listings", "names", "letters", "backing", "sign", \ "listing" adjective "office", "building", "plastic", "grooved" article "an" long_desc { "The directory is made up of those plastic letters stuck in a grooved backing mounted on the wall. \ It looks like the listings haven't been updated since the mid-1980s or so, and a few of the letters are missing so the names are a little bastardized:\n" Font(PROP_OFF) "\_ Dr. Emile Johns n - Br ast Enla gment\n \_ Greenhorn & Smi h - I migration Law ers\n" Font(DEFAULT_FONT) "(and the one you're looking for:)\n" Font(PROP_OFF) "\_ Ch ck Bixby - Talent Agent" Font(DEFAULT_FONT) PrintFootnote(20) } is readable } attribute already_pulled scenery firealarm "fire alarm" { in wilshirelobby noun "alarm", "handle" adjective "fire", "little", "red" article "a" long_desc { "A little red fire alarm mounted on the wall, with a handle to pull in case of fire." PrintFootnote(19) } found_in { if verbroutine=&DoListen and alarm_fuse is active and (location = wilshire, wilshirelobby, closet, chucksoffice) { return location } else return 0 } before { object DoListen { if alarm_fuse is active { "The fire alarm is ringing loudly." alarm_counter-- } else return false } object DoPull { if alarm_fuse is active "The fire alarm is already ringing." elseif self is already_pulled "You pull the fire alarm, but nothing happens. Maybe it hasn't been reset yet after the last time you pulled it." elseif lengthofstring.attached_to = firealarm Perform(&DoPull, lengthofstring) else { "You reach up, give the fire alarm a tug, and it starts ringing. Building security (actually just one old guy in a shabby navy blazer) arrives shortly and--after giving you a suspicious once-over--\ escorts you and everyone else across the street." MovePlayer(wilshire) Activate(alarm_fuse, ALARM_DURATION) } } } after { xobject DoAttachObject { if billy in location "Billy looks at you like you're nuts. \"What are you doing, man?\"\n" return false } } } global alarm_counter constant ALARM_DURATION 30 ! 30 minutes fuse alarm_fuse {} event in alarm_fuse { local t t = self.tick if t > ALARM_DURATION - 5 { if player in wilshirelobby { event_flag = true "\nAs the building empties out to the accompaniment of the ringing fire alarm, security ushers you out of the lobby along with everyone else." MovePlayer(wilshire) } elseif player in closet { event_flag = true "\nYou can here voices of people in the lobby as the building is emptied out." } } select t case ALARM_DURATION-1 { PlaySound(SOUNDS1, "alarm") firealarm is already_pulled move chuck to wilshire move fire_crowd to wilshire move firefighters to wilshire move firetrucks to wilshire if player in wilshire { event_flag = true "\nThe building empties out as the fire department arrives, sirens wailing, lights flashing." } } case 2 { PlaySound(SOUND_STOP) if player in wilshire, wilshirelobby, chucksoffice, closet { event_flag = true "\nThe fire alarm goes silent." } } case 0 { if player in wilshire, wilshirelobby { event_flag = true "\nThe fire department starts letting people back into the building. "; if player in wilshire "Chuck Bixby heads back to his office." else "Chuck Bixby passes you, heading back to his office." } move chuck to chucksoffice remove fire_crowd remove firefighters remove firetrucks if player in chucksoffice { if safe is not open { "\nChuck Bixby comes back into his office. He looks at you strangely. \"How did you beat me back in here?\"" if computer is special ! i.e., if crashed "\nChuck glances at his desk. \"Hey, my computer crashed.\"" } else { "\nChuck Bixby comes back into his office. \ Sees you. Sees the open safe. \"What the hell are you doing?\" he sputters, first shocked, then very, very angry. "; if sinatras in safe { "His eyes flicker for a second back toward the safe, which he quickly slams shut. Before you can do anything, he's lunging toward you, hollering at you, tackling you, and then you're being introduced to security and then the police." ArrestPlayer safe is not open safe is locked move photos to safe move sinatras to safe player is banned_from_wilshire } else { "Then he calms down. And suddenly he's less an outraged guy than a caught guy. "; chuck.lying_about_holly = false chuck.knows_about_photos = true Perform(&DoShow, photos, chuck) } } } } case else { if player in wilshire, wilshirelobby, chucksoffice, closet { ! So the alarm message only gets printed every ! third turn: if ++alarm_counter = 3 and t>2 { event_flag = true "\nThe fire alarm keeps ringing." PlaySound(SOUNDS1, "alarm") alarm_counter = 0 } } } } character fire_crowd "crowd" { nouns "crowd", "people" article "a" short_desc "A crowd of people--some from the building, some who have just stopped on the street--watches the spectacle of fire trucks and firefighters." long_desc run self.short_desc before { object { if verbroutine ~= &DoLook "The crowd is more interested in what they're watching than they are you." else return false } } } character firefighters "firefighters" { nouns "firefighters", "firefighter", "fighters", "fighter" adjectives "fire" article "some" long_desc "The firefighters are going about the business of securing the building to make sure there's no real fire." inherits scenery ! so it doesn't get listed before { object { if verbroutine ~= &DoLook "Let's not bother the firefighters while they're doing their work, shall we?" else return false } } is plural } scenery firetrucks "fire trucks" { nouns "trucks", "truck", "firetrucks", "firetruck" adjectives "fire" article "several" long_desc "The fire trucks are parked outside the building, their lights flashing." before { object DoEnter {"Well, that's really not going to win you any points with anybody, is it?"} } is plural, enterable } !-------------------- ! MAINTENANCE CLOSET !-------------------- ! The puzzle in the maintenance closet is getting the string from the mophead, ! threading the string through the grill, then tying the end of the string to ! the fire alarm in order to hide in the closet and pull the alarm, thereby ! avoiding getting kicked out of the building. scenery closetentrance "maintenance closet" { in wilshirelobby nouns "closet", "room" adjectives "maintenance", "service" article "a" long_desc "The maintenance closet is just a tiny little, dark room off to one side of the lobby beside the building directory." door_to closet is enterable } door closetdoor "maintenance closet door" { between wilshirelobby, closet noun "door" adjectives "maintenance", "closet" article "a" before { ! Just because it's open in the picture: object DoOpen, DoClose {"The maintenance closet door seems to be jammed open."} } is openable, open } room closet "maintenance closet" { long_desc "This is a dingy little room without a whole hell of a lot to offer the world except a mop, a bucket, and a door leading out. There's a ventilation grill set low along the outside wall." graphic IMAGES1, "closet" out_to wilshirelobby } scenery mopandbucket "mop and bucket" { in closet nouns "mop", "bucket", "mophead", "pail" adjectives "dirty", "rusty", "old" article "a" long_desc { "It's just a dirty old mop plopped in a rusty old bucket."; if lengthofstring in nothing { lengthofstring is not hidden print " "; run lengthofstring.initial_desc move lengthofstring to location } else print newline } before { object DoGet { "Not unless you're planning to do some janitorial good with it." } object DoLookIn { Perform(&DoLook, self) } xobject DoPutIn { "Not much sense in putting anything in the mop and bucket." } } is plural, container } ! Three objects to manage the string: lengthofstring and string1/string2 ! for when the string is threaded through the grill: attachable lengthofstring "grimy length of string" { noun "string" ! adjectives "head" and "end" are for "head/end of string" adjectives "grimy", "length", "strand", "piece", "head", "end" article "a" attachable_to firealarm attached_to 0, 0 attach_verbs "tie", "attach", "loop", "hook" detach_verbs "untie", "detach", "unloop", "unhook" long_desc { if self.attached_to "The grimy length of string is most notably tied to the fire alarm." else "There's nothing particularly notable about the grimy length of string." } before { object DoPull { if self.attached_to = firealarm { if alarm_fuse is active "The fire alarm is already ringing." elseif firealarm is already_pulled Perform(&DoPull, firealarm) else { if billy in location print BillyBolts "You give the string a yank, and the fire alarm goes off." PlaySound(SOUNDS1, "alarm") if self in player { "\nThe building security officer (actually just an old guy in an ill-fitting blazer) shows up, takes one look at you--holding one end of the string, the other end of which is tied to the fire alarm--and says, \"Oh, you gotta be kidding...\" Then he calls the cops." remove self ArrestPlayer player is banned_from_wilshire } else { "\nThe building security officer--actually just an old guy in an ill-fitting blazer--shows up and gives you a suspicious once-over before ushering you and everyone else out of the building." remove self MovePlayer(wilshire) Activate(alarm_fuse, ALARM_DURATION) } } } else return false } } initial_desc "A grimy length of string is half-entwined in the dirty mophead." } object stringtail "tail of the string" { noun "string" adjective "tail", "end", "grimy" article "the" short_desc run self.long_desc long_desc "The tail of the string is threaded through the ventilation grill in the wall." before { object DoGet { if stringhead.attached_to "If you'll remember, you've got the other end of the string tied to the fire alarm. You're not going to get it back unless you either untie it or give it a really good pull." else { remove stringhead remove stringtail if not Acquire(player, lengthofstring) move lengthofstring to location "You pull the string back out through the grill." } } object DoPull { if not stringhead.attached_to Perform(&DoGet, self) else { if billy in location print BillyBolts ! Start some appropriate music: PlayMusic(MUSIC1, "eleventh", true) ! Stop allowing each scene to start setting ! the music, since things are getting cooking: soundtrack_stage = 1 "You give the tail of the string a solid yank. You feel it give as it pulls the fire alarm. The string pulls free of the ventilation grill as the alarm starts to ring." Activate(alarm_fuse, ALARM_DURATION) remove stringhead remove stringtail stringhead.attached_to = nothing if not Acquire(player, lengthofstring) move lengthofstring to location } } } } attachable stringhead "head of the string" { noun "string" adjective "head", "end", "grimy" article "the" attached_to 0 attachable_to firealarm attach_verbs "tie", "attach", "loop", "hook" detach_verbs "untie", "detach", "unloop", "unhook" attached_desc "loosely tied to" short_desc run self.long_desc long_desc { CThe(self) if self.attached_to ", which is loosely tied to the fire alarm,"; " is threaded through the ventilation grill." } before { object DoGet, DoPull { "The string doesn't seem to want to come any further through the grill than you've already threaded it." } } after { object DoAttachObject { "There's not a lot of slack, but you manage to loosely tie the head of the string to the fire alarm." } } } scenery grill "ventilation grill" { found_in closet, wilshirelobby nouns "grill", "grille", "screen", "grate", "grating", "shutters", \ "vent" adjective "ventilation", "metal" article "a" long_desc "Angled rows of metal shutters form a grating that you can't see through, but through which you can definitely feel a draft." before { xobject DoPutIn { Perform(&DoThread, object, self) } } } routine DoThread { if xobject ~= grill { "Not quite sure what you're hoping for." return false } elseif object = stringhead, stringtail { "The string is already threaded through the grill." return false } elseif object ~= lengthofstring { "Even if you could work "; The(object) " through the ventilation grill, I'm not sure what good it'd do you." return false } elseif location ~= closet { "It doesn't seem to want to go through from this side." return false } else { "With a little difficulty, you manage to thread the head of the length of string through the grill." remove lengthofstring move stringtail to closet move stringhead to wilshirelobby return true } } !---------------------- ! CHUCK BIXBY'S OFFICE !---------------------- room chucksoffice "Chuck Bixby's office" { long_desc "The office is fairly bright--lots of windows. The most notable thing in it is a big wooden desk on which, along with a bunch of other stuff, sits a computer. The other most notable thing is a small, solid-looking safe visible under one side of the desk--notable in that \"Hey, there's a safe here\" sort of way." graphic IMAGES1, "chucks" out_to wilshirelobby d_to wilshirelobby } scenery chucksdesk "desk" { in chucksoffice noun "desk" adjective "big", "wooden" article "a" long_desc "It's a big, wooden desk set at one end of the office. \ A computer sits on it along with a whole mess of papers and files spread over the blotter." before { object DoLookIn { ! To make sure we at least mention the papers, ! files, and blotter if children(self) = 0 Perform(&DoLook, self) else return false } } is platform holding 0 capacity 50 } scenery computer "computer" ! 'special' when crashed { in chucksoffice nouns "pc", "computer", "machine", "monitor", "screen", "schedule", \ "program", "programme", "application", "appointments" adjective "pc", "personal", "desktop", "computer", "scheduler", "windows" article "a" long_desc { if self is not special "The computer is turned on and currently running some sort of Windows scheduler program showing Bixby's appointments--you don't recognize any of the names." elseif self is not switchedon "The computer is turned off." else "The computer is turned on, but it seems to have crashed." } before { object DoSwitchOff { if chuck in location { "Chuck's eyes go wide in the manner of any sane person that is justifiably baffled by technology. \"Hey--don't mess with that,\" he says, preventing you from reaching for the power.\"" return true } ! If the player hasn't crashed it yet: if self is not special "Now just think hard about how thrilled you'd be if someone did that to you." elseif self is switchedon { "You turn the power off and hope for the best." self is not switchedon } else return false } object DoTouch { "You touch the computer. It crashes." self is special } object { if verbroutine ~= &DoLook, &DoSwitchOn "Since it's not yours, you probably shouldn't touch it." else return false } } after { object DoSwitchOn { "You turn the power back on, and the computer beeps and whirs for a minute or so before a message pops up announcing that you're gonna have to reinstall Windows." if chuck in location "\nChuck sighs. \"Typical,\" he says." } } is switchable, switchedon } scenery chuckstuff "Chuck's stuff" { in chucksdesk nouns "papers", "documents", "files", "stuff", "things" adjectives "chuck's", "mess" long_desc "There's nothing particularly noteworthy amongst the papers and documents and other files on Chuck's desk. Lots of references to movies and TV shows that you've never heard of--that they're either just developing or just making or saying they'll make but never really plan to." before { object DoGet { "Best not to mess too much with Chuck's things, especially if there's no real point in doing so."; if chuck in location " And even more especially with him right there." else print newline } } is readable } component blotter "desk blotter" { part_of chucksdesk noun "blotter" adjective "desk", "felt" article "a" long_desc "Your basic desk blotter: a big square of felt covering the desk, on top of which are piled numerous papers and files." before { object DoLookUnder, DoMove { if chuck in location "You're going to have a hard time lifting the blotter to snoop under it with Chuck standing right there." elseif scrapofpaper in nothing { "You find a scrap of paper tucked under the blotter." move scrapofpaper to chucksdesk } else "You already found the scrap of paper--there's nothing else interesting hidden under the desk blotter." } } } object scrapofpaper "scrap of paper" { noun "paper", "combination" adjective "scrap" article "a" size 5 initial_desc "Sticking out from under the desk blotter is a scrap of paper." long_desc { "It reads: \""; print number combination[0]; "-"; \ number combination[1]; "-"; \ number combination[2]; "\"." PrintFootnote(21) } analysis "They thought it might be the combination to a safe--that was their best guess."; is readable } array combination[3] global combination_count scenery safe "safe" { in chucksoffice noun "safe" adjective "small", "solid", "looking", "solid-looking", "gray" article "a" long_desc { "It's a solid-looking gray safe sitting on the floor by Chuck's desk. "; if self is open "It has a dial for the combination lock on the front, but the safe is open." else "The safe is closed and has a dial to open the combination lock on the front." } key_object -1 ! nonexistent capacity 20 holding 0 before { object DoOpen, DoClose { if chuck in location and chuck.lying_about_holly "With Chuck Bixby standing right here? \ Maybe you should wait until that's not the case." else return false } object DoGet { "It might be bolted to the ground for all you know--\ it's heavier than you and there's no way you're able to budge it. Better think of something else to do with it." } xobject DoPutIn { if object ~= photos, sinatras "You'd better not go stuffing stuff in Chuck Bixby's safe that doesn't belong there." else return false } } after { object DoOpen { "The safe opens with a soft \Iclick\i." } object DoClose { "The safe closes with a solid \Iclick\i." } } is container, openable, not open, lockable, locked } component dial "dial" { part_of safe noun "dial", "lock" adjective "combination", "safe" article "a" long_desc "Attached to the front of the safe. The numbers on the dial go up to 99." before { object DoTurnDial { if chuck in location and chuck.lying_about_holly "With Chuck Bixby standing right here? \ Maybe you should wait until that's not the case." else return false } } } ! The DoTurnDial routine is a verbroutine specifically for handling ! "turn dial to ". Can't put this into a before routine since ! the use of a number in the command will prevent before/after routines ! from getting called. routine DoTurnDial { if object = safe and xobject { "(Assuming you mean the dial.)" return Perform(&DoTurnDial, dial, xobject) } elseif object ~= dial { "You can't turn "; print The(object); "." return false } elseif xobject < 1 or xobject > 99 { if not xobject "Try: \"turn dial to \"." elseif xobject > 99 "The combination dial only goes up to 99." elseif xobject < 0 "Yes, well, good luck with that." return false } elseif safe is open { "The dial won't turn while the safe is open." return true } "The dial spins smoothly as you turn it to "; print number xobject; "." if xobject = combination[combination_count] { if ++combination_count = 3 { safe is not locked combination_count = 0 } else safe is locked } else { combination_count = 0 safe is locked } } object photos "compromising photos" { in safe nouns "photo", "photos", "picture", "pictures", "snapshots", \ "photographs" adjectives "compromising" article "some" long_desc { "The pictures are of "; if billy is known "Billy Van Earl"; else "some musician-looking guy"; " and Holly Golden"; if outsidehouse is not visited " the movie star"; ". They're not...ah, well, they're not wearing a whole lot. Either of them. Although for the activity which has here been caught on Kodak, clothes are more a hindrance than anything." } initial_desc "Some compromising photographs are lying on top of the other stuff in the safe." analysis { "Well, they were quick to catch on to the fact that this was Holly Golden naked and having sex, and there are now about fifty photocopies floating around the police lab." PrintFootnote(26) "\nOther than that, they didn't find anything particularly useful."; } before { object DoLookUnder { if self in safe and sinatras is hidden { sinatras is not hidden run sinatras.initial_desc } else return false } } after { object DoGet { ! The Sinatra albums are under the photos sinatras is not hidden return false } } is plural } object foldednote "folded note" { noun "note", "paper", "letter" adjective "folded" article "a" long_desc "It's handwritten and short: \"They look like they're enjoying themselves, now, don't they?\"" analysis { if screeningreport is not analyzed "Well, they managed to get some fingerprints off it, but they couldn't identify them."; else "The fingerprints from the folded note matched the ones from the screening report."; } is readable } object sinatras "signed Frank Sinatra albums" { in safe nouns "records", "albums", "record", "album", "sinatras", "fakes" adjectives "frank", "sinatra", "stack", "signed", "fake", "bootleg" article "some" initial_desc "Lying under where the photographs were is a stack of signed Frank Sinatra record albums." long_desc { "On closer inspection, though, you wonder whether Old Blue Eyes actually had any hand in signing them. They all say:\n\n \_ \"To Dean,\n \_ All my best --Frank\"" PrintFootnote(22) } before { object DoAnalyze { "This is one of those times when you have to sit back and think that sending a stack of bootleg signed Sinatras to the cops is not a good idea." } } is hidden } #include "chuck.hug" ! Chuck Bixby's character