!\--------------------------------------------------------------------------- STUART.HUG Stuart Fina's character (plus his receptionist) for Guilty Bastards by Kent Tessman (c) 1998 (Included by "gb1.hug") ---------------------------------------------------------------------------\! global shown_note ! true if Stuart has been shown the folded note character stuart "Stuart" { inherits NPC in stuartsoffice nouns "stuart", "fina", "stu" adjective "stuart", "stu" parse_rank 1 ! prefer to other objects long_desc { if self.disposition = 2 "Stuart looks ready to kill. You, that is." else "Stuart is a young guy, maybe only twenty-seven or twenty-eight. His look is carefully constructed: he sports a trendy Van Dyke beard to show the artists he's not a suit, and a crisply pressed white shirt and red power-tie to show the suits that the Van Dyke is just camouflage." } graphic { ! Stuart's picture is a little too happy if he's currently ! trying to kill the player: if self.disposition = 2 return 0 else { current_resource_file = IMAGES1 current_resource = "stuart" return -1 } } short_desc { if self.disposition = 2 and location ~= reception "Stuart Fina is here, eyes flaring with anger--the homicidal kind." else "Stuart Fina is here in the reception area as well." } knows_about_photos false disposition 0 ! 0 = normal, 1 = leaving the office ! 2 = ready to kill player over the folded ! note ignore_response { select self.disposition case 1 "\"Sorry, I'm in a bit of a rush here,\" Stuart says." case 2 "Stuart's presently trying to kill you. The time for niceties is probably past." } after { !------------------ ! DoAsk responses: !------------------ object DoAsk { select xobject case cindy "\"Yeah, well, geez...\" Stuart trails off, shaking his head. \"God, I really don't know what to say...I mean it's terrible, absolutely terrible. She had such a bright future. She was going to be a huge star. Her picture, the one she was doing with us--it's going to be a \Ihit\i. A huge hit. When people see it they're going to think about James Dean and Marilyn Monroe and all wonder 'What if...?'\"" case murder "\"Who do you think did it?\" Stuart asks. \ \"Who would've wanted to kill her? Was she caught up with something \ illegal? Or was she...was she in some kind of love triangle...?\"" case photos { if not self.knows_about_photos "Stuart looks shocked. \"I have no idea what you're talking about. Are you sure?\"" else { "\"You found them,\" he says. \"I don't know anything about them. That's pretty scandalous.\""; if not shown_note " Then, out of the blue: \ \"Did they come with a note or anything?\"" print newline } } case foldednote "\"I really have no idea what that is.\"" case cindysmovie "\"Oh, it's going to be a big, big hit. It's testing through the roof--test audiences are just loving it. Cindy's perfect in it: this sweet, adorable girl plotting all these terrible ways to kill her cheating lover.\" Stuart sighs heavily. \"It just makes what happens to Cindy that much sadder...that much more of a tragedy.\"" case milt "\"Milt? I idolize Milt,\" Stuart says. \ \"You know what he is in this business? The godfather. The king. Milt talks and people don't even question it. If there's one guy you don't want to look like an idiot in front of it's Milt Walker.\"" case anne "\"Oh, Anne here?\" Stuart asks, looking right at her. \"Isn't she just the best?\" He smiles at her; she manages to weather it. Then, as an aside to you, he adds: \"Her uncle's one of our major shareholders.\"" case billy { if billy in location "Stuart looks over at Billy, and says quietly to you: "; if not self.knows_about_photos "\"I don't know anything about him.\"" else "\"Well, if this ever gets out, he's gonna be more famous as a guy who gave the sticks to Holly Golden than he ever would've been as a funk musician.\"" } case holly { if self.knows_about_photos { "\"I just can't believe a star of her stature would get busted getting photographs taken of her getting tended to by the pool boy. Or some musician nobody's ever heard of. Whatever.\" \ Stuart shakes his head."; if billy in location " Then, realizing the poolboy is standing right there, he says to Billy: \"Well, generally speaking, of course. I'm sure lots of people have heard of you.\"" print newline } else "\"Holly Golden was the hot thing for quite a while,\" Stuart tells you. \"But, you know, people always want a new hot thing. She even tried for the role in \IHugs and Kisses\i, but we went with Cindy Painter.\"" } #ifset INCLUDE_OTHER_CHARACTERS case johnny "\"I've never worked with him. But if he keeps making movies that make money, I wouldn't mind.\"" #endif case chuck "\"He's Cindy's agent. He was, I mean. I never really had any dealings with him.\"" case else return false } !------------------- ! DoTell responses: !------------------- object DoTell { select xobject case photos { if self.knows_about_photos "\"What about them?\" Stuart asks." else "Stuart looks surprised. \"What? Are you kidding? I mean, you haven't seen these, have you?\"" } case else return false } !------------------- ! DoShow responses: !------------------- xobject DoShow { select object case photos { if self.knows_about_photos "\"Yeah, you already showed those to me,\" Stuart says." ! Showing the photos to Stuart sets him off: else { "Stuart's eyes widen. \"I can't believe that. I mean...where did you get those?\"" self.knows_about_photos = true Deactivate(stuart_leaving) Activate(stuart_getting_evidence, 10) if not stuart.disposition stuart.disposition = 1 } } case foldednote { if not self.knows_about_photos "Stuart's eyes widen momentarily. \ \"And, what, this was with some pictures or something like that?\" he asks." else { "Stuart's eyes widen momentarily. \ \"I see,\" he says. \"Interesting.\"" } ! Given this evidence against him (plus the ! photos), Stuart's ready to kill the player self.disposition = 2 } case else return false } } is known } ! Not really a "room" since the player can never go there, but at least ! we can check if Stuart is in his office: room stuartsoffice "Stuart's office" {} vehicle stuartscar "Stuart's Mazda" { nouns "car", "vehicle", "automobile", "mazda", "convertible" adjective "sports", "mazda", "red", "sporty" parse_rank 1 ! prefer to other cars in the parking lot, ! as well as to cartrunk for "mazda" long_desc "It's a sporty red Mazda convertible--the kind of car that a younger executive drives before he or she steps up to a Porsche or Jaguar or something like that. Other than that, it's unremarkable, with the normal convertible touches, included a folded-down ragtop and a trunk too small to be useful." short_desc "Stuart Fina's Mazda is parked in front of the side building." before { object DoEnter, DoOpen { "I'd keep out if I were you. People generally don't take kindly to finding a stranger in the car." } } is openable } component cartrunk "trunk of the Mazda" ! 'special' once opened { part_of stuartscar nouns "trunk", "boot", "mazda" adjectives "trunk", "boot", "car", "mazda's" article "the" long_desc { CThe(self) print " is "; if self is open "open." else "closed." } key_object -1 ! no key before { object DoUnlock { "You don't have a key for Stuart's trunk."; if self is not locked " But on the other hand, it doesn't look too tightly shut." else print newline } object DoOpen { if billy in location { "Billy looks at you, shocked. \"You're breaking into some guy's car now?\"\n" Activate(billy_freaked, 2) } if self is locked "You try to open the trunk. It seems loose, like something's not locking properly, but you still can't seem to get it open." else return false } } after { object DoOpen { if self is not special "(There must be something wrong with the lock: you're able to pop the trunk open without a key.)\n" self is special return false ! normal message } } holding 0 capacity 40 is openable, locked, lockable, container } !---------------------------------------------------------------------------- ! stuart_arriving ! stuart_leaving ! ! For managing Stuart's comings and goings: fuse stuart_arriving ! 'special' if not running for the first time {} event in stuart_arriving { if location ~= reception { Deactivate(self) return } if not self.tick { event_flag = true "\nStuart Fina appears from somewhere down the hallway."; if self is not special { " He obviously doesn't recognize you, but he manages to greet you with one of those practised smiles that suggests you're the best thing that's happened to him all day. \"Hi there. Stuart Fina.\"" self is special } else " He smiles a \"You, again\" smile. \"Oh, you again,\" he says." move stuart to reception stuart_leaving.misc = counter stuart_leaving.timer = 0 Activate(stuart_leaving) } } daemon stuart_leaving { misc 0 ! what time he came out timer 0 ! how long since the player left reception } event in stuart_leaving { if location = reception { self.timer = 0 ! If Stuart's been out in reception for half an hour if counter - self.misc > 30 { event_flag = true "\nStuart looks at his watch. \"If you'll excuse me,\" he says, \"I do have some work to do.\" With a smile he slips back down the hall toward his office." move stuart to stuartsoffice Deactivate(self) } } else { ! Stuart will normally wait 5 minutes after the player has ! left before leaving himself if ++self.timer = 5 { move stuart to stuartsoffice Deactivate(self) } } } !---------------------------------------------------------------------------- ! stuart_getting_evidence ! ! To manage Stuart sneaking around after being shown the pictures, getting ! ready to bolt with the evidence: ! ! - goes outside ! - parks his car outside the side building ! - goes inside, then comes out, puts negatives and report in trunk ! - IF player is not absent, we run through the bit where he's ! forgotten something and must go back in ! fuse stuart_getting_evidence {} event in stuart_getting_evidence { local t #ifset DEBUG ! This comes in very handy for debugging where Stuart is at any ! given time as opposed to where he's supposed to be: if debug_flags & D_FUSES { "[Stuart in: "; print parent(stuart).name; ", timer="; number self.timer; "]" } #endif if stuart.disposition = 2 and ! i.e., murderous player in sidebuilding { "\nSuddenly Stuart appears. It's really, really like something out of a dream or a movie, the way he pulls a gun out of his coat and in one quick motion points it at you and pulls the trigger."; PlayMusic(MUSIC_STOP) PlaySound(SOUNDS1, "gunshot") " And as for anyone who says that getting shot is not what you'd expect, that it's like some sort of tugging, a strangely dull impact--they're full of crap. It hurts like a sonofabitch."; if billy in location { " Billy doesn't get away, either. Even a heartfelt \"Hey, man, don't shoot me...\" isn't enough to save him. So now you're responsible for a dead funk musician, too." } print newline "\nThe question crosses your mind as to how the hell this guy expects to make it off the studio lot, running away from the scene of a shooting with smoking gun in hand. But then you're struck by the more important realization that, you know, it really doesn't matter. They say death is hard on those left behind, but Stuart seems to be doing okay. On the other hand--" endflag = 2 ! dead } t = self.tick if t > 6 ! doesn't do anything for first few minutes... { ! ...unless the player leaves, in which case we cheat 't' if player not in reception t = 7 return } select t case 6 { if player in reception { event_flag = true "\nStuart looks at his watch. \"Oh, you know what? \ I'm forgetting a meeting. Would you excuse me? \ Anne, let anyone who calls know I've gone out to a meeting.\" He smiles and heads outside." } elseif player in sidebuilding { event_flag = true "\nStuart Fina comes out of the side building, heading for the parking lot. He smiles hurriedly. \ \"Off to a meeting,\" he says before he disappears." } elseif player in behindtree { event_flag = true "\nYou can see Stuart Fina come out of the side building and disappear in the direction of the parking lot." } remove stuart } case 3 { if player in reception { event_flag = true "\nStuart comes back in. He nods a quick hello to you and heads for his office." } elseif player in sidebuilding, behindtree { event_flag = true if player in behindtree "\nFrom your vantage point behind the tree, you can see Stuart as he"; else "\nStuart"; " drives up to the side building in his sporty Mazda convertible. He gets out"; if player in sidebuilding ", nods a quick hello to you,"; " and goes inside." } move stuart to stuartsoffice move stuartscar to sidebuilding } case 0 { if player in reception { event_flag = true "\nStuart comes out of his office again, rolling his eyes in mock self-chastisement, saying something about how forgetful he is, shame on him, and then he's disappeared outside." :RemoveStuart remove stuart remove stuartscar return } elseif player in sidebuilding { event_flag = true "\nStuart comes out of the side building again. He looks surprised to see you. He hesitates noticeably for a second, then--after practically slapping his forehead--mumbles about forgetting something and goes back inside." Activate(self, 3) ! i.e., reactivate it } elseif player in behindtree { event_flag = true "\nPeeking out from behind the tree, you can see Stuart as he comes out of the building and goes to his car. He puts something in the trunk and closes it. Then he suddenly looks like he's remembered something. He looks around, doesn't see anybody--\ including you--and quickly decides to go back inside." move stuart to stuartsoffice move screeningreport to cartrunk move negatives to cartrunk cartrunk is not locked Deactivate(self) Activate(stuart_escaping_with_evidence, 6) } ! i.e., if player is nowhere around else jump RemoveStuart } } !---------------------------------------------------------------------------- ! stuart_escaping_with_evidence ! ! To manage Stuart either escaping with the evidence, catching the player ! going through his trunk, or driving away (after the player has recovered ! the evidence): fuse stuart_escaping_with_evidence {} event in stuart_escaping_with_evidence { ! When time runs out, Stuart comes back out of the building for ! the last time if not self.tick { if player in sidebuilding and cartrunk is not open { event_flag = true "\nStuart comes out of the side building, making a beeline for his car. \"Excuse me,\" he says curtly before getting in, starting the car, and speeding off." } elseif player in sidebuilding and cartrunk is open { "\nStuart comes out of the side building and sees the trunk of his car open. His mouth opens. He sees you standing there. \"Son of a \Ibitch\i!\" he mutters--\n" PlayMusic(MUSIC_STOP) PlaySound(SOUNDS1, "gunshot") "--and pulls out a \Igun\i! He aims it at you, of course. And then he pulls the trigger. A searing pain in your stomach. Another shot. Blood on your hands, your blood, you're wondering just how the hell he's going to explain this to the cops and then it doesn't particularly matter because it all goes dark." endflag = 2 ! dead } elseif player in behindtree { event_flag = true "\nFrom behind the tree, you can see Stuart come out of the side building, making a beeline for his car. "; if cartrunk is not open "He gets in, starts it up, and speeds off." else "When he sees that the trunk is open, you can tell even from here that he's about to have a panic attack. He looks around, sees no one--\ then quickly seems to decide to get into the car and take off." } remove stuart remove stuartscar ! If the player has moved any of the evidence in Stuart's ! trunk, Stuart is going to track the player down and rack ! up a second murder ! if screeningreport not in cartrunk or negatives not in cartrunk { ! If the trunk is closed, Stuart won't notice the ! player's theft until almost an hour later: if cartrunk is not open Activate(stuart_poaching, 55) else Activate(stuart_poaching, 25) ! And just in case anybody's doing tests to see if ! Stuart is omniscient and omnipotent, make things ! at least look a little random: stuart_poaching.timer += random(10) } } } !---------------------------------------------------------------------------- ! stuart_poaching ! ! Lying in wait for player, waiting to rack up a second murder. daemon stuart_poaching { timer 0 misc 0 ! used for monitor situation in Cindy's living room } event in stuart_poaching { stuart.disposition = 2 stuart is unfriendly ! Start the "final-sequence" music if self is not special { PlayMusic(MUSIC1, "z3-galim", true) soundtrack_stage = 2 self is special } ! The reason this is a daemon instead of a fuse is that we want it ! to keep running after self.timer hits zero--a fuse will ! automatically deactivate. Essentially this is a "delayed daemon". if self.timer { --self.timer return } select location #ifset PART2 case wilshire { "\nSuddenly Stuart Fina steps out from behind two parked cars. More importantly, he's got a gun."; if billy in location "\"Cripes!\" Billy says."; " Stuart doesn't say anything; he aims the barrel of the gun at you, and as you're lifting your hands and opening your mouth to explain--\n" PlayMusic(MUSIC_STOP) PlaySound(SOUNDS1, "gunshot") "--\Ihe shoots you\i."; if billy in location " Then he turns the gun on Billy, who falls with a shout as the shot catches him. The two of you lie there, dying mostly, and finally Stuart speaks: "; else " You lie there, looking up at Stuart, wanting more than anything to close your eyes and rest for a minute, dying mostly, and finally Stuart speaks: "; "\"Knew I'd find you sneaking around. Maybe this'll help you mind your own business, \Idetective\i.\" Guess it probably will." endflag = 2 ! dead } case malibu { "\nSo as you're there by the side of a quiet road winding up into the Malibu hills, it's almost fitting that Stuart Fina should appear. With a gun."; if billy in location " \"Holy crap,\" Billy says."; " Stuart points the gun at you. \"I thought you'd find your way up here,\" he says, \"You're pretty dumb for a detective.\" And then, as if putting you out of your misery, he shoots you twice."; PlayMusic(MUSIC_STOP) PlaySound(SOUNDS1, "gunshot") if billy in location " (He shoots the nearest funk musician, too, for good measure--and much to Billy's dismay.)" " \"And stay out of my trunk,\" Stuart says." endflag = 2 ! dead } case overlookingbeach { "\nStuart Fina suddenly steps into view from the north. And he's got a gun. \"I've been waiting for you, \Idetective\i. \ I figured you were behind the two-bit raid on my trunk--\" \ As punctuation, almost in place of a period at the end of that sentence, he pulls the trigger."; PlayMusic(MUSIC_STOP) PlaySound(SOUNDS1, "gunshot") " Basically, what you do is you sit down, your legs crumpling under you. So Stuart shoot you again."; if billy in location { " It's about this time that Billy turns to run, muttering \"Holy holy holy...\"--but Stuart sends a bullet his way, too, catching him off-balance. The sight of Billy pinwheeling over the railing and down to the beach below would almost be funny in that Mel Brooks sort of way if it wasn't for the fact that the two of you are well on your way--" PrintFootnote(25) } print newline endflag = 2 ! dead } #endif ! ifset PART2 case cindysapartment, kitchen { event_flag = true select self.misc ! i.e., stage of confrontation case 0 { move stuart to kitchen if player in cindysapartment ! living room { "\nThe apartment door opens. You turn to look, "; ! If billy is hanging around outside if billy.suspended = 2 "expecting to see Billy standing there--\n\n--but instead you're greeted by the snarling face of Stuart Fina."; else "startled, not knowing who it could be. Your question is answered pretty quickly, however--\n\n--by the snarling face of Stuart Fina."; " Stuart bursts in on you. And he's got a gun that he's pointing right at you. Not everyday that happens. It's maybe worth pointing out just briefly that the guy with the gun is crazed. A moment of surprising clarity ensues where it becomes very, very obvious to you how he could've killed Cindy Painter. He swings the gun around--still pointing it at you most of the time, of course--talking loudly about how he's going to put a goddamned bullet in you. He backpedals you into--" MovePlayer(kitchen) obstacle = stuart } else ! kitchen { ! If billy is hanging around outside if billy.suspended = 2 "\nYou hear a noise from the living room, the front door opening and closing, and poke your head around the corner expecting to see Billy. But who you see is--\n\n--Stuart Fina."; else "\nYou hear a noise from the living room: the front door opening and closing, which is understandably enough to freak you out. You peek around the corner, coming face to face with--\n\n--Stuart Fina."; " And he's pointing a gun right at you. \ He backpedals you back into the kitchen, waving the gun, muttering about how he's going to kill you right now, real dead." } "\nStuart shakes his head. \"You know,\" he says, \"you're a real moron. What, do you think you're some kind of bigshot detective? Hot on the trail of a murderer? \II'm\i not a murderer, you moron.\" He thinks about that for the briefest second. \"Well, maybe I did kill her, but I didn't \Iplan\i to. And then I come here looking for that stupid note I gave her with the pictures, and who do I find...?\"" ++self.misc return } case 1 { "\nStuart wags the gun at you like he can't decide whether to shoot you with it, crack you on the skull with it, or just throw it down and walk away in disgust. \"\ICindy Painter\i was the loose cannon. \IShe\i was supposed to kill that stupid musician! That kinda sick publicity is about the only thing that would've made anybody see \IHugs and Kisses\i--it was testing like a bowel movement. I thought once I slipped her those photos, she'd flip right the hell out and waste him! How the hell was I supposed to know she actually loved that idiot? Or something. Jesus, people piss me off.\"" ++self.misc return } case 2 { "\n\"Aw, screw it,\" Stuart says, raising the gun. \ His finger tightens on the trigger. Say goodnight, Gracie. You close your eyes. And then--\n" ! If billy is hanging around outside if billy.suspended = 2 { "--\ICrash.\i When you open your eyes, it's Billy standing there, not Stuart. Billy is holding half a broken terra-cotta flowerpot. The other half of the flowerpot is scattered on and around Stuart's head--Stuart, who is now lying on the kitchen floor, is sort of moaning lamely but other than that he's not much of a threat. Billy looks at what's left of the pot: \"Oh, man, I trashed somebody's flowerpot.\"" "\nAfter you manage to pull yourself together and convince your legs to stop shaking, you call the police and wait for them to arrive. Jake Duffy shows up first. (You give up on trying to understand his apparent omniscience--either he's got a direct line to God or the police dispatcher or he's got nothing better to do than hang around you all day waiting for something to happen.) Jake looks at Stuart, who is still lying on the floor, just now barely regaining consciousness. \"So you bagged the murderer?\" Jake asks. \"Nice going.\" And then the police arrive to cart Stuart Fina off to the hoosegow." MovePlayer(policestation) "\nMilt Walker meets you at the police station where you're giving your statement. He thanks you, gravely, yet glad to have it all over with. Then, more importantly he pays you.\n\nYou leave the police station with a renewed sense of hope, that even just a little of the wrong in the world has been made right thanks to you, and with renewed financial means you'll soon be moving out of the Pelican Hotel to which you now return. But maybe a quick stop at the ponies first..." PlayMusic(MUSIC1, "gbtheme") endflag = 1 ! "You've won the game" } else { "Bang." endflag = 2 ! dead } } } } !---------------------------------------------------------------------------- ! Anne, the side building's receptionist, whose main purpose is to get ! Stuart into the reception area: female_character anne "Anne" ! 'special' once she's called Stuart once { in reception nouns "anne", "receptionist", "secretary" long_desc "Anne is young, maybe twenty-one, and got this job either on some kind of summer-intern program or because she's someone's niece. Either way, she looks cheerful enough with life, but not exceptionally thrilled to be here in particular. I'm sure she does her job without major complaint--I just wouldn't expect her to jump at the chance to make friends with you or anything." graphic IMAGES1, "anne" initial_desc { "The building's receptionist is sitting at her desk. Her nameplate says her name is Anne." self is moved } short_desc "Anne, the building's receptionist, is sitting at her desk." order_response { if verbroutine = &DoSwear Perform(&DoKiss, self) else return false } before { object DoKiss, DoTouch, DoGet {"\"Get away from me, you pervert.\""} } after { object DoAsk { select xobject case cindy, murder "\"I think it's horrible what happened to her! I was so upset when I heard--I didn't know her, though.\" Anne looks at you. \"What do you have to do with it? Is that why you're here?\"" case stuart { if stuart in location "Anne looks at you. Looks at Stuart. \ Looks at you. \"He's right here,\" she says." elseif stuart not in stuartsoffice "\"He's gone out,\" Anne says. \"He said he might be gone for the day.\"" elseif stuart_arriving is active "\"I just called him for you.\" She seems a little annoyed with your impatience. \"You're welcome to have a seat.\"" elseif stuart_getting_evidence is active "\"He said he had to go into a meeting,\" Anne tells you, shrugging." else { if self is not special "\"Who shall I say is here?\" Anne asks, looking you up and down. \"Um...forget it. I'll just buzz him.\" She punches a couple of buttons on her phone and speaks very briefly into it before hanging up." else "\"Again? Okay,\" she says, and calls Stuart Fina in his office." self is special Activate(stuart_arriving, 5) } } case milt "\"He's not in this building. He's in the main building.\"" case holly "\"She's a movie star--I see lots of them around here.\"" #ifset INCLUDE_OTHER_CHARACTERS case johnny "\"Well, some people don't like him, but I sure do. There's just...\Isomething\i about him,\" Anne says. \"Why, do you know him? Can you introduce me?\"" #endif case else "Anne looks at you in a way that says, hey, I'm just the receptionist--I'm not bothering \Iyou\i, am I?" } } }