Constant Story "REVERBERATIONS"; Constant Headline "^A Hectic Voltairian Adventure^ Copyright (c) 1996 by Russell Glasser.^ Updated and revised 1998^"; Constant MAX_SCORE 50; !Constant DEBUG; Constant READNOTE 1; Constant EATPIZZA 2; Constant CLIMBROPE 3; Constant GRASPSTRAWS 4; Constant KICKJILL 5; Constant ENTERSEWER 6; Constant SHOPLIFTING 7; Global onemove = 0; Global USUCK = 3; Global PANCAKE = 4; Global TOAST = 5; Global WON = 7; !Global quote = 0; !Global quotes_on = 1; Global question = 0; ! Event conditions attribute indoors; ! attribute looked_at; attribute tried_eating; ! attribute following; attribute cops; attribute earthquake; attribute mob; attribute riots; property state; Include "Parser"; Include "adname.h"; Fake_action Locate; Fake_action PizzaTo; replace DeathMessage; [ DeathMessage; if (deadflag == USUCK) { print "You Suck"; rtrue; } if (deadflag == PANCAKE) { print "You're a pancake!"; rtrue; } if (deadflag == TOAST) { print "You are toast"; rtrue; } if (deadflag == WON) { print "You Rule! The game's totally over!"; rtrue; } ]; replace ChooseObjects; [ ChooseObjects obj code; if (code<2) { if (obj has scenery) return 2; rfalse; } ! if (action_to_be==##Eat && obj has edible) return 3; if (obj hasnt scenery) return 2; return 1; ]; Object LastLoc "ll" has indoors; Object LibraryMessages "lm" with before [; if (location hasnt indoors && LastLoc has indoors && Atmosphere has cops && Atmosphere has mob && Atmosphere has earthquake && Atmosphere hasnt riots) { give Atmosphere riots; move guard to Downtown; move rope to HardwareDept; move hammer to HardwareDept; print "^Okay, let's recap the story so far. Your afternoon got off to an interesting start when you foiled an escape attempt by Guido ~The Armadillo~ Calzone. This heroic-but-not-terribly-bright action brought down the wrath of the local mafia down on you, who tried to assassinate you inside a department store. They also left a ~special delivery~ for you which started an earthquake. You were also responsible for uncovering the illicit activities of the corrupt mayor, who then sent every cop and trooper in the area to take care of you. So, you're hounded by the police, wanted dead by the mob, and trying to cope with a massive earthquake.^^ As you step outside, you can see that the people of the town have succumbed to the general chaos of the environment, and now the town of San Doppleton is marred by heavy rioting.^"; if (location == Downtown) print "^A security guard steps out of the building after you. He stations himself in front of the office building, arms folded.^"; } if (location has indoors) give LastLoc indoors; else give LastLoc ~indoors; Attack: if (noun == player) "Buck up, little camper! Things aren't that bad. Yet."; if (second == nothing) "You're a lover, not a fighter. Then again, you're not much of a lover either."; if (second == hammer) "Got to learn to curb those violent tendencies."; if (second == axe) ! print_ret "Hey! What did ", (the) noun, " ever do to you?"; print_ret "What did that ever do to you?"; if (second == hairspray && noun has animate) <>; if (second == note) <>; print_ret (The) second, " isn't a very good weapon."; Cut: switch (second) { axe: <>; note: print_ret "What were you going to do, give ", (the) noun, " a papercut? Oh, help, police, somebody stop him."; } Drop: if (lm_n == 1) "You're not holding that."; Swing: if (noun == nothing) "You swing for a while. Guess that makes you a real hep cat."; "You can't swing on that."; Take: if (noun == player) "Taken.^^You are now holding yourself. In the self you see yourself, which contains yourself. Yourself contains...^^ On second thought, let's NOT do that."; Strong: "Not in this game, bro. You must be looking for the sequel, ~Reverberating Goddesses of Phobos~."; Mild: "Same to you, dude, and so's your mom."; Yes: switch (question) { READNOTE: "I thought you'd like it."; EATPIZZA: <>; CLIMBROPE: "Good memory."; GRASPSTRAWS: "Well, hurry up and get your act together. This is no time to screw around."; KICKJILL: "Forget it. You may be a dork, but at least you're a chivalrous dork."; ENTERSEWER: "Well, I've got news for you, Donatello. The sewer vent it just too small for you to fit inside."; SHOPLIFTING: "Well then, you'd better wait for the author to finish writing ~Wronger of Rights.~"; default: "Nobody asked you anything, doofus."; } No: switch (question) { READNOTE: "Robert ~Tasty~ Tasker would kill you if heard you insulting his stationery."; EATPIZZA: "Smart boy."; CLIMBROPE: "Well, now I'm reminding you."; GRASPSTRAWS: "Okay, if it makes you feel better to think so."; KICKJILL: "I sure hope not!"; ENTERSEWER: "That's right, you're not. Now focus on the job at hand... it's pizza time, dude!"; SHOPLIFTING: "Your mommy would be so proud."; default: "Nobody asked you anything, doofus."; } ]; Include "VerbLib"; Include "Grammar"; ![ QuotesOnSub; quotes_on = 1; "[Quotations are now on.]"; ]; ![ QuotesOffSub; quotes_on = 0; "[Quotations are now off.]"; ]; ![ AnyWord; from_char=0; to_char=0; the_named_word=wn++; return burin; ]; ![ QuotedText i j f; ! i = WordAddress(wn++); i=i-buffer; ! if (buffer->i=='"') ! { for (j=i+1:j<=(buffer->1)+1:j++) ! if (buffer->j=='"') f=j; ! if (f==0) return -1; ! from_char = i+1; to_char=f-1; ! if (from_char>to_char) return -1; ! while (buffer+f > WordAddress(wn)) wn++; wn++; ! return burin; ! } ! return -1; !]; !Verb meta "quotes" ! * "on" -> QuotesOn ! * "off" -> QuotesOff; ! Useful "replace" terms [ JumpOffSub; if (noun == nothing) "You jump off the floor. The Russian judge almost gives you a 9.0, but you screw up on the landing and collapse in a heap."; if (player in noun) <>; print_ret "You're not on ", (the) noun, "."; ]; [ KnockSub; print_ret "You knock on ", (the) noun, " but there is no answer."; ]; [ LeggoSub; "You're not holding onto anything important anyway."; ]; ![ ReadSub; "I didn't realize the stress of your everyday life would hit you ! so soon. There's nothing written there."; ]; [ SpraySub; if (second == nothing) { if (hairspray notin player) print_ret "You're not holding anything that you could spray ", (the) noun, " with."; <>; } if (noun ~= hairspray) "That doesn't seem to have a nozzle."; ]; [ SprayWithSub; <>; ]; [ ThrowSub; move noun to location; print_ret "You give ", (the) noun, " a good lob and it lands on the ground a couple of feet away. It's a good thing you're so good at surfing, because you'll never be a football star."; ]; [ ThrowDirSub; if (second in compass) <>; "What are you talking about?"; ]; [ UntieSub; "Excuse me for not paying attention... I must have missed the part when you tied it to something."; ]; ! Silly "replace" terms [ MagicWordSub; "You remember hearing that word from some little grom on the beach last year. You have no idea what it means, but it sounds way cool."; ]; [ DudeSub; "Yah, same to you. Whaddup?"; ]; [ SuckSub; "I agree, this sucks."; ]; [ RuleSub; "Way! You totally rule."; ]; [ AnatomySub; "A hollow voice in your head says ~Penis~, a little bit louder than you did."; ]; [ ScrewSub; "This really isn't that kind of game."; ]; [ ShakeSub; "Shake, rattle, and roll!"; ]; Object questions "qs"; [ QuerySub; print_ret (string) noun.description; ]; [ Topic i; switch(scope_stage) { 1: rfalse; 2: objectloop (i in questions) PlaceInScope(i); rtrue; 3: "I can't believe you don't know what THAT means."; } ]; Verb "what" * "is" scope=Topic -> Query; Verb "explain" "define" * scope=Topic -> Query; Verb "untie" "disconnect" "detach" * noun -> Untie; Verb "release" * noun -> Drop; Verb "kick" * noun -> Attack; Verb "knock" * noun -> Knock * "on" noun -> Knock; Verb "let" * "go" -> Leggo * "go" "of" noun -> Drop; Verb "help" * -> Help; Verb "hint" * -> Hint; Verb "catch" = "take"; Verb "fling" "toss" "hurl" "lob" "cast" "pitch" "heave" "launch" "propel" = "throw"; Verb "shake" * noun -> Shake; Verb "spray" * noun -> Spray * noun "at" noun -> Spray * noun "with" noun -> SprayWith; !Verb "search" ! * noun -> SearchSub; Verb "plugh" "xyzzy" * -> MagicWord; Verb "dude" "bro" "duder" "bud" * -> Dude; Verb "suck" "lame" * -> Suck; Verb "rule" * -> Rule; Verb "penis" "breast" * -> Anatomy; !Extend "read" replace ! * noun -> Read; Extend "attack" replace * noun -> Attack * noun "with" held -> Attack; Extend "cut" replace * noun "with" noun -> Cut; Extend "jump" replace * -> Jump * "over" noun -> JumpOver * "out" noun -> Enter * "out" "of" noun -> Enter * "off" -> JumpOff * "off" noun -> JumpOff * "off" "of" noun -> JumpOff * "in" noun -> Enter * "into" noun -> Enter * "through" noun -> Enter; Extend "swing" replace * -> Swing * "on" noun -> Swing; Extend only "throw" replace * held -> Throw * held "at" noun -> ThrowAt * held "against" noun -> ThrowAt * held noun -> ThrowDir; Extend "eat" replace * noun -> Eat; Extend "give" replace * creature noun -> GiveR * noun "to" creature -> Give * "over" noun "to" creature -> Give; Extend only "pay" replace * held 'to' creature -> Give * creature held -> Give reverse * 'over' held 'to' creature -> Give * "for" noun -> Buy; Extend only "fuck" replace * -> Strong * creature -> Screw; [ Initialise; location = BehindCounter; player.description = "You look blond and studly, if you do say so yourself. Your tan's kinda faded, though. Remember, just another month till summer."; StartDaemon (Atmosphere); print "^^Life sucks. Today has been just another crummy day in another dismal spring which you've spent delivering pizzas. This afternoon has totally been dragging, except for that bit of excitement an hour ago when you broke the soda machine. You thought your boss was going to rip you a new orifice.^^ Anyway, you've just finished mopping up behind the counter. There's only one more hour left on your shift and you're anxious to get out of here. Go home, watch the tube, blast some tunes, maybe scan the new ~Surfers Monthly~ magazine... gonna be a nice relaxing evening.^^Shyeah, right. That's what YOU think.^^^"; ]; Object Atmosphere "Atmosphere" with state 0, daemon [; if (random (2) == 1 && location has indoors || people in location) { if (location hasnt indoors && Atmosphere hasnt cops && Atmosphere hasnt mob && Atmosphere hasnt riots && Atmosphere hasnt earthquake) { switch (random (6)) { 1: "^You see a woman hail a taxi and drive off."; 2: "^Two men bump into each other. They murmur apologies and go their separate ways."; 3: "^A man and a woman walk by holding hands. They make a cute couple."; 4: "^Two teenaged girls go by carrying shopping bags."; 5: "^A guy in a business suit walks past you."; 6: "^A big ugly low rider cruises by, blaring rap music loud enough to make the sidewalk shake."; } } else { if (Atmosphere has mob && location hasnt indoors) switch (random (5)) { 1: print "^Some guy in a dark suit with a very obvious bulge in the pocket walks by. You turn your face, trying not to be recognized.^"; } if (Atmosphere has cops && location hasnt indoors) switch (random (5)) { 1: print "^A police car drives by. You press yourself against a wall until it goes by.^"; 2: if (Atmosphere has riots) print "^You hear somebody yell ~Hold it right there!!!~ Seeing a uniformed police officer, you panic for a moment... then breathe a sigh of relief as he rushes past you and arrests a rioter.^"; } if (Atmosphere has riots && random (3) == 1) switch (location) { NearParlor: print "^Yelling wildly, several rioters rush out of Mr. Tasty's Pizza Parlor carrying a big pepperoni. You think about stopping them, but then decide you value your life more than this job.^"; Downtown: print "^A rioter throws a rock at the mayor's window. The rock bounces to the ground, barely missing you. Those windows are pretty durable.^"; NearStore: print "^Someone rushes out of Barkley's carrying a TV set.^"; } if (Atmosphere has earthquake && random (2) == 1) { if (location has indoors) { print "^The building you are in shakes ominously under the force of the earthquake. You lean up against a wall until it subsides.^"; if (fronds in location) print "^The fronds wave at you in unison.^"; } else { switch (random (2)) { 1: print "^The ground trembles under your feet. It feels like an earthquake might be in progress.^"; 2: print "^You lurch for a moment as the ground makes loud rumbling noises. Sounds like an earthquake is about to hit. A bad one.^"; } } } } } ]; Object QuestionAsked "You asked a question?" with daemon [; if (onemove == 0) onemove = 1; else { question = 0; StopDaemon (self); } ]; !***************************************** ! THE PIZZA PARLOR !***************************************** Object BehindCounter "Behind the Counter" has light indoors, with name "behind" "counter" "tasty^s" "tasty" "tastys" "pizza" "parlor", description [; if (self hasnt general) { give self general; print "You are behind the counter at ~Mr. Tasty's Pizza Parlor~, where you are currently working. Not much of a job, but it keeps you from going broke during the nine months of the year when you can't pull down the bucks as surfing instructor. The rest of the parlor is southwest.^^ There is something pressing that you think you have to do, but you can't think what it might be."; print "^"; rtrue; } "You are behind the counter at ~Mr. Tasty's Pizza Parlor~. To the southwest is the rest of the restaurant."; ], before [; Go: if (noun == sw_obj) { print "You walk around to the front of the pizza parlor.^"; } ], sw_to PizzaParlor, out_to PizzaParlor, cant_go "The front of the pizza parlor is southwest."; Object PizzaParlor "Pizza Parlor" has light indoors, with name "mr" "tasty^s" "tasty" "tastys" "pizza" "parlor", description [; print "You are standing in the middle of ~Mr. Tasty's Pizza Parlor~. The counter separating you from the back of the parlor stretches in front of you on the northeast corner of the room. To the south is an exit to the street."; if (counter hasnt general && self has general) "^^Annoyingly, you can't shake this feeling that you're forgetting to do something important. Your glance strays idly towards the counter in the middle of the room..."; give self general; print "^"; rtrue; ], before [; Go: switch (noun) { ne_obj: print "You walk behind the counter.^"; s_obj: if ((IndirectlyContains (self, bomb) == 1 || IndirectlyContains (BehindCounter, bomb) == 1) && (IndirectlyContains (player, bomb) == 0)) { deadflag = TOAST; print "As you step towards the door, there is a massive explosion. It seems to have come from "; if (bomb in smpizzabox) { print "the pizza box"; if (smpizzabox in counter) print " that was lying on the counter."; else print " that you left behind."; } else { print "the bomb which you so carelessly left behind. I guess there's a proximity trigger on that thing."; } "^^Too bad. It looks like exposing crime doesn't pay."; } } ], ne_to BehindCounter, in_to BehindCounter, s_to NearParlor, out_to NearParlor, cant_go "You could walk behind the counter to the northeast, or exit to the south."; Object counter "counter" has scenery supporter static, with name "counter", found_in PizzaParlor BehindCounter, description [; print "It's a majorly boring counter which you're unfortunately very familiar with."; if (self hasnt general) { ; print " Hey, maybe that handwritten note lying next to a pizza box on the counter is related to whatever it is you're supposed to be doing now."; } print "^"; rtrue; ]; Object Note "handwritten note" counter has scenery, ! Note: the pizza box and note are initially scenery because we ! don't want the player to notice them until he/she looks at the ! counter. with name "handwritten" "note" "paper", description !"It's in the boss's handwriting.", [; ; OneMove = 0; startdaemon (QuestionAsked); question = READNOTE; "The note reads:^^~Stanley,^ Don't forget to make your delivery to Mr. Calzone, located at the San Doppleton Courthouse. You're already on thin ice, kid. One more screwup and you can expect to be looking for a new job.~^^The note is signed with the initials ~RT~. The paper is official ~Mr. Tasty's~ stationery with the name Bob ~Tasty~ Tasker and lots of balloons and smiley faces all over the border. Isn't that cute?"; ], before [; default: if (counter hasnt general) ; ]; Object lpizzabox "large pizza box" counter has container scenery, with name "box", adname 'large' 'pizza', with parse_name [ i f str; f = 0; str = NextWord (); while (str == 'large' or 'pizza' or 'box') { i ++; if (str == 'box') { f = 1; } str = NextWord (); } if (f == 0 && TestScope(pizza,player) == 1) return 0; return i; ], description "It's a large, flat, greasy cardboard box. Hastily scrawled on the outside is the word ~Calzone~. Which is weird, because it's clearly a pizza.", capacity 1, before [; Open: ; if (self has open) "It's already open!"; give self open; print "You flip open the pizza box"; if (pizza in self) ", revealing a large pizza."; "."; Close: if (self hasnt open) "They don't get more closed than this."; give self ~open; "You close the pizza box."; Locate: give self ~scenery; give note ~scenery; give counter general; Eat: "The grease on the box is tempting, but experience shows that cardboard is indigestible."; default: if (counter hasnt general) ; ]; Object pizza "large pizza" lpizzabox has edible, with name "pizza" "pie" "pepperoni" "mushroom" "large" "cheese", description "Oil oozes over the cheese, coursing between salt-laden slices of pepperoni and soggy mushrooms. Mmm, your favorite! Besides, you forgot to have one for breakfast.", before [; Eat: if (self hasnt tried_eating) { give self tried_eating; "You'd be out of a job in no time for eating a customer's pizza. In the interest of letting you scrape out a living, I'll assume that you changed your mind before it was too late."; } if (OneMove == 1 && question == EATPIZZA && metalfile in self) <>; if (metalfile in self) { OneMove = 0; startdaemon (QuestionAsked); question = EATPIZZA; "My, aren't you persistent. You don't REALLY want to jeopardize your career (lame and pathetic though it is) just to satisfy some momentary hunger pangs, do you?"; } "Your startling discovery has driven all thoughts of food right out of your mind."; Search: if (metalfile in pizza) { give self tried_eating; move metalfile to player; score = score + 2; "Digging through layers of cheese, you discover and confiscate a metal file."; } "You don't find anything new."; Take: "Yeah, good idea. Why don't you just take the whole pizza out of the box and carry it around in your hands and see how big a mess you can make. NOT."; Give, Drop: noun = lpizzabox; rfalse; ]; Object metalfile "metal file" pizza with name "metal" "file", description [; print "It's a long, hard metal file, the kind that you see in prison escape movies all the time."; if (self hasnt general) { give self general; " You know what I mean... the wife bakes a cake for the prisoner, there's a file in the cake, and the guy saws the bars and escapes. Looking at this file, you can't help thinking to yourself: ~Hiding a file in a PIZZA, for gosh sakes? How cheesy can you get?~"; } print "^"; rtrue; ], before [; locate: score = score + 2; move self to player; "Okay, fine. You grab a slice of pizza and take a big bite out of it.^^OUCH! Your teeth clamp down on something hard and metallic. You drop the slice and look under a layer of cheese. Inside you discover a metal file, which you take."; ]; !********************************** ! THE STREET !********************************** Object NearParlor "Street, by Pizza Parlor" has light, with name "street" "san" "doppleton" "main" "drag", description [; if (self hasnt general) { give self general; print "San Doppleton is where you live, work and play -- at least until summer. It has the typical California culture; which is to say, none. But at least it's just forty minutes' drive from Santa Barbara and the beach, so you can't complain much.^^"; } "You stand in the heart of San Doppleton's main drag, the business district. The street goes east and west. The sidewalk runs by a pizza parlor, with a sewer vent nearby."; ], before [; go: if (IndirectlyContains (self, bomb) == 1) { deadflag = TOAST; "As you start to walk away, the bomb explodes!"; } ], n_to PizzaParlor, in_to PizzaParlor, w_to NearCourthouse, e_to NearStore, d_to [; print "(climbing into the sewer)^^"; <>;], cant_go "The street runs east and west here, or you could return to the pizza parlor to the north."; Object Sewer "sewer" NearParlor has scenery static open container, with name "sewer" "drain" "pipe" "vent" "duct", description "By the sidewalk you can see a small sewage outlet.", before [; Enter: OneMove = 0; startdaemon (QuestionAsked); question = ENTERSEWER; "What do you think you are, a Ninja Turtle?"; Receive: if (bomb in noun) { score = score + 5; remove noun; StopDaemon (bomb); give Atmosphere earthquake; print_ret "Thinking fast, you deposit ", (the) noun, " containing the bomb into the sewer duct. Moments later, you breathe a sigh of relief as you hear a quiet splash. No doubt you've saved yourself and the city from certain destruction.^^ An absolutely massive explosion rocks the ground beneath your feet. Buildings tremble all around you and the pavement lurches sickeningly. After a moment the shockwaves die down, but you still feel an occasional tremor. Seems like you might have triggered some sort of geological disaster."; } remove noun; print_ret "You toss ", (the) noun, " into the sewer duct, where it is washed away and lost forever. Bet you feel pretty stupid now."; ]; Object ParlorExt "pizza parlor" NearParlor has scenery static, with name "pizza" "parlor", description "That's where you work."; Object People "people" has animate scenery, with name "people" "person" "man" "woman" "folks" "humans" "human" "guy" "low" "rider", found_in NearParlor NearStore Downtown, article "some", description [; switch (random (3)) { 1: "They're the people that you meet, when you're walking down the street, each day. They're completely uninteresting."; 2: "They're just those normal, nameless dudes and chicks that you meet every day, here in the city. Nothing noteworthy."; 3: "Normal passersby, the kind you see all the time and usually ignore. You can't think of any reason to change that habit now."; } ]; Object NearStore "Street, by Department Store" has light, with name "street" "by" "department" "store", description "On this end of the street, a department store called Barkley's sits to the south.", w_to NearParlor, e_to [; if (Atmosphere has cops) "You see a cop standing there and decide not to risk it."; if (jill in courthouse) { if (counter hasnt general) "Approaching the edge of town, you suddenly shy away. You're SURE there was something you were supposed to do before going home today. What was it again?..."; "You shouldn't leaving town until you deliver that pizza. It would cost you your job, and we all know how important THAT is to you."; } "The Federal Association of Text Adventures Nuts, Syndicated (FAT ANT) has advised me to issue the following warning. The author would be going in direct violation of the official Nelson Treaty of 1994 to prevent you from leaving town without offering (a) a tangible obstacle to inhibit your progress, or (b) an excellent psychological reason why your character may not go in that direction. Well, technically you are on a mission from the District Attorney. But that doesn't seem to be a good enough reason, since you're a paranoid little guy and you'd rather go home anyway. Besides, this is a very short game by design and I JUST DON'T HAVE THE TIME to make up sensible rationales for you, other than that there's no game that way and if you left then I'd have to give you a ~game over~ message, which is clearly impolite.^^ So here's your reason. Gigantic, rabid gerbils are blocking your way out of town. And you can't go that way."; ], s_to ClothingDept, in_to ClothingDept, cant_go "The street runs back west, and Barkley's is to the south."; Object StoreExt "department store" NearStore has scenery static, with name "department" "store" "barkley" "barkleys" "barkley^s", description "Why, it's Barkley's department store! Now serving you at 623 convenient California locations!", Before [; Examine: default: "Why don't you just go inside instead of fooling around with it?"; ]; Object ClothingDept "Clothing Department" has light indoors, with name "clothing" "department" "store", description "You are in the clothing department at Barkley's. There are many racks of clothes here. You may exit to the north. To the southwest lies the hardware department, and southeast is the cosmetics department.", before [; Go: if (noun == n_obj) { if (IndirectlyContains (player, hairspray) == 1) { if (clerk in self) { if (self has general) "You can't leave! You didn't buy the hairspray!"; give self general; OneMove = 0; startdaemon (QuestionAsked); question = SHOPLIFTING; "If you leave the store with the hairspray, that would be shoplifting. You don't want to start a life of crime, do you?"; } if (clerk hasnt general) { give clerk general; print "The clerk seems to have been knocked out and dragged somewhere by the thug on his entrance. You brazenly walk out with your shoplifted item.^"; } } else { if ((IndirectlyContains (player, rope) == 1 || IndirectlyContains (player, axe) == 1) && self hasnt general) { print "The clerk seems to have run away in the confusion of the riots. You brazenly walk out with your shoplifted stuff.^"; give self general; } } } ], n_to NearStore, out_to NearStore, sw_to HardwareDept, se_to CosmeticsDept, cant_go "You can go deeper into the store southwest or southeast. The street lies north."; Object -> Clerk "store clerk" has animate, with name "store" "clerk", description "He is dressed in a weedy little clerk outfit.", life [; default: "The clerk doesn't want anything to do with you unless you are buying something."; ]; Object -> clothes "bunch of clothes" has static scenery, with name "bunch" "of" "clothes" "clothing" "rack" "racks", description [; "Racks of clothing line the walls."; ], before [; examine: default: "You compare the blouses and tights for a while, satisfying your secret desire to cross dress. But the prices make you gag."; ]; Object HardwareDept "Hardware Department" has light indoors, with name "hardware" "department" "store", description "You are in the hardware department at Barkley's. There are tools all over the place. You can go northeast to the clothing department, or east to the cosmetics department.", ne_to ClothingDept, e_to CosmeticsDept, cant_go "Northeast to the clothing department, or east to the cosmetics department."; Object -> hardware "hardware" has static scenery, with name "hardware" "tools", description "Just looking at it all makes your testosterone level rise, and you feel the need to give something more power.", before [; examine: default: "This ain't Home Improvement. Besides, you're broke."; ]; Object CosmeticsDept "Cosmetics Department" has light indoors, with name "department" "store", description [; print "The shelves are lined with bottles of perfume, cologne, hairspray, and other cosmetic paraphernalia. "; if (self hasnt general) { give self general; print "[You know, an adventure game just isn't complete if it doesn't use the word ~paraphernalia.~] "; } "You can go northwest to the clothing department, or west to the hardware department."; ], before [; Go: if (thug in self && (noun == w_obj || noun == nw_obj)) { switch (thug.state) { 11: "As you start to steps away the thug, not entirely incapacitated, trips you up.^"; ! remove thug; ! StopDaemon (thug); ! print "Taking advantage of the thug's helpless condition, ! you rush at him and knock him over. You make your ! escape, leaving him sprawled on the floor.^"; 14: remove thug; StopDaemon (thug); print "Doubled over in pain, the thug is powerless to stop your retreat.^"; default: "The thug stops you!"; } } ], after [; Go: if (thug in self) { StartDaemon (thug); remove clerk; print "^As you enter the cosmetics department, a big thug steps out of the shadows. Making a mocking bow in your direction, the thug says: ~Greetings. I am Sammy 'The Inhospitable' Toriglioni, and I will be joining you for your dying pleasure this afternoon.~ He pulls a gun out of his suit coat and bounces it lightly in one hand.^"; } ], nw_to ClothingDept, w_to HardwareDept, cant_go "Northwest to the clothing department, or west to the hardware department."; Object -> cosmo "bunch of cosmetic stuff" has static scenery, with name "bunch" "cosmetic" "cosmetics" "stuff" "paraphernalia" "bottles" "perfume" "cologne", description [; print "You can't afford all these cosmetics and stuff"; if (hairspray has scenery) "... although you could use some hairspray."; "."; ], before [; examine: default: print "Don't bother. "; <>; ]; Object -> hairspray "bottle of hairspray" has scenery, with name "bottle" "hairspray" "hair" "spray", description [; "It's plastic, it's purple, it's cylindrical, and you can use it to spray things. Like hair, for example. That's where the name comes from."; ], before [; Examine: if (self has scenery && location == CosmeticsDept) <>; Smell: "It has kind of a rancid fruity smell. What were you expecting?"; Spray: switch (second) { nothing: "You wave the hairspray around at random. The air now has kind of a rancid fruity odor, which clears away after a few seconds."; thug: if (thug.state >= 10) "You do not blind him further, since his eyes are already squinched shut in pain."; score = score + 5; thug.state = 10; StartDaemon (thug); give Atmosphere mob; "You spritz the thug right in the face. He is so totally surprised to have you actually fight back that he takes the shot right in the eyes and winces, momentarily unabled to fight back. He's not down yet, but this might be a good time to finish him off."; mafia: "That worked on ONE guy at point blank range. It's not going to work on all these guys. Even if you managed to spray one of them, the rest would destroy you before you had a chance to move."; boss: <>; default: if (second == player) { if (self has general) "You've got a lot of things to worry about today that are worse than your hair problems."; give self general; "That really hit the spot! Now your hair matches the tan you'd like to have."; } if (second has animate) print_ret (The) second, "'s hair looks fine."; print_ret "You apply a little hairspray. You're sure ", (the) second, " won't have a bad hair day now!"; } Squeeze: <>; Buy: "You don't have any money, dude. This has something to do with your lame job."; Take: give self ~scenery; ]; Object thug "thug" has animate, with name "sammy" "inhospitable" "toriglioni" "thug" "crook" "mob" "mafia", state 0, description [; switch (self.state) { 11: "He's big and mean. At the moment he's rubbing his eyes and bellowing angrily."; 14: "He's big, mean, and lying on the floor gasping for breath."; default: "He's big and mean. He prevents you from exiting."; } ], life [; Attack: switch (self.state) { 11: self.state = 13; "You give him a kick to the stomach, and a passable imitation of a karate chop on the back. Normally this wouldn't have worked, but since he was temporarily blinded, he never saw you coming. He collapses on the floor, momentarily winded. This would be a great time for you to get out."; 14: "You move in for another attack."; default: if (second == nothing) { deadflag = TOAST; "You make a fist and lunge at the thug. He sees you coming from a mile away. Though clearly astonished that you have chosen to interrupt the obligatory bad guy soliloquy, he doesn't mind stopping long enough to shoot you."; } } ! if (second == hairspray) ! <>; Ask: switch (second) { 'mafia', 'mob': "~We're going to get you now. You'll be sorry you ever tried to cross us.~"; 'guido', 'armadillo', 'calzone': "~He's da boss.~"; 'jill', 'district', 'attorney', 'da': "~What a bitch.~"; 'me', 'stan', 'stanley': "~I'm gonna kick your ass.~"; 'him', 'himself', 'thug', 'sammy': "~I'm the guy that was sent ta kill ya.~"; default: "The thug ignores you and continues his ranting."; } Tell: "He really doesn't care."; ], daemon [; self.state = self.state + 1; switch (self.state) { 2: print "^~SO, ya wanted to be a hero, kid? I'd say your future as the Lone Ranger isn't looking too promising.~^"; 3: "^The thug says, ~Don't get me wrong. We were greatly impressed with your style in totally screwing up all our plans for Guido's escape and the biggest crime wave this city has ever seen. It's just that we really couldn't respect ourselves if we let you live.~^"; 4, 6: print "^The thug tosses his gun from hand to hand. He has an easy, casual air about him, knowing that you're trapped and savoring the suspense.^"; 5, 7: print "^The thug postures and generally acts menacing. He's obviously overconfident and just dragging out the moment of execution.^"; 8: deadflag = TOAST; print "^The thug is tired of talking. The newspaper will report the next day that you accidentally shot yourself five times in the head and seven times in the chest.^"; 12: deadflag = TOAST; "Not to be stopped by a little thing like hairspray, the thug straightens and blasts you in both kneecaps."; 15: deadflag = TOAST; "The thug gets up and kicks your ass."; default: } ]; Object smpizzabox "small pizza box" has container, with name "small" "box" "pizza", description [; if (bomb in self) { StartDaemon (bomb); if (self has open) "OH MY GOD!! THERE'S A BOMB IN THIS PIZZA BOX!! DO SOMETHING, QUICK!!!!!"; "The pizza box seems to be ticking. Hmm, interesting. You didn't know these things had any mechanical parts."; } "Now that the bomb is gone, the pizza box can be used once again to actually hold pizzas."; ], capacity 1, before [; Open: if (self has open) "It's already open!"; give self open; print "You flip open the pizza box"; if (bomb in self) { StartDaemon (bomb); "... AND THERE'S A BOMB INSIDE!!!!!"; } "."; Close: if (self hasnt open) "They don't get more closed than this."; give self ~open; if (bomb in self) "You close the box. You hope maybe if you can't see the bomb, it won't hurt you."; "You close the pizza box."; Throw: if (bomb in self) { deadflag = TOAST; if (self has open) "The box flops around crazily and the bomb falls out right next to you. Maybe this is a good time to contemplate how aerodynamic a big flat hunk of cardboard can be. Then again, maybe there isn't much time to contemplate anyth^^KABOOM!!!!!"; "Without even looking in the box, you fling it as hard as you can. It flies open and a bomb falls out, exploding on impact with the ground."; } default: if (bomb in self) { StartDaemon (bomb); } ]; Object NearCourthouse "Street, Near Courthouse" has light, with name "street" "near" "courthouse", description "You are approaching the center of downtown San Doppleton. There is a courthouse to the south. The street runs east and west.", before [; Go: if (noun == s_obj && Courthouse.state < 10) StartDaemon (Courthouse); ], e_to NearParlor, w_to Downtown, s_to Courthouse, in_to Courthouse; Object Downtown "Downtown" has light, with name "street" "downtown", description "You are in downtown San Doppleton. The street coming from the east ends at a three-story office building to the west.", before [; Go: if (noun == w_obj) { } ], e_to NearCourthouse, w_to OfficeBuilding, in_to OfficeBuilding, cant_go "The street runs east from here, and ends at an office building on the west side."; Nearby gun "gun" has scenery, with name "gun", found_in mafia thug lackey, description "The gun is pointed right at you!", before [; Take: "You'd have to wrestle it away from its owner first... and trust me, you'd lose."; ]; Object guard "security guard" has animate, with name "security" "guard", description "He stands in front of the government building with his arms folded.", describe [; "^A security guard stands in front of the entrance to the government building, looking bored."; ], React_Before [; Go: if (noun == w_obj) { if (guard has general) print "The guard steps aside and lets you pass.^"; else "The security guard stands in your way. ~Sorry,~ he says. ~I can't let anybody in without a badge, unless they're on official business.~"; } ], Before [; PizzaTo: if (self has general) "~Yeah, yeah, official business, pizza delivery to Jill Thompson, I know. So go on up there already.~"; score = score + 3; give self general; "The guard looks suspicious as you explain that you have a pizza delivery for Jill Thompson, the District Attorney. Pulling a cellular phone off of his uniform, he dials a number that you presume is for Jill's office. After a few moments, he hangs up and grudgingly steps aside for you."; ], Life [; Ask, Tell: switch (second) { 'security', 'guard', 'himself', 'self', 'office', 'building': "~We've had to step up security around here. Apparently some punk broke into the mayor's office earlier today, and with the riots going on, the mayor needs to be as closely guarded as possible.~"; 'me', 'stan', 'stanley', 'stanly': "~I can't let you in unless you can convince me that you've got some kind of official business up there.~"; 'small', 'pizza', 'box': "~Looks like a pizza box. What about it?~"; default: "~I can't tell you anything about that.~"; } Show, Give: switch (noun) { lpizzabox: if (courthouse.state < 10) "Um, okay. That's an interesting idea, but if you lose your pizza now then you won't be able to make your delivery and you'll get in all kinds of trouble. Better not."; <>; smpizzabox: if (smpizzabox has open) "You'd never fool the guard into thinking that you were making a pizza delivery with an empty box. At least not while it's OPEN!"; <>; } ]; !************************************* ! THE COURTHOUSE SCENE !************************************* Object Courthouse "Courthouse" has light indoors, with state 0, name "courthouse" "court" "house", description [; if (courthouse.state < 10) print "You are in a crowded courthouse."; else print "You are in a deserted courthouse."; " The street is off to the north."; ], daemon [; Courthouse.state = Courthouse.state + 1; switch (Courthouse.state) { 1: print_ret "^The courtroom is currently abuzz with excitement as it seems that the pre-trial hearing of the infamous gangster, Guido ~The Armadillo~ Calzone is winding to a close. Guido and his hotshot lawyer sit placidly at their table, while the flustered young district attorney who is prosecuting the case seems like she's at her wits' end. At the moment, the D.A. stands at the front of the courtroom, arguing over a legal point with the judge."; 2: print_ret "^~Miss Thompson,~ says the judge, ~I've had about enough of you wasting this court's time. Unless you can demonstrate a clear threat to public safety, I'm going to recommend that Mr. Calzone be transported to a minimum security prison pending further review. His trial is to be held next week.~ ", (The) jill, " is clearly not happy with this pronouncement."; 3: print_ret "^~Your honor, I wish you would reconsider,~ says ", (the) jill, ". ~The defendant has a long history of disappearances, and it is counsel's opinion that he will not be around in a week to stand trial. I recommend transporting him to a more secure prison.~"; 4: print_ret "^~Your opinion is duly noted, Miss Thompson,~ says the judge sarcastically. ~But the fact is, the 'long history' you refer to is based on hearsay. Now, I recommend you gather some solid evidence when you prepare for the trial, because the minimal research you've obviously done won't be enough to convict the defendant.~"; 5: print_ret "^", (The) jill, " tries desperately to convince the judge that Guido ~The Armadillo~ Calzone plans to escape, but it's obvious she won't get anywhere without more evidence."; 6: Courthouse.state = 4; print_ret "^", (The) jill, " tries hopelessly to plead her case."; 7, 8, 9, 10: StopDaemon (Courthouse); } ], before [; Go: if (noun == n_obj) { StopDaemon (Courthouse); if (jill in Downtown && jill hasnt general) { give jill general; give jill ~scenery; move jill to LawOffice; move smpizzabox to counter; remove mayor; give OfficeDoor ~locked; give OfficeDoor open; print (The) jill, " is here.^^", (The) jill, " approaches and shakes your hand warmly. ~That was a brilliant work in there, kid. If it hadn't been for you, Guido might have escaped from jail.~ Seeing your blank look, she says, ~My name Jill Thompson. I'm San Doppleton's District Attorney. For the past four years, I've been pursuing this local mafia branch, trying to bring some serious legal action down on them. These guys seem to own everything in town, and they already know me by sight. So I can't find any more clues before the trial but you can. Please try dig up whatever information you can, I'll be up in my office if you need me. I work at Gunther & Associates. It's on the third floor of that tall building over there, you can't miss it.~^^ Jill walks away to the west.^"; } } ], n_to NearCourthouse, cant_go "You can only go north."; Object bomb "bomb" smpizzabox with state 0, name "bomb" "tnt", description "Looks like you really made somebody mad when you ratted on Guido ~The Armadillo~ Calzone. For a moment you contemplate revising your good samaritan complex.", daemon [; if (bomb.state == 10) { deadflag = TOAST; "^The bomb explodes!"; } bomb.state = bomb.state + 1; ], before [; Insert: if (second == sewer) { score = score + 5; remove self; StopDaemon (self); give Atmosphere earthquake; "Thinking fast, you deposit the bomb in the sewer duct. Moments later, you breathe a sigh of relief as you hear a quiet splash. No doubt you've saved yourself and the city from certain destruction.^^ An absolutely massive explosion rocks the ground beneath your feet. Buildings tremble all around you and the pavement lurches sickeningly. After a moment the shockwaves die down, but you still feel an occasional tremor. Seems like you might have triggered some sort of geological disaster."; } ]; Object jill "district attorney" Courthouse has female animate scenery, with name "jill" "woman" "lady" "chick" "babe" "lawyer" "district" "attorney" "da" "barrister", short_name [; if (self has proper) { print "Jill"; } else { print "district attorney"; } rtrue; ], description [; if (self has general) "For a lawyer, Jill strikes you as being a serious babe. She's in her mid-thirties, dressed in a power outfit and sporting a serious no-nonsense look that tells you she's going to go places in her career."; give self proper; "You've never been up to date on local politics, but you can see that the DA is an attractive brunette in her mid-thirties. Why, that would make her only, uh... ten years old than you!^^The more you look at her, the more you think she's a total babe! You bet she could totally go for a guy like you! After all, she's a brilliant, successful career-oriented woman with a promising future ahead of her, and you're... you're a college dropout pizza delivery boy.^^Never mind."; ], describe [; if (self has general) "^Jill stands here."; "^The district attorney stands in the middle of the courtroom, looking flustered."; ], orders [; Go: "~I'm happy right where I am. Unless you got something important to tell me, I advise you to stop wasting my time.~"; ! if (ZRegion(parent (self).(noun.door_dir)) == 1) ! ! She can move in the requested direction with no obstruction ! { ! move self to parent(self).(noun.door_dir); ! print_ret "Jill strolls off to the ", (DirectionName) noun.door_dir, "."; ! } ! "Jill glowers and says, ~There is no exit there, you ignoramus.~"; Take: if (TestScope (noun, jill) == 0) { "~I don't see that here.~"; } else { ! move noun to jill; ! print_ret "Jill picks up ", (the) noun, "."; "~I don't want it, thanks.~"; } Give: if (noun notin jill) { "~I don't have it!~"; } if (second ~= player) { "~But I need it!~"; } move noun to player; "Jill hands it over."; default: "Jill doesn't want to."; ], life [; Answer: "Jill didn't ask you anything."; Ask: if (location == Courthouse) "~Please don't interrupt, I'm giving testimony.~"; switch(second) { 'jill', 'herself', 'woman': "~Me? I've been the DA for two years.~"; 'mob', 'mafia', 'gangsters': "~I suspect that something very serious is going down involving the local mafia branch. It's up to you to investigate.~"; 'file': if (secretfile notin filecabinet) "You'll have to specify whether you mean the metal file that Guido planned to escape with, or the secret file you uncovered in the mayor's office."; <>; 'metal', 'file': "~Thanks for preventing Guido's escape.~"; 'secret', 'file': if (secretfile in jill) "~That secret file you dug up has sure been helpful.~"; "~It would be nice if we could dig up some incriminating information about the mayor.~"; 'me', 'self', 'myself', 'stan', 'stanly', 'stanley': "~I really appreciate all your help.~"; 'people': "~They're the citizens of San Doppleton. You don't get out much, do you?~"; 'pizza': if (lpizzabox in player) "~I didn't order it. Maybe the defendant did."; "~What pizza?~"; 'security', 'guard': if (secretfile in self) "~Good work getting past that guard, Stan. That was very creative.~"; "~I can't get past him. I hope you can.~"; 'bomb': if (atmosphere has earthquake) "~Sounds like somebody's out to get you. What I don't understand is, who could have planted that bomb in the pizza box?~"; 'boss', 'robert', 'tasty', 'tasker': "~You know your boss better than I do.~"; 'mayor', 'john', 'winnick': print "~I've always been sure that creep has connections to the mafia. "; if (secretfile in jill) "Thanks to you, now I can finally prove it!~"; "I only wish I could find a way to prove it...~"; } "~Sorry, I can't tell you anything about that.~"; Tell: "Like Jill would care."; kiss: "She dodges. Apparently Jill doesn't find you as cute as you find yourself."; attack: print_ret "Faster than the eye can follow, ", (the) jill, " opens her briefcase, pulls out a can of mace, blasts you with it, and puts it away. After a moment, the pain subsides."; ThrowAt: move noun to location; <>; Show, Give: switch (noun) { metalfile: score = score + 5; remove metalfile; remove guido; remove judge; remove defense; Courthouse.state = 10; move jill to Downtown; move thug to CosmeticsDept; give OfficeDoor ~locked; give OfficeDoor open; print (The) jill, " looks astonished when you tell her where you found the file. She marches smartly up to the stand and shows this new evidence to the judge, who can't argue with her logic. He orders Guido into a maximum security prison pending further review.^^ As the courtroom clears out, the bailiff drags Guido past you. With intense calm, Guido looks you right in the eye and says, ~That was a mistake, my friend. It don't pay to mess with The Family."; if (lpizzabox in player) { print "^^~I believe THIS belongs to me,~ he adds, ungraciously snatching the pizza box from your hands on the way out.^"; } else { if (lpizzabox in location) print "^^~I believe THIS belongs to me,~ he adds, collecting the pizza box from the floor on the way out.^"; else print "~^"; } remove lpizzabox; rtrue; lpizzabox: print_ret (The) jill, " looks annoyed. She says ~I didn't order that!~"; default: "~Please don't just hand me every object you find lying around. This isn't a Sierra game, you know.~"; ! move noun to jill; ! print_ret "Jill takes ", (the) noun, " from you."; } ], before [; Take: "Your effort to sweep Jill off her feet fails pathetically."; ]; Object guido "Guido" Courthouse has animate proper scenery, with name "guido" "armadillo" "calzone" "defendant" "prisoner" "criminal" "crook" "mafia" "mob" "client", description "You recognize the defendant, Guido ~The Armadillo~ Calzone from dozens of newspaper photos which stem from this highly publicized trial. The man looks unusually at ease, considering that he's potentially nine hundred and fifty thousand years in jail for a wide variety of charges. In fact, he has such an air of confidence about him that you'd almost think he was planning to escape or something.", describe [; "^Guido ~The Armadillo~ Calzone sits here, smirking."; ], life [; Answer, Ask, Tell: switch(second) { 'pizza': "Guido grins broadly. ~Yes, I ordered a pizza!~"; 'file': "Guido's glances around shiftily for a moment, then scowls. ~I don't know anything about that,~ he says pointedly."; default: "Guido looks away and smirks. Looks like he doesn't care what you have to say."; } Kiss: "He punches you back."; Attack: deadflag = TOAST; "Guido snaps his fingers and several very large thugs appear out of nowhere to make short work of you.^^Since he did this in full view of the judge, he of course gets sentenced to life plus 25 and never escapes. Not that that's any consolation to you."; ThrowAt: move noun to location; <>; Show, Give: switch (noun) { lpizzabox: move lpizzabox to guido; if (metalfile in pizza) { deadflag = USUCK; "Guido grins shiftily and takes the pizza from you. He hands it to his lawyer so he can eat it later. You walk away, congratulating yourself on a job well done.^^ Several days later, a crime wave hits the city, more enormous and devastating than any you've ever seen. You never figure it out for sure, but you always suspect that it was all your fault."; } move pizza to guido; "Guido grins shiftily and takes the pizza from you. He hands it to his lawyer so he can eat it later. He undoubtedly thinks he's going to use that file to escape. But you'll have the last laugh, since you so cleverly took out the file first."; metalfile: deadflag = USUCK; remove metalfile; "After cleverly taking the file out of the pizza so that Guido would not be able to escape, you now decide it would be an EVEN BETTER idea to give it to him. Maybe you were hoping that he'd make a mistake in front of the court. Nope. Experienced professional that he is, Guido pockets the file in one smooth motion and no one notices a thing.^^ Several days later, Guido's escape is front page news, but most of the newspapers get stolen in the ensuing crime wave anyway."; } "He doesn't want it."; ], before [; Take: "Trying to take on the mob? Forget it. You'll have to wait until a little later in the game."; ]; Object defense "defense attorney" Courthouse has animate scenery, with name "defense" "attorney" "lawyer" "barrister", description "This guy looks just as sleazy as his client.", before [; Examine: Give: switch (noun) { lpizzabox: if (metalfile in pizza) { deadflag = USUCK; remove lpizzabox; "The defense attorney low-fives Guido under the table, muttering, ~Looks like your contact came through.~ You don't understand, but you decide to just walk away, congratulating yourself on a job well done.^^ Several days later, a crime wave hits the city, more enormous and devastating than any you've ever seen. You never figure it out for sure, but you always suspect that it was all your fault."; } ! score = score + 5; "The defense attorney low-fives Guido under the table, muttering, ~Looks like your contact came through.~ You smile privately to yourself. You'll have the last laugh, since you so cleverly took out the file first."; default: "~Don't bother me, I'm busy getting rich by defending big mafia dons.~"; } default: "He just doesn't want to be bothered."; ]; Object judge "judge" Courthouse has animate scenery, with name "judge", description "Stern and imperious.", before [; Examine: default: "It's better if you leave him alone. He's busy, and you don't want to be slapped with contempt of court."; ]; !******************************** ! JILL'S OFFICE BUILDING !******************************** Object OfficeBuilding "Office Building" has light indoors, with name "office" "building", description "You are in an office building. The exit to the street is east. There is also a flight of stairs heading up to the north.", before [; Go: if (noun == n_obj || noun == u_obj) { print "The stairs angle up and back, and you emerge south.^"; } ], n_to SFOffice, u_to SFOffice, e_to Downtown, out_to Downtown; Object -> fronds "pair of fronds" has static, with name "frond" "fronds" "plant" "plants" "fern" "ferns" "pair" "of", initial "There are fronds on either side of the exit on the east.", description "Typical California lobby fronds. They look like good fronds with each other (har, har).", before [; Examine: default: "Unlike you, the fronds are having a peaceful day. Let's keep it that way."; ]; Object SFOffice "Office Building, Second Floor" has light indoors, with name "office" "building" "second" "floor", description "To the east you can see an office door labelled ~Gunther & Associates~; other than that, the office doors on this floor are pretty unremarkable. The stairs go up to the south and down to the north.", before [; Go: if (noun == e_obj && jill in LawOffice && cabinetkey hasnt general) StartDaemon (cabinetkey); if (noun == s_obj || noun == u_obj) { print "The stairs angle up and back, and you emerge north.^"; } if (noun == n_obj || noun == d_obj) { print "The stairs angle down and back, and you emerge south.^"; } ], after [; Go: if (atmosphere has riots && self hasnt general) { give self general; print "Jill runs out of her office. ~Stan! Thank goodness you made it! The mafia has just regrouped in the mayor's office to discuss their final plans for total citywide domination! Reinforcements from the state are on their way, but they're going to need some kind of diversion to get into the building without being caught by the mayor's troops! Can you do that for us?~^^ Of course you can; you're the hero. (A paper-thin excuse if you ever heard one, but you don't seem to have enough excitement in your life anyway.)^^ Jill runs back into her office.^"; } ], s_to TFOffice, u_to TFOffice, n_to OfficeBuilding, d_to OfficeBuilding, e_to LawOffice, cant_go "You try a few of the office doors, but they're locked and there is no response to your knocking."; Nearby DullDoors "door" has static scenery, with name "office" "offices" "doors" "door", ! found_in SFOffice, TFOffice, before [; Open: "The doors on this floor are all locked, and trust me, they're going to stay that way."; default: "You have no business in any of these offices."; ]; Object TFOffice "Office Building, Third Floor" has light indoors, with name "office" "building" "third" "floor", description "To the east is a door labelled ~John Winnick, Mayor of San Doppleton~. The stairs go up to the north and down to the south.", before [; Go: if (noun == n_obj || noun == u_obj) { print "The stairs angle up and back, and you emerge south.^"; } if (noun == s_obj || noun == d_obj) { print "The stairs angle down and back, and you emerge north.^"; } ], n_to Roof, u_to Roof, s_to SFOffice, d_to SFOffice, e_to OfficeDoor, cant_go "You try a few of the office doors, but they're locked and there is no response to your knocking."; Object LawOffice "Law Office" has light indoors, with name "law" "office", description "You are in a bustling law office. The east wall is dominated by a large window.", w_to SFOffice, cant_go "You can only go west, back to the hall."; Object jillswindow "window" LawOffice has static scenery, with name "window" "north", description "Through the closed window, you see a pretty unremarkable spectacular view of downtown San Doppleton.", before [; open: if (jill in location) "Jill stops you. ~Sorry,~ she says, ~but it gets kind of drafty up here in the afternoons.~"; else "A lawyer stops you. ~Sorry,~ he says, ~but it gets kind of drafty up here in the afternoons."; ]; !**************************************** ! THE MAYOR'S OFFICE BUILDING !**************************************** Object GovtBuilding "Government Building" has light indoors, with name "government" "building" "office", description "You are in a high-rise government building. You can go southeast to the street or up some stairs to the west.", before [; Go: if (noun == n_obj || noun == u_obj) { print "The stairs angle up and back and you emerge south.^"; } ], se_to Downtown, w_to SFGovt, u_to SFGovt, cant_go "Up the stairs or southeast to the street."; Object SFGovt "Second Floor of Government Building" has light indoors, with name "second" "floor" "government" "building" "office", description "You are on the second floor of the government building. You can go back down the stairs to the west or up some more stairs to the east. To the east is an office.", before [; Go: if (noun == w_obj || noun == d_obj) { print "The stairs angle down and back and you emerge east.^"; } if (noun == e_obj || noun == u_obj) { print "The stairs angle up and back and you emerge west.^"; } ], w_to GovtBuilding, d_to GovtBuilding, e_to TFGovt, u_to TFGovt, n_to LawOffice, in_to LawOffice, cant_go "."; Object TFGovt "Third Floor of Government Building" has light indoors, with name "third" "floor" "government" "building" "office", description [; ], before [; ! Go: ! if (noun == s_obj || noun == d_obj) ! { ! print "The stairs angle down and back and you emerge north.^"; ! } ! if (noun == n_obj || noun == u_obj) ! { ! print "The stairs angle up and back and you emerge south.^"; ! } ! if (noun == e_obj) ! if (OfficeDoor has open && mayor in MayorOffice) ! "You brazenly march into the mayor's office. The ! mayor is there. You apologize for the rude intrusion ! and go back the way you came. He watches suspiciously ! as you go."; ], ! e_to SFGovt, d_to SFGovt, w_to Roof, u_to Roof, e_to OfficeDoor, cant_go "You try a few of the other office doors, but they're locked and there is no response to your knocking."; Nearby OfficeDoor "office door" has door openable lockable locked static scenery, with name "door", description [; print "This door leads to the mayor's office. It is "; if (OfficeDoor has open) print_ret "open."; else { print "closed "; if (OfficeDoor has locked) print_ret "and locked."; else print_ret "but unlocked."; } ], door_to [; if (location==TFOffice) return MayorOffice; return TFOffice; ], door_dir [; if (location==TFOffice) return e_to; return w_to; ], found_in TFOffice MayorOffice; Object MayorOffice "Mayor's Office" has light indoors, with name "government" "building" "office", description "You are in the mayor's office. To the east is a window overlooking a second-story drop. There is a glass box mounted on the north wall.", before [; Go: if (noun == w_obj) { if (mayor in self && lackey in self) "Two big, mean guys are blocking the door."; if (mafia in self) "There's about a bazillion mafia guys and they're all blocking your exit."; } ], after [; ], w_to OfficeDoor, e_to "If you want to jump out the window, you'd better say so. Personally, I think you're crazy.", cant_go "The only exit is west into the hall. That is, unless you count that big window on the other side."; Object officefloor "floor" MayorOffice has scenery static, with state 0, name "floor" "ground" "oak" "gash" "crack", description [; if (self.state < 5) "It's just a solid oak floor. Nothing special."; "It's an oak floor with a great big gash in it."; ], before [; Attack: if (second == nothing) "You beat on the floor with your fists. It doesn't help."; if (second == axe) score = score + 7; deadflag = WON; "Swinging the axe high above your head, you pause for just a minute and look Mr. Tasker in the eye. ~I'll see you all in hell,~ you comment lightly.^^ You bring the axe down with a mighty chop, smack in the middle of the crack in the floor. A gigantic rift opens in the floor. The mafia guys topple and fall right down into the office below. Having seen it coming, you manage to leap onto the window sill, out of harm's way.^^ At the same moment, the door opens with a loud crash. Seven heavily armed police officers barge in, aiming their weapons at you. ~You're under arrest...~ they begin to say.^^ ~No, YOU'RE under arrest,~ says a voice behind them. You grin broadly as you see Jill leaning on the door frame. Backing her up is a great big SWAT team. Using the evidence that you collected for her, Jill was able to get support from the state's higher court and expose the corrupt local government.^^ ~How convenient that your mafia friends just happened to land right in my office,~ says Jill. Looking past her, you see all the dark suited guys being handcuffed and booked by the SWAT team. The team leader adds, ~You're all under arrest for bribery, corruption, public endangerment, impersonating police officers... and, um, extreme stupidity.~^^ ~Take 'em away, boys,~ says Jill.^^ As the police drag Mr. Tasker past you, he says to you, ~I hope you realize... YOU'RE FIRED!~ ~Fine!~ you reply. ~You can take this job and shove it anyway.~ Jill chimes in, ~Especially since you have a brilliant career as a hired investigator ahead of you!~^^ You look at Jill as the dust begins to settle. ~Really?~ you ask. ~How about a future on date with you?~ She smiles and gives you a big kiss. The earth moves for you. Or maybe it's just the quake."; ], Daemon [; self.state = self.state + 1; switch (self.state) { 1: print "^Oh my. You seem to have crashed (pardon the pun) a private party of some sort. There are a couple of dozen guys wearing suits and dark glasses. And sitting imperiously at the mayor's desk, glaring at you behind a bevy of bodyguards, is... your boss, Mr. Tasker!!!^"; 2: print "^Robert ~Tasty~ Tasker speaks. ~Stan, you idiot, can't you get ANYTHING right? I ask you to make one simple delivery in the afternoon and you have to go and ruin all my plans.~^"; 3: print "^Robert ~Tasty~ Tasker continues his rant. ~By now, I'm sure even YOU have figured out that Guido was just a fall-guy, a figurehead. His escape from jail would have been a purely symbolic event. I'm the real leader of the mafia around here. A pity that information won't do you any good since you'll be dead.~^^ Your eyes are drawn to a movement on the street below. Looking through the broken glass, you see a huge squad of police cars. You breathe a sigh of relief... maybe they're here to save you!^^A huge tremor shakes the office building.^"; 4: print "^Outside the window, a cop steps out in front of the cars, holding a bullhorn. ~STANLEY, THIS IS THE SAN DOPPLETON POLICE. YOU ARE UNDER ARREST FOR ILLEGAL BREAKING AND ENTERING, ASSAULT ON A STATE OFFICIAL, AND ESPIONAGE. COME OUT WITH YOUR HANDS UP.~ Your sigh of relief dies.^^ ~With the mayor receiving kickbacks from us, you didn't *really* think the police would be on your side, did you Stan?~ says Mr. Tasker wryly. ~Looks like you're all finished, kid.~^"; 5: print "^Robert ~Tasty~ Tasker, overbearing pizza guy and mafia don extraordinaire, keeps talking. ~After you fouled up the escape of our front man, I figured that bomb would have done you in. But it looks like I'm going to have to finish you myself, since I just can't rely on incompetent employees anymore.~ ^^Another tremor shakes the building. You notice a hairline crack opening up in the floor.^"; 6: print "^~Think of this as a favor, Stan,~ says Mr. Tasty as he reaches into his coat pocket. ~You're a terminal loser. If I didn't conclude your pitiful little life this way, you'd never have amounted to anything anyway. Maybe you'll get your name in the papers now.~^^ Outside, you hear the police shouting on the bullhorn. ~WE HAVE GIVEN YOU FAIR WARNING. WE ARE NOW COMING UP TO GET YOU.~^"; 7: print "^Robert ~Tasty~ Tasker draws his hand out of his pocket, and he is pointing a gun at you.^^The building rumbles violently. The floor is definitely cracked. It looks like this structure won't last much longer. ^^Outside, you see the police filing into the building.^"; 8: print "^Following the boss's lead, all the other guys in suits reach into THEIR coats and pull out guns. This is definitely not a comfortable situation.^"; 9: print "^The room reverberates with a loud wave of clicking as the mafia guys all cock the hammers on their guns. ~I wish I could say it's been nice knowing you, Stan... but it really hasn't,~ says Mr. Tasker.^^You hear the heavy tread of booted footsteps on the stairs, coming up beneath you.^^The ground trembles and shakes crazily under your feet. The crack in the floor is slowly widening. You have a feeling your time left on this earth is very, very short.^"; 10: deadflag = TOAST; "^All hell breaks loose as the door splinters and smashes open and the mayor's police force barges in. Gunfire, screaming, the ground giving way beneath your feet, and every other kind of pandemonium you can possibly imagine. It seems kind of like overkill to tell you that you're dead at the end of it."; } ]; Object boss "Robert ~Tasty~ Tasker" has animate proper, with name "robert" "tasty" "tasker" "boss", description "You never liked your boss much BEFORE you found out he was a mafia don. Your opinion of him has not improved now that he's trying to kill you.", before [; Examine: Attack: "You'd have to fight your way past all those mafia guys first. Frankly, I'd give you better odds to win the California state lottery three times in a row."; Ask, Tell: "~Shut up, Stan. When I want your opinion, I'll give it to you.~"; default: "Mr. Tasker will not be swayed from his plan, and you can't get at him behind all the rows of bodyguards."; ]; Object mafia "huge crowd of mafia guys" has animate, with name "huge" "crowd" "of" "mafia" "guys" "thugs" "bad" "mob" "crooks" "criminals", description "They just stare at you. They're pretty obviously pissed off, but their faces register absolutely no emotion.", before [; Attack: if (second == hairspray) <>; if (second ~= hairspray && second ~= axe) "Good strategy, Stan! Let's see, there's one of you, and a whole bunch of them, and that leaves... umm... (whole bunch, divided by one, carry the two, take out the...) oh, never mind. Just DON'T DO IT, okay?????"; if (second == axe) { deadflag = TOAST; "You raise the axe high above your head and give a loud barbarian yell. As you rush toward the horde of mafia guys, one of them pulls out his gun and shoots you. Contrary to conventional wisdom, they don't always miss."; } ]; Object filecabinet "file cabinet" MayorOffice class adnc, has static container openable lockable locked, with name "cabinet" "drawer" "drawers", adname 'file', description "A big file cabinet with a bunch of drawers.", with_key cabinetkey, before [; Open: if (self hasnt locked && self hasnt open) { give self open; print "You open the mayor's file cabinet. A massive quantity of paperwork is in there."; if (secretfile in self) print " Amongst the paper you see a particular file which looks suspicious."; print_ret ""; } Shake: "The cabinet rattles and bangs as you shake it. Otherwise nothing happens."; ]; Object cabinetkey "key" jill with name "key", description "Um, well Stan, it appears to be a key. What we have is basically a small flat metal thing with a little round handle on one end and some ridges on the other that are intended to slide into a locking mechanism. Jill already told you that it unlocks the Mayor's file cabinet. So on the whole, there's not a lot more to be said.", daemon [; move self to player; give self general; StopDaemon (self); "^As you walk into the office, Jill spots you. ~Hi!~ she says. ~Listen, Stan. I have reason to believe that the Mayor is tangled up in the mafia. I managed to use some connections to get this key. It unlocks the mayor's cabinet.~ She hands you a key. ~I'd use it myself, but I already have several eyes on me at all times. They know me.~"; ]; Object secretfile "secret file" filecabinet with name "secret" "file" "document" "suspicious", description "At the top it's labelled ~My connection with the mafia, by Mayor John Winnick.~^^ Well well, won't Jill be happy to see THIS! For a moment you think about how utterly ridiculous it is that the mayor would make his illicit activities so easy to discover.", before [; Take: if (self hasnt general) { score = score + 3; give self general; move self to player; move mayor to location; move lackey to location; StartDaemon (lackey); "You smugly retrieve the file.^^ Just are you're starting to feel disappointed about how easy it was to search around in the mayor's secret files, you hear a commotion out in the hall. Suddenly, you find yourself staring into the shifty face of Mayor Winnick himself. He quickly assesses the situation and makes a curt gesture. In walks a very large, very ugly lackey, who begins to approach with a nasty look in his eye."; } ]; Object glassbox "glass box" MayorOffice has static container scenery transparent, with name "glass" "box", description [; if (self has open) { if (axe in self) <>; "A broken glass box."; } print "~In case of emergency, break glass.~^^"; <>; ! Through the glass in the box you can see a fire axe."; ], before [; Attack: if (self has open) "It's already broken."; if (second == nothing) "It's too strong to break with your bare hands."; if (second ~= hammer) "Oh sure, like THAT'S going to work."; score = score + 3; give self open; "You smash the glass."; Receive: if (self has open) { OneMove = 0; startdaemon (QuestionAsked); question = GRASPSTRAWS; "Kind of grasping at straws now, aren't you?"; } Search: if (axe in self) { print "Through the "; if (self has open) print "broken "; "glass in the box, you can see a fire axe."; } Shake: "Since the box is secured to the wall, it doesn't go anywhere. You bang yourself up pretty well, though."; ]; Object axe "fire axe" glassbox has concealed with name "fire" "axe" "ax" "fireaxe" "fireax", description "A heavy fire axe.", before [; Examine: default: if (self in glassbox && glassbox hasnt open) { "You can't do anything with it while it's behind the glass."; } ]; Object mayor "mayor" has animate, with name "mayor" "john" "winnick", article "the", description "John Winnick, mayor of San Doppleton, is here, looking like a corrupt political slimeball. And he means business.", before [; Examine: Attack: "The mayor is guarded by his lackey."; default: "Rather than concentrating on the mayor himself, maybe you should channel your efforts into getting the heck out of here."; ]; Object lackey "lackey" has animate, with state 0, name "thug" "lackey" "guard" "henchman", description "This guy is about to kick your ass.", before [; Attack: "Full marks for effort, zero for creativity. He's bigger, stronger, and better armed than you."; ], daemon [; self.state = self.state + 1; switch (self.state) { 1, 2, 3: print "^The henchman approaches with a mean gleam in his eye. It is highly recommended that you find an escape route.^"; 4: print "^The henchman is almost upon you.^"; 5: deadflag = TOAST; print "^The henchman riddles you with bullets.^"; } ]; Object OfficeWindow "window" MayorOffice has openable scenery, with name "third" "story" "window", description [; if (self has general) "You smashed it up pretty good. Now it's just a bunch of shards of glass lying on the ground."; if (self has open) print "The open "; else print "The closed"; "window overlooks the street."; ], before [; Open: if (self has general) "It doesn't or close anymore. It's just a big mess of broken glass."; give self open; "You open up the window."; Close: if (self has general) "It doesn't or close anymore. It's just a big mess of broken glass."; give self ~open; "You close the window."; Enter: if (self has general) { deadflag = PANCAKE; "You excuse yourself for your rude entrance and leap back out the way you came. Finding yourself hanging from the windowsill once again, you take your chances and jump. Too bad Jill wasn't around to catch you this time."; } if (self has open) { if (mayor notin location) { "You have no reason to do such an obviously suicidal thing."; } score = score + 5; remove mayor; remove lackey; give OfficeDoor ~open; give OfficeDoor locked; StopDaemon (lackey); StartDaemon (Hangin); print "Desperately looking for a way out, you climb out the open window. You find yourself dangling from the window sill over a three-story drop.^"; move windowsill to player; PlayerTo (Hangin); rtrue; } else { "The window is closed."; } Attack: if (self has general) "It's already broken."; deadflag = TOAST; if (mayor in location) "The mayor stares at you, astounded that you would add insult to injury by vandalizing his office after robbing him. He shoves his henchman aside and strangles you with his bare hands."; "You smash the window up real good. Alerted by your violent assault on his office, the Mayor himself bursts into the room together with a guard. To your surprise, instead of arresting you, the guard pushes you through the window."; ]; ! The following two locations, "Hangin' Out" and "The End of your Rope", ! are both right outside the mayor's window, ! but they are completely different in behavior, so I want to make them ! different objects. Object Hangin "Hangin' Out" has light, with state 0, name "hangin" "out", description "You are dangling over a three-story drop, desperately clutching the window ledge with your fingertips. And as if that weren't bad enough, a very angry mayor and a very large security guard are inside, and they're both very eager to get rid of you.^^ Your feet are just low enough to touch the window on the next floor below you.", each_turn [; ! objectloop (i in floor) ! { ! print (The) i, " falls to the ground three stories below.^"; ! move i to Downtown; ! } ], before [; Drop: if (noun == player) <>; if (noun ~= windowsill && IndirectlyContains (player, noun)) { move noun to Downtown; print_ret (The) noun, " falls to the ground three stories below."; } Go: if (noun == d_obj) "If you let go of that window sill, that could be arranged."; if (noun == w_obj) "The mayor and his favorite thug are in there. Let's not push our luck, okay?"; if (noun == u_obj) "Unless you're Spiderman, that's not very likely."; if (noun == n_obj || noun == ne_obj || noun == e_obj || noun == se_obj || noun == s_obj) "Unless you can fly, that's not very likely."; "Unless you can walk through walls, that's not very likely."; Jump: <>; Leggo: print "(of the window sill)^"; <>; ], daemon [; self.state = self.state + 1; switch (self.state) { 1: print "^Inside the window, you hear the mayor and the lackey congratulating each other on getting rid of you.^"; 2, 3, 4: print "^Inside the window, you hear the mayor and the lackey engaged in low conversation, too quiet for you to hear.^"; 5: print "^You hear the mayor inside, advising that they check to make sure you're really gone.^"; 6: move mayorhead to location; move lackeyhead to location; print "^The mayor and the lackey look out the window. They are surprised to see you.^"; 7: print "^You're in trouble now. The lackey is drawing his gun.^"; 8: deadflag = PANCAKE; print "^Being perverse, the lackey shoots your hand. You release your grip and fall.^"; } ]; Object windowsill "window sill" class adnc, with name "sill" "windowsill" "ledge", adname 'window', description "You're hanging on it.", invent "a window sill (clutched tightly between your fingers)", before [; Drop, Throw: if (SSWindow.state == 0) { deadflag = PANCAKE; "You release your grip on the window and you're falling, falling...^^ In the interest of good taste, we'll spare you the details of what happens at the bottom."; } if (SSWindow.state < 3) "Timing, Stan. Timing is everything."; score = score + 5; remove windowsill; remove secretfile; StopDaemon (SSWindow); StopDaemon (Hangin); give Atmosphere cops; give OfficeDoor ~open; give OfficeDoor locked; print "You release your grip on the window and you're falling, falling...^^ ~GOTCHA!~ You find yourself in the remarkably strong arms of Jill, who hauls you into her window and onto solid ground. You've never been so happy to see anyone in your life.^"; PlayerTo (LawOffice); print "^You briefly relate to Jill what's just been happening to you. Jill looks thoughtful as she takes the file from you. ~So you uncovered evidence that the mayor is connected to the mob? And he knows that you found out. This sounds serious. If I'm not mistaken, every cop in the district is going to be after your head pretty soon.^^ ~Good work, though, Stan. Don't stop now. I'm going to phone the state police and see if I can get outside help on this case.~^"; rtrue; Take: "You're already holding onto it."; Show, Give: "Sure! Just let go of the window sill so you can free your hands first..."; ]; Object TSWindow "third story window" Hangin has static scenery, with name "third" "story" "window", description "The window is open, you're hanging out of it, and inside there are two guys trying to get rid of you.", before [; Examine: Enter: <>; default: "Don't mess with it. If you release your grip on the ledge, you'll fall."; ]; Object SSWindow "second story window" Hangin has static scenery, with state 0, name "second" "story" "window", description "Your feet are dangling near a window down below.", before [; Attack: switch (self.state) { 0: if (jill in LawOffice) { StartDaemon (self); } "You frantically kick on the window below you, hoping that somebody will hear."; 1, 2: "You kick on the window again. Something's definitely happening down there."; default: <>; } Enter: "It's closed."; Knock: <>; ], Daemon [; if (self.state < 10) { self.state = self.state + 1; switch (self.state) { 1: print "^There seems to be some activity in the room on the second story.^"; 2: print "^The window down below is opening.^"; 3: move jillshead to location; print "^Somebody sticks their head out of the second story window... by god, it's Jill!^"; if (Hangin.state < 5) Hangin.state = 5; 4: self.state = self.state - 1; print "^Jill looks up at you anxiously.^"; } } ]; Object mayorhead "mayor" has animate, with name "mayor", description "The mayor is leaning out the window, looking at you.", article "the"; Object lackeyhead "lackey" with name "lackey", description "The lackey is leaning out the window, looking at you.", article "the"; Object jillshead "Jill" has animate female proper, with name "jill" "head", description "Jill's head is right near your dangling foot. She seems unsure what to do next.", life [; Answer: "Jill didn't ask you anything."; Ask: "The idea here is to DO something. You're not going just hang here and ask her stupid questions."; Tell: "Jill's a little to startled by your predicament to react to what you're saying."; kiss: "Your lips just aren't that long."; attack: OneMove = 0; question = KICKJILL; StartDaemon (QuestionAsked); "What! Kick Jill in the face?"; ], orders [; take: if (noun == player) "Jill nods frantically. She holds out her arms trying to reach you."; ]; Object EndRope "The End Of Your Rope" has light, with name "end", description "You are swinging gently in the breeze (and the force of the worsening earthquake) outside the mayor's window. Looks like a big party going on in there. You can see the mayor, a bunch of security thugs, and lots of other guys wearing sunglasses and suits. Luckily, no one seems to have noticed you yet.", before [; Drop: if (noun in player && noun ~= rope) { move noun to Downtown; print_ret (The) noun, " falls to the ground three stories below."; } Go: if (noun == d_obj) "If you let go of that rope, that could be arranged."; if (noun == u_obj) { rope.state = 1; move rope to Roof; print "You climb up the rope. Smart move.^"; } else "The rope swings a little bit, and nothing more."; Jump: <>; Leggo: print "(of the rope)^"; <>; Swing: if (noun == nothing) <>; ], w_to "You can't get in the window.", u_to Roof; Object RopeWindow "third story window" EndRope has static scenery, with name "third" "story" "window", description "The window is closed and locked from the inside this time.", before [; Enter: <>; Open, Close: "The window is closed and locked from the inside. You can't do anything with it."; Attack: deadflag = TOAST; "You bang on the window for a while. It doesn't yield, but you do succeed in attracting the attention of the mafia guys inside. They finish you off right there."; ]; Object Roof "Roof of Office Building" has light indoors, with name "roof" "government" "building" "office", description "You are on the roof of the government building. You can go back down the stairs to the north. There is a lightning rod sticking up.", before [; Go: if (noun == n_obj || noun == d_obj) { if (rope.state == 2) "You'll either have to drop the rope or untie it first."; print "The stairs angle down and back and you emerge south.^"; } Jump, JumpOff: if (rope.state == 2) { score = score + 5; rope.state = 1; remove rope; give OfficeDoor ~locked; give OfficeDoor open; give OfficeWindow general; move mafia to MayorOffice; move boss to MayorOffice; StopDaemon (Atmosphere); StartDaemon (officefloor); print "Giving a mighty yell, you boldly leap off the side of the building! The rope tightens and then swings you back towards the building. You do your best to look like Bruce Willis as you haplessly zoom towards the window...^^"; style underline; print "CRASH!!!^"; style roman; PlayerTo (MayorOffice); rtrue; } else { deadflag = PANCAKE; if (rope.state == 1) print "Looking behind you as you leap off the roof, you can't help thinking that it might have been a better idea to be holding the other end of the rope.^^"; "You take a dive off the third story roof. To be honest, it's not the most brilliant idea you've had this evening. A height like this is not enough to kill you, but quite enough to cause you severe pain and make you spend the rest of your life as a vegetable in the hospital."; } ], n_to TFOffice, d_to TFOffice; Object -> dummyroof "roof" has scenery static, with name "roof" "building"; Object rod "lightning rod" Roof has scenery static, with name "lightning" "rod", description [; print "There are hardly any storms in Southern Cal, but when it rains it pours. Right now, there's not a cloud in the sky. So for all practical purposes, the lightning rod is just a big stick conveniently anchored to the top of this building."; if (rope.state > 0) print " There is a rope tied to the lightning rod."; print "^"; rtrue; ], before [; Cut: if (second == metalfile) { deadflag = TOAST; "KER-POW! In a freak act of nature, a lightning bolt leaps out of the clear sky and strikes the rod just as you touch it with the metal file. You should know better than to saw off parts of buildings."; } ]; Object rope "rope" with state 0, name "rope" "coil", description [; switch (rope.state) { 1, 2: "The coil of rope is tied to the lightning rod."; 3: "Hope that rope holds."; default: "It is a coil of rope, about twenty-five feet long."; } ], describe [; if (hammer hasnt general) { "The place is filled with debris from the riots. Lying on the ground you see a rope and a hammer which have been randomly flung off the shelves."; } if (rope.state == 1) "A rope lies in a heap on the ground, one end tied to the lightning rod."; ], invent [; if (rope.state > 1) { print "one end of a rope"; rtrue; } ], before [; Tie: if (second == rod) { if (rope.state == 0) { rope.state = 1; move rope to Roof; "You cleverly tie the rope to the lightning rod, dropping the other end on the ground."; } "By golly, it looks like the rope is ALREADY TIED THERE. You are about as astounded as can be by this revelation, considering that you were the one who tied it in the first place."; } if (second == player) { if (rope.state > 0) "Oh, I know what you're trying to do. You want to anchor yourself to the lightning rod and rappel down the side of the building, right? Well, forget it. The rope is so short that you can barely reach the edge of the roof while it's tied around your waist. Frustrated, you untie yourself and muse that just climbing down would be easier."; "Maybe tying yourself up would satisfy some kind of kinky fetish of yours, but you aren't coordinated enough to do it anyway."; } if (second == jill) { "Jill doesn't know you well enough to let you tie her up."; } if (second == guido) { "Guido didn't get to be a big mafia don by allowing puny little pizza guys to capture him. He resists your assault easily."; } "You tie the rope to ", (the) second, ". As nice as it looks there, you change your mind and take back the rope."; Untie: switch (rope.state) { 0: "The rope isn't tied to anything."; 1: rope.state = 0; "You untie the rope and leave it on the ground."; 2: rope.state = 0; "You untie the rope and take it with you."; 3: OneMove = 0; startdaemon (QuestionAsked); question = CLIMBROPE; "The rope is tied up at the TOP, remember?"; } Climb: switch (rope.state) { 0: "You climb around on the unattached rope for a while. Then you realize how stupid you look and you stop."; 1, 2: move rope to player; rope.state = 3; print "You climb down the rope as far as you can. For the second time today, you find yourself outside a third story window.^"; PlayerTo (EndRope); rtrue; 3: rope.state = 1; print "You climb back up the rope.^"; PlayerTo (Roof); rtrue; } Take: give hammer general; if (self hasnt moved) { score = score + 2; move guard to Downtown; } switch (rope.state) { 1: rope.state = 2; move rope to player; "You pick up the other end of the rope. Now what?"; 2: if (rope.state == 2) "You've already got one end."; } Drop, Throw: switch (rope.state) { 2: rope.state = 1; move rope to location; "You drop your end of the rope."; 3: deadflag = PANCAKE; "You release the rope and plummet to the ground."; } Swing: switch (rope.state) { 0: "You can't swing on the rope unless you're hanging from something."; 1: "Well... yes, good idea, but you might want to be holding on to the rope first."; 2: <>; 3: give EndRope general; "You swing back and forth for a minute, but you realize that you'll never get enough momentum to break inside. If only you could get more leverage."; } ]; Object hammer "hammer" with name "hammer" "ball-peen" "ball" "peen" "ballpeen", description "It's a big old ball-peen hammer.", describe [; if (self hasnt general) " "; ], Before [; Take: give self general; ]; !------------------------------------------ ! SLANG DICTIONARY !------------------------------------------ Object anatomy "anatomy" questions with name "penis" "breast" "tits" "dick" "ass" "cunt" "pussy", description "That's something that you don't have."; Object babe "babe" questions with name "babe", description "Babe, n. SEE chick."; Object bro "bro" questions with name "bro", description "Bro, n. A term used to address a male with whom the speaker is especially familiar. Abbreviation of brother, though the reference is usually towards a good friend."; Object bruce "bruce" questions with name "bruce" "willis", description "Bruce Willis is an unexplainably popular American film actor, best known for his roles in the ~Die Hard~ series. Mr. Willis' movies are always filled with lots of explosions, broken things, and extremely dramatic entrances such as the one you just performed."; Object chick "chick" questions with name "chick", description "Chick, n. A woman or girl, esp. an extremely attractive and/or sexy one. SYNONYM: babe. ANTONYM: dog. Feminists, my sincerest apologies for including such demeaning words in this otherwise highly nonsexist game."; Object cool "cool" questions with name "cool", description "Cool, adj. Good, fun, or exciting. (You really had to look up this word? Even my parents know what it means!)"; Object curse "curse" questions with name "shit" "fuck" "damn", description "That's a very naughty word which your mother wouldn't want to hear you using."; Object dog "dog" questions with name "dog", description "Dog, n. An unattractive woman or girl. ANTONYM: babe."; Object doofus "doofus" questions with name "doofus", description "Doofus, n. An unusually stupid and dull person."; Object dude "dude" questions with name "dude", description "Dude, n. A man or boy; a person of the male sex. Polite and friendly connotation."; Object goddesses "Reverberating Goddesses of Phobos" questions with name "reverberating" "goddesses" "of" "phobos", description "In joke, text adventure fans. Steve Meretzky's controversial game, ~Leather Goddesses of Phobos~, was one of the first computer games to incorporate sexual content."; Object grom "grom" questions with name "grom", description "Grom, n. A young surfer; a beginner. Condescending but not necessarily insulting."; Object hangout "hangin out" questions with name "hangin" "hang" "hanging" "out", description "Ooo, aren't you clever? Yes, ~Hangin' out~ is a play on words, because ~to hang out~ also means to lounge or loiter, to relax. Don't you just hate puns like that?"; Object hoof "hoof" questions with name "hoof" "it", description "Hoof it, v.i. To move quickly; to leave."; Object ninjaturtle "turtle" questions with name "teenage" "mutant" "ninja" "turtle" "turtles", description "Teenage Mutant Ninja Turtles, pl n. During the late 1980's, there was a craze involving four characters from a comic book series. The characters were ~Ninja Turtles~, four human-sized reptiles named after Renaissance painters, who lived in sewers and had a fondness for eating pizza. The craze spawned an animated series, three really bad live-action movies, and endless plastic toys, among other things."; Object reverberations "reverberations" questions with name "reverberations", description "Ah! You must be referring to the coolest text adventure ever written."; Object rule "rule" questions with name "rule", description "Rule, v.i. Being exceptionally good or desirable; fun or strongly motivating. The experience of attending a rock concert by subject's favorite artist ~totally rules~. ANTONYM: ~suck~."; Object screwup "screwup" questions with name "screwup" "screw", description "Screwup, n. A mistake or error. To screw something up (v.t.) means to make a bad mistake which ruins the subject."; Object shyeah "shyeah" questions with name "shyeah", description "Shyeah, interj. Derived from ~sure~ and ~yeah~; yes. In the sample phrase ~Shyeah, right~, the intent is heavily sarcastic or skeptical, expressing extreme doubt about the prededing statement."; Object suck "suck" questions with name "suck" "sucks", description "Suck, v.i. Being bad or unpleasant. An experience which sucks is to be avoided. A person who sucks is obnoxious, stupid, or generally irritating. Probably loosely derived from the concept of oral sex. ANTONYM: ~rule~."; Object tube "tube" questions with name "tube", description "Tube, n. Television. Shortened form of ~boob tube~."; Object tunes "tunes" questions with name "blast" "tunes", description "Blast some tunes, v.t. To play music, esp. rock or heavy metal, at an unusually loud volume."; !------------------------------------------ ! HELP MENU !------------------------------------------ [ GiveHint hint keypress; print (string) hint; new_line; new_line; @read_char 1 0 0 keypress; if (keypress == 'Q' or 'q') rtrue; rfalse; ]; [ HelpMenu; if (menu_item==0) { item_width=10; item_name="About Reverberations"; if (deadflag==2) return 4; else return 4; } if (menu_item==1) { item_width=16; item_name="A few opening remarks about the game"; } if (menu_item==2) { item_width=8; item_name="About the author"; } if (menu_item==3) { item_width=8; item_name="Acknowledgements"; } if (menu_item==4) { item_width=6; item_name="Game hints"; } ]; [ HelpInfo; switch (menu_item) { 1: "~Reverberations~ is my entry in the second annual interactive fiction competition. As you have probably noticed already, the narration has a very regional Southern California flavor to it. Knowing that competition games may be witnessed and judged by people from out of the country, a ~Surferese to English~ dictionary has been provided. If you don't understand a slang word such as ~dude~, for example, try typing ~explain dude~ and I will clarify.^^ For people who aren't familiar with interactive fiction, here's a brief overview. This game is a short story in the style of a comedy/action thriller. You play the role of the main character, Stan. The game will describe your environment and your situation. It is then up to you to type, in simple English statements, what Stan should do next in order to further the story. To get a feel for the game, try beginning with these commands:^^ EXAMINE COUNTER^ READ NOTE^ TAKE PIZZA BOX^ GO SOUTHWEST^^ It pays to examine everything and try every dumb action you can think of. Remember, if you get yourself killed, you can always type UNDO to back up one move. So don't be shy.^^ Have fun, dude! Later days."; 2: print "As of 1996, Russell Glasser is a 22-year-old computer science undergraduate student in his last year at the University of California in San Diego. ~Reverberations~ will be the largest game he's ever completed on his own time, and the first text adventure he EVER wrote. He is well aware of many shortcomings, so go ahead and be brutal in your criticism, but still understanding.^^ Russell was introduced to Zork I when he was 8 years old, and has been a major connoiseur of adventure games ever since. Since he knows that no one makes a living these days writing text games, he'll probably have to wind up writing games with 3d graphics and stuff. (O, what a dark fate!) He recently completed his first commercial product, an educational game, while working part-time at Smartek Software.^^ If you would like to offer any positive or negative comments about ~Reverberations~, you can reach Russell at^ rglasser@@64ix.netcom.com^ or view his home page at^ http://debugged.dyn.ml.org/rglasser^^"; 3: "Usually this is the point where I burst into tears and say ~There are just so many people to thank!~ But there aren't that many.^^ I would DEFINITELY like to thank Gilbert Quintana for his infinite patience in testing and critiquing this game, always on much too short notice. I only wish I'd been able to use more of your ideas.^^ I would also like to thank my mom, who does not like text adventures at all, but nevertheless managed to come up with a couple of neat plot twists that made the final cut. (For the record, the bomb starting the earthquake and the hairspray escape scene were both her ideas, but she denies it vehemently.)^^ And, of course, I must obviously thank Graham Nelson a lot. If it hadn't been for the magnificent Inform compiler, I might never have had the patience to write a text adventure that didn't suck. Or this one, for that matter.^^ Finally, I want to thank Greg Kuperberg for playing ~Reverberations~ two years after the competition, and caring enough to report a whole slew of juicy bugs and inconsistencies which I fixed."; 4: ; return 2; } ]; [ HelpSub; DoMenu("There is information provided on the following:^ ^ General notes on the game ^ About the author ^ Acknowledgements ^ Game hints^", HelpMenu, HelpInfo); ]; [ HintMenu; if (menu_item==0) { item_width=5; item_name="Game Hints"; return 4; } if (menu_item==1) { item_width=11; item_name="Hints for the beginning"; } if (menu_item==2) { item_width=10; item_name="Hints for the middle"; } if (menu_item==3) { item_width=8; item_name="Hints for the end"; } if (menu_item==4) { item_width=8; item_name="Fun stuff to try"; } ]; [ HintInfo; switch (menu_item) { 1: BeginHints (); 2: MiddleHints (); 3: EndHints (); 4: FunStuff (); } return 2; ]; [ HintSub; DoMenu("Choose an area of the game where you would like hints.^ ^ BEGINNING ^ MIDDLE (after Guido is in jail) ^ END (once the riots have started) ^ FUN STUFF TO TRY^", HintMenu, HintInfo); return 3; ]; [ BeginHintMenu; if (menu_item==0) { item_width=8; item_name="Beginning hints"; return 3; } if (menu_item==1) { item_width=5; item_name="What to do"; } if (menu_item==2) { item_width=7; item_name="Not screwing up"; } if (menu_item==3) { item_width=8; item_name="Saving the trial"; } ]; [ BeginHintInfo; switch (menu_item) { 1: print "(Press ENTER for next hint, or Q to return to the previous menu.)^^"; if (GiveHint("Look around you. Have you seen what's on the counter?^ (3 hints left)")==1) return 2; if (GiveHint("The note is pretty clear about your instructions.^ (2 hints left)")==1) return 2; if (GiveHint("To get to the courthouse, try SW. S. W. S.^ (1 hint left)")==1) return 2; "Guido ~The Armadillo~ Calzone is the guy who ordered a pizza."; 2: print "(Press ENTER for next hint, or Q to return to the previous menu.)^^"; if (GiveHint("In real life, you wouldn't have the benefit of hindsight. But since this isn't real life, read the text and figure out how you lost the game.^ (4 hints left)")==1) return 2; if (GiveHint("Your action of delivering the pizza caused Guido to escape and subsequently go on a crime spree. Now how did that happen?^ (3 hints left)")==1) return 2; if (GiveHint("There's more to that pizza than meets the eye.^ (2 hints left)")==1) return 2; if (GiveHint("Have you tried eating it?^ (1 hint left)")==1) return 2; "Well, persistence pays. Try it again!"; 3: print "(Press ENTER for next hint, or Q to return to the previous menu.)^^"; if (GiveHint("Now that you know you'd be responsible for Guido's escape, you could just walk away and refuse to deliver the pizza. But there seems to be a higher moral imperative here.^ (3 hints left)")==1) return 2; if (GiveHint("That district attorney could maybe use your help.^ (2 hints left)")==1) return 2; if (GiveHint("She doesn't have enough evidence to prove that Guido plans to escape. But you do.^ (1 hint left)")==1) return 2; "Give her the file."; } ]; [ BeginHints; DoMenu("^ ^ Uh... what am I supposed to be doing? ^ I delivered that pizza and lost the game! What's up with that? ^ Okay, so now I know what happened. Of what use is this information to me?^", BeginHintMenu, BeginHintInfo); return 3; ]; [ MiddleHintMenu; if (menu_item==0) { item_width=6; item_name="Middle hints"; return 5; } if (menu_item==1) { item_width=10; item_name="Not getting blown up"; } if (menu_item==2) { item_width=9; item_name="Surviving the thug"; } if (menu_item==3) { item_width=7; item_name="Mayor's office"; } if (menu_item==4) { item_width=11; item_name="Escaping from the mayor"; } if (menu_item==5) { item_width=9; item_name="Surviving the fall"; } ]; [ MiddleHintInfo; switch (menu_item) { 1: print "(Press ENTER for next hint, or Q to return to the previous menu.)^^"; if (GiveHint("The first step is obviously to find out where the explosion is coming from.^ (4 hints left)")==1) return 2; if (GiveHint("That other pizza box didn't used to be on the counter. What's in it?^ (3 hints left)")==1) return 2; if (GiveHint("Right, you knew that. Okay, you've got a bomb on your hands. How can you get rid of it?^ (2 hints left)")==1) return 2; if (GiveHint("Notice that sewer outside the pizza parlor?^ (1 hint left)")==1) return 2; "Throw the bomb into the sewer. Sorry about the consequences, but it's unavoidable."; 2: print "(Press ENTER for next hint, or Q to return to the previous menu.)^^"; if (GiveHint("Everything that you need to deal with the thug is right there in the room with you.^ (4 hints left)")==1) return 2; if (GiveHint("Check out the stuff on the shelves.^ (3 hints left)")==1) return 2; if (GiveHint("If you spray the thug with some hairspray, you might disorient him long enough to escape.^ (2 hints left)")==1) return 2; if (GiveHint("Okay, not QUITE long enough to escape. You'll have to do one other thing first.^ (1 hint left)")==1) return 2; "After you spray the thug, attack him in any way you can. Then leave."; 3: print "(Press ENTER for next hint, or Q to return to the previous menu.)^^"; if (GiveHint("Have you visited Jill's office already?^ (2 hints left)")==1) return 2; if (GiveHint("She gave you a key to the mayor's filing cabinet. Use it.^ (1 hint left)")==1) return 2; "Search the drawer."; 4: print "(Press ENTER for next hint, or Q to return to the previous menu.)^^"; if (GiveHint("Well, get out of there!^ (2 hints left)")==1) return 2; if (GiveHint("One word: window.^ (1 hint left)")==1) return 2; "[This space intentionally left blank.]"; 5: print "(Press ENTER for next hint, or Q to return to the previous menu.)^^"; if (GiveHint("Well, of course it wouldn't be THAT easy to escape. But notice how conveniently you've positioned yourself...^ (4 hints left)")==1) return 2; if (GiveHint("...just above Jill's window.^ (3 hints left)")==1) return 2; if (GiveHint("If only there were some way to get her attention, you might make a clean getaway.^ (2 hints left)")==1) return 2; if (GiveHint("Kick the window.^ (1 hint left)")==1) return 2; "After you see her emerge down below, drop the window sill."; } ]; [ MiddleHints; DoMenu("^ ^ I keep getting blown up in the pizza parlor! ^ What's with this thug who keeps killing me in the department store? ^ What do I do in the mayor's office? ^ There's a very angry mayor in the room with me. Help! ^ I'm in imminent danger of being a pancake.^", MiddleHintMenu, MiddleHintInfo); return 5; ]; [ EndHintMenu; if (menu_item==0) { item_width=4; item_name="End hints"; return 3; } if (menu_item==1) { item_width=11; item_name="Getting past the guard"; } if (menu_item==2) { item_width=13; item_name="Back to the mayor's office"; } if (menu_item==3) { item_width=7; item_name="Winning the game"; } ]; [ EndHintInfo; switch (menu_item) { 1: print "(Press ENTER for next hint, or Q to return to the previous menu.)^^"; if (GiveHint("Well, the guard outside won't let you in unless you're on ~official business~, right?^ (3 hints left)")==1) return 2; if (GiveHint("Think about *your* profession. What kind of official business could you possibly have?^ (2 hints left)")==1) return 2; if (GiveHint("Even government officials get hungry sometimes.^ (1 hint left)")==1) return 2; "Show a pizza box to the guard."; 2: print "(Press ENTER for next hint, or Q to return to the previous menu.)^^"; if (GiveHint("Once the riots have started, you'll find some new stuff in the department store.^ (5 hints left)")==1) return 2; if (GiveHint("You can't get in the door anymore. An assault from above might work better.^ (4 hints left)")==1) return 2; if (GiveHint("Tie the rope to the lightning rod.^ (3 hints left)")==1) return 2; if (GiveHint("What, you tried climbing down the rope? That's WRONG. You need to make a much more dramatic entrance.^ (2 hints left)")==1) return 2; if (GiveHint("After you tie the rope to the lightning rod, pick up the other end...^ (1 hint left)")==1) return 2; "...and jump!"; 3: print "(Press ENTER for next hint, or Q to return to the previous menu.)^^"; if (GiveHint("There's something you can do now that you couldn't do the first time you were in this room.^ (5 hints left)")==1) return 2; if (GiveHint("Break the glass box with the hammer.^ (4 hints left)")==1) return 2; if (GiveHint("Now that you have the fire axe, can you see what to do with it?^ (3 hints left)")==1) return 2; if (GiveHint("Read the description of the action very carefully.^ (2 hints left)")==1) return 2; if (GiveHint("~Another tremor shakes the building. You notice a hairline crack opening up in the floor.~^ (1 hint left)")==1) return 2; "Chop the floor with the axe."; } ]; [ EndHints; DoMenu("^ ^ I want to get into the mayor's office building, but there's a guard there. ^ Now how do I get back to the mayor's office? ^ This sure looks like a grand finale to me. I'm too young to die!^", EndHintMenu, EndHintInfo); return 3; ]; [ FunStuff; print "(Press ENTER for next hint, or Q to return to the previous menu.)^^ Have you tried...^^"; if (GiveHint("...answering YES or NO after attempting to: read the note, enter the sewer, kick Jill's window a second time (while outside the mayor's window), untie the rope after climbing down it, put something inside the glass box?")==1) return 2; if (GiveHint("...TAKE ME?")==1) return 2; if (GiveHint("...every adventurer's favorite words, PLUGH and XYZZY?")==1) return 2; if (GiveHint("...attacking something with the note?")==1) return 2; if (GiveHint("...spraying random objects with the hairspray?")==1) return 2; if (GiveHint("...throwing the small pizza box, with the bomb still in it?")==1) return 2; GiveHint ("...Attacking Mr. Tasker or the mafia guys? Spraying the mafia guys with hairspray? Asking or telling Mr. Tasker about something?^^[Press any key]"); ]; end;