! 234567890123456789012345678901234567890123456789012345678901234567890123456789 ! TODOOOooooo.... ! Deep basement ! Car ! Blood in rooms ! Blood everywhere ! Reversible bomber jacket ! Janitor ! Reactions ! Open closet door ! Mystery items in the cart ! Blood ! Cleanup actions ! Closet ! Jacket ! Sign ! Grate ! Plugged toilet ! Score! ! Overall Time limit ! Sound ! Elevator ! Kaban to no Boksatsu OL (9784 3068 306E 64B2 6BBA) ! Bloody clothes ! Cleanup ! ---- Important stuff Constant Story "Life Goes On^"; Constant Headline "David Odell / CIS 487^"; Include "Parser"; [ HasParent obj p; while(metaclass(obj) == Object) { if(obj == p) rtrue; obj = parent(obj); } rfalse; ]; [ OwnedByPlayer obj; return HasParent(obj, player); ]; Object LibraryMessages with before [ obj oops_blood oops_prints oops_evidence; Score: ! A period after this is mandatory. Ugh. if(~~ deadflag) { print "At the end of the game, you'll get to find out what is was that you left behind and didn't clean up. Not before, silly"; rtrue; } if(deadflag ~= 2) { print ".."; rtrue; } oops_blood = false; objectloop(obj && (~~ OwnedByPlayer(obj)) && (~~ obj has ignore_crime) && obj has blood) { if(~~ oops_blood) print "Uh-oh: you left blood on the following objects:^^"; oops_blood = true; PrintInOrOn(obj); } oops_prints = false; objectloop(obj && (~~ OwnedByPlayer(obj)) && (~~ obj has ignore_crime) && (~~ obj has blood) && obj has prints ) { if(~~ oops_prints) { if(oops_blood) print "^You only left fingerprints on the following:^^"; else print "Oh, you left your fingerprints on the following:^^"; } oops_prints = true; PrintInOrOn(obj); } oops_evidence = false; objectloop(obj && (~~ OwnedByPlayer(obj)) && (~~ obj has ignore_crime) && (~~ obj has prints) && (~~ obj has blood) && obj has evidence) { if(~~ oops_evidence) { if(oops_blood || oops_prints) print "Beyond all of that, there still a few suspicious items left:^^"; else print "There's are a few things you really should have taken with you:^^"; } oops_evidence = true; print " ", (name)obj, "^"; } ! Arg, mandatory period. if(oops_blood || oops_prints || oops_evidence) print "^Better hope none of that stuff comes back to you"; else print "Hey, you cleaned up all the evidence you left behind! Congratulations"; rtrue; Sleep: "You've got waaay too much to do right now to take a break."; ]; Include "VerbLib"; Statusline time; Global PlayerBloodLevel = 5; Global TimeScale = -2; [ Initialise; location = BathroomMens; move BlueRose to player; move ScaryDolls to player; move BloodyShirt to player; give BloodyShirt worn; StartDaemon(Janitor); StartDaemon(SleepyTime); SetTime(MakeTime(6, 44, true), TimeScale); player.description = ExamineSelf; ]; Constant DeadflagCaught = 3; Constant DeadflagSecurity = 4; Constant DeadflagAsleep = 5; [ DeathMessage; switch(deadflag) { DeadFlagCaught: print "You have been spotted!"; DeadFlagSecurity: print "Oh no, here comes security!"; DeadFlagAsleep: print "You fell asleep!"; } ]; ! Blood levels: ! 5 - Covered and dripping ! 4 - Dripping ! 3 - Just wet ! 2 - Some here and there (mostly dried) ! 1 - A little bit ! 0 - None Attribute blood; Attribute prints; Attribute evidence; Attribute ignore_crime; [ GamePreRoutine; if(action == ##Rub) { if(noun == player) { if(~~ PlayerBloodLevel) "You're already squeaky clean."; if(FindFirstObjectOf(parent(player), BathroomSink)) { --PlayerBloodLevel; move BloodyPaperTowels to player; SetTime(the_time + 5, TimeScale); "You go over to the sink and spend a few minutes scrubbing yourself down with some paper towels."; } if((~~ FindFirstObjectOf(player, BathroomPaperTowel)) && (~~ FindFirstObjectOf(player, BathroomPaperTowelStack))) "You don't have anything to clean with!"; if(PlayerBloodLevel < 3) { "There's only so much blood you can get off of yourself with just a dry paper towel."; } --PlayerBloodLevel; move BloodyPaperTowels to player; SetTime(the_time + 5, TimeScale); "You spend a few minutes wiping yourself off with a paper towel. You feel a bit cleaner, but not by much."; } if(noun == MrBody) { "There are open wounds on the corpse, and they don't look like they're going to dry up anytime soon."; } if((~~ FindFirstObjectOf(parent(player), BathroomSink)) && (~~ FindFirstObjectOf(player, BathroomPaperTowel)) && (~~ FindFirstObjectOf(player, BathroomPaperTowelStack))) "You don't have anything to clean with, and you don't see anything to clean with."; if(noun has blood) { give noun ~blood; print_ret "You clean the blood off of the ", (name)noun, "."; } give noun ~prints; print_ret "You wipe down the ", (name)noun, ", though you can't see any visible difference."; } rfalse; ]; [ GamePostRoutine obj; if(actor == player && PoisonAction(action)) { if(noun) PoisonObject(noun); if(second) PoisonObject(second); } if(MrBody in player && (~~ parent(player) has blood)) { print "^Blood drips from the body onto the floor.^^"; give parent(player) blood; } else if(action == ##Examine || action == ##Look) { obj = nothing; if(action == ##Look) obj = parent(player); else obj = noun; if(obj && obj ~= MrBody && obj has blood) { if(player in obj) { if(~~ MrBody in obj) { print "^There is some blood on the ground here. Hopefully you will have the opportunity to clean this up before somebody finds the mess.^"; } } else { print "^You notice an amount of blood on the ", (name)noun, ". You resolve yourself to clean it up later.^"; } } } rfalse; ]; ! ---- Debug support Iftrue false; [ TimePasses; if(parent(Janitor)) print (name)parent(Janitor); ]; Endif; ! ---- Assorted support stuffs [ PoisonAction action; return action == ##Open || action == ##Close || action == ##Take || action == ##Drop || action == ##Enter || action == ##Exit || action == ##Insert || action == ##Remove || action == ##Touch; ]; [ PoisonObject obj; ! print "Poisoned: ", action, "; ", (name)obj, "^"; if(PlayerBloodLevel == 5) give obj blood; if(~~ player in object) give obj prints; ]; [ PrintInOrOn obj; print " "; if(parent(obj)) print "on the "; else print "in the "; print (name)obj, "^"; ]; Array BloodLevelMessages --> "You've got streaks of dried blood on your face, and some gunk on your fingernails, but that's about it. " "Dried blood is obvious and visible. You're a lot better than you were, but you still don't look right. " "The trails of blood droplets are still visible on your face; must of it is mixed with sweat. " "You've got blood all over your face and body, but your hands are at least dry. You should be able to do things without getting blood all over the place. " "You are covered in blood, and you make a mental note to clean yourself up. "; [ ExamineSelf; if(PlayerBloodLevel) { print (string)(BloodLevelMessages --> (PlayerBloodLevel - 1)); if(BloodyShirt in player && BloodyShirt has worn) print "Also, you might want to do something about that shirt you're wearing. "; ""; } else { if(BloodyShirt in player && BloodyShirt has worn) "You might want to do something about that shirt you're wearing, but other than that, you're OK for the most part."; else "You look...almost normal. A bit disheveled, but nothing too far from the norm."; } ]; [ MakeTime hour minute am_pm; if(am_pm) hour = hour + 12; return hour * 60 + minute; ]; Constant PlayerReactionNeutral = 0; Constant PlayerReactionScared = 1; Constant PlayerReactionNaked = 2; [ PlayerReaction actor; if(TestScope(actor, MrBody) || PlayerBloodLevel > 1 || (BloodyShirt in player && BloodyShirt has worn) || MrBody in player) return PlayerReactionScared; if(~~ (BomberJacket in player && BomberJacket has worn)) return PlayerReactionNaked; return PlayerReactionNeutral; ]; [ FindFirstObjectOf parent cls obj; objectloop(obj in parent && obj ofclass cls) return obj; return nothing; ]; [ FindFirstObjectWith parent flag obj; objectloop(obj in parent) { if(obj has flag && obj ~= player) return obj; } return nothing; ]; [ CombineTowels parent towel_single result; result = false; if(FindFirstObjectOf(parent, BathroomPaperTowelStack)) { while(true) { towel_single = FindFirstObjectOf(parent, BathroomPaperTowel); if(towel_single) { remove towel_single; result = true; } else { break; } } } return result; ]; [ EmitSound; if(Janitor.position > 0 && Janitor.position < JanitorWalkLength && (~~ Janitor.stopped)) { print "~What the heck is that?~^ ^ One of the custodial staff has heard the radio.^ ^"; ! TODO: What if we're in the closet right now? switch(PlayerReaction(Janitor)) { PlayerReactionScared: deadflag = DeadflagCaught; "~Holy mackerel!~^"; PlayerReactionNaked: deadflag = DeadflagSecurity; "~Sir, where are your clothes? This floor's closed, you're not supposed to be here!~^"; PlayerReactionNeutral: deadflag = DeadflagSecurity; "~Hey! That's my radio! What were you doing in the janitorial closet?! Huh?~^"; } } ]; [ CopyAttribute dest source attr; if(source has attr) give dest attr; else give dest ~attr; ]; ! ---- Verbs and friends Attribute reversible; Attribute reversed; Verb 'reverse' 'invert' * noun -> Reverse; [ ReverseSub; if(noun has reversible) { print "You reverse the ", (name)noun, ".^"; if(noun has reversed) give noun ~reversed; else give noun reversed; } else { "You can't reverse that."; } ]; Attribute toilet; Verb 'pee' 'poop' 'piss' 'crap' 'dump' 'urinate' 'defecate' * -> PottyBreak * 'in' noun -> PottyBreak * 'on' noun -> PottyBreak; Global PlayerPeed = false; [ PottyBreakSub; if(~~ noun) { noun = FindFirstObjectWith(parent(player), toilet); if(noun) { print "(in the ", (name)noun, ")^"; <>; } else { "Not here, jeez!"; } } if(~~noun has toilet) "That's not a toilet!"; if((~~PlayerPeed) && random(32) == 1) { PlayerPeed = true; "Ahhhh..."; } "Not now, you've got things to do!"; ]; Verb 'flush' * -> Flush * noun -> Flush; [ FlushSub; if(~~ noun) { noun = FindFirstObjectWith(parent(player), toilet); if(noun) { print "(the ", (name)noun, ")^"; <>; } else { "There's nothing here to flush."; } } if(AfterRoutines()) return; if(noun has toilet) " * * flush * * "; else "You can't flush that; it's not a toilet."; ]; ! TODO: Can't have these with containers. Object BloodyPaperTowels "blood-soaked paper towels" with name 'bloody' 'blood' 'blood-soaked' 'soaked' 'paper' 'towels' 'towel', description "These brown paper towels have been stained with deep red blood. Some of them are still stained damp." has pluralname evidence; ! ---- Sleepytime Array SleepyTimeTimes --> 3 * 60 + 0 3 * 60 + 30 4 * 60 + 15; Array SleepyTimeMessages --> "It's getting mighty late. You had better hurry up and get out of here before you doze off.^" "It's really late now. You're starting to lose track of time, and you're running out of energy. It's getting very hard to think straight.^" "You decide to sit down for just a moment...^"; Array SleepyTimeScales --> 2 4 8 * 60 + 12; Constant SleepyTimeCount = 3; Object SleepyTime with message 0, daemon [; if(the_time < 12 * 60) { while(self.message < SleepyTimeCount && the_time >= SleepyTimeTimes-->self.message) { print (string)SleepyTimeMessages-->self.message; SetTime(the_time, SleepyTimeScales-->self.message, TimeScale); ++self.message; } if(self.message == SleepyTimeCount) { deadflag = DeadflagAsleep; } } ]; ! ---- Janitor Array JanitorWalkLocales --> EastHallway SouthHallway BathroomMens BathroomMensStall BathroomMens SouthHallway BathroomWomens BathroomWomensStall BathroomWomens SouthHallway EastHallway; Array JanitorWalkTimes --> (7 + 12) * 60 + 2 (7 + 12) * 60 + 3 (7 + 12) * 60 + 4 (7 + 12) * 60 + 6 (7 + 12) * 60 + 7 (7 + 12) * 60 + 12 (7 + 12) * 60 + 13 (7 + 12) * 60 + 14 (7 + 12) * 60 + 16 (7 + 12) * 60 + 18 (7 + 12) * 60 + 19; Array JanitorCartLocales --> EastHallway SouthHallway SouthHallway SouthHallway SouthHallway SouthHallway SouthHallway SouthHallway SouthHallway SouthHallway EastHallway; Array JanitorWalkMessages --> "^You hear an elevator door open.^" "" "^You hear the door to one of the bathrooms open.^" "" "" "^You hear the door to one of the bathrooms open.^" "^You hear the door to one of the bathrooms open.^" "" "" "^You hear the door to one of the bathrooms open.^" "" "^You hear an elevator.^"; ! Array JanitorExistMessages --> ! "You hear footsteps." ! "You hear footsteps." Constant JanitorWalkLength = 11; Object JanitorCart "janitorial cart" with name 'cart', description "This cart contains a myriad of cleaning chemicals, some brushes and sponges, a pail, and some other assorted things. Of particular interest is a keychain hanging from the side." has container open static; Object -> JanitorCartSupplies "supplies" with name 'supplies' 'pail' 'brush' 'sponge' 'things', description "The various supplies are all delicately stacked inside the cart. To try to grab one would almost certainly involve making an inordinate amount of noise.", before [; Take: "To try and take any of the supplies from the cart would make a great deal of noise. You decide against doing this. Don't worry, you won't need any of this stuff."; ] has scenery pluralname; Object -> JanitorCartKeys "keychain" with name 'key' 'keys' 'chain' 'keychain', description "There must be over a dozen keys on this keychain. A few are labeled: ^ - Vents (basement)^ - Safe L31^ - Storage closets, L1-L6^ - Storage closets, L7-L15^ - Main office^ - Elevator maint. L52^ - Sticky notes^ - Ramone B2"; Object Janitor with position 0, greeted false, stopped false, fear 0, Check [; switch(PlayerReaction(self)) { PlayerReactionScared: deadflag = DeadflagCaught; print "^~Holy fudgesickles!~^^A member of the custodial staff runs away, fumbling to get his cell phone out. You wonder if perhaps something about your appearance gave you away.^"; rtrue; PlayerReactionNaked: deadflag = DeadFlagSecurity; print "A member of the custodial staff notices you: Sir, where are your clothes? This floor's closed, you're not supposed to be here!"; rtrue; PlayerReactionNeutral: rfalse; } ], daemon [ obj; while((~~ self.stopped) && self.position < JanitorWalkLength && the_time >= JanitorWalkTimes-->self.position) { if(self in BathroomMens) BathroomMensSchedule.cleaned = true; else if(self in BathroomWomens) BathroomWomensSchedule.cleaned = true; move self to JanitorWalkLocales-->self.position; move JanitorCart to JanitorCartLocales-->self.position; if(TestScope(self) && self.Check()) return; print (string)JanitorWalkMessages-->self.position; if(parent(self) has blood) { deadflag = DeadflagSecurity; "~Hello, security? There's a pool of blood on the ground here. What do I do?~"; } objectloop(obj in parent(self)) { if(obj has blood) { give obj ~blood; ++self.fear; if(self.fear == 4) { deadflag = DeadflagSecurity; "~Hello, security? Yeah, I keep finding little bits of blood. Yeah, I'll hold...~"; } } give obj ~prints; if(obj ofclass BathroomPaperTowels) give obj ~open; if(obj ofclass BathroomFlood) remove obj; } if(TestScope(self, MrBody)) { deadflag = DeadflagSecurity; "^~Aaaaaaaaaaugh!~^^You hear a scream come from nearby. Perhaps somebody saw something that frightened them."; } if(self in BathroomMens && player in BathroomMensStall) { self.stopped = true; "~Sir, could you please hurry it up in there? I need to clean this place. Sir?~"; } if(self in BathroomWomens && player in BathroomWomensStall) { self.stopped = true; "Ma'am, I'm gonna need to clean this place up. Could you hurry it up in there?"; } if(self in BathroomMensStall && MrBody in BathroomMensDuct && BathroomMensDuct has open) { deadflag = DeadflagSecurity; "^~...The heck? ...Waaah!~^^It crosses your mind that someone might have found the body."; } ++self.position; } if(self.position == JanitorWalkLength) { print (string)JanitorWalkMessages-->self.position; remove self; remove JanitorCart; StopDaemon(self); } ], each_turn [; if(~~self.Check()) { if(BomberJacket in player && BomberJacket has worn && ~~(BomberJacket has reversed)) { deadflag = DeadFlagSecurity; "Hey! That's Fred's jacket! Thief! Come back here!"; } else if(self.greeted) { "There is a surly janitor here."; } else { self.greeted = true; print "A surly janitor greets you."; } } ] has scenery; ! ---- Elevator Class ElevatorButton with name 'elevator' 'button', description "This is an elevator button.", outer_door nothing, floor 0, before [; Push: if(self.floor == Elevator.floor) "The button doesn't light up."; if(Elevator.outer_door) give Elevator.outer_door ~open; give ElevatorDoor ~open; Elevator.outer_dest = self.outer_dest; Elevator.outer_door = self.outer_door; Elevator.dest = self.floor; StartDaemon(Elevator); "You press the button."; ] has scenery; Class ElevatorButtonDead with before [; Push: "The button doesn't light up."; ], has scenery; Class ElevatorDoorOuter with name 'elevator' 'door' 'doors', description [; if(self has open) "The elevator doors are open and inviting."; else "The elevator doors are closed. If you want to use it, there should be a button nearby."; ], door_to Elevator, door_dir n_to has door locked scenery; Object Elevator "Elevator" with description "This is a plain elevator. Fluorescent light abounds. There are buttons labeled with numbers 1-18, and B1-B3. The buttons for B2 and B3 are additionally labeled with a green 'P' with a box around it. Of special interest is a sign on the wall: ~Elevator will not go to floors higher than level two after 6:30 without a keycard.~ Of course, you don't have one. The exit is to the south.", floor 20, dest 20, outer_door nothing, outer_dest nothing, s_to ElevatorDoor, out_to ElevatorDoor, daemon [; if(self.dest < self.floor - 2) self.floor = self.floor - 2; else if(self.dest > self.floor + 2) self.floor = self.floor + 2; else { self.floor = self.dest; print "^~Ding.~"; if(TestScope(self.outer_door)) print " The elevator doors open before you."; ! TODO: Not working. print "^"; self.floor = self.dest; StopDaemon(self); ElevatorDoor.door_to = self.outer_dest; give ElevatorDoor open; if(self.outer_door) give self.outer_door open; if(self.floor <= 2 && OfficeLady in self) { print "^The woman in the elevator gets off.^"; remove OfficeLady; } } ] has light; ElevatorButton -> ElevatorButtonB3 "B3 elevator button" with name 'B3', outer_dest ParkingB3, floor -3; ElevatorButton -> ElevatorButtonB2 "B2 elevator button" with name 'B2', outer_dest ParkingB2, floor -2; ElevatorButton -> ElevatorButtonB1 "B1 elevator button" with name 'B1', outer_dest ShoppingComplex, floor -1; ElevatorButton -> ElevatorButtonL1 "L1 elevator button" with name '1//' 'L1', outer_dest Level1, floor 1; ElevatorButton -> ElevatorButtonL2 "L2 elevator button" with name '2//' 'L2', outer_dest Level2, floor 2; ElevatorButtonDead -> ElevatorButtonL3 "L3 elevator button" with name '3//' 'L3'; ElevatorButtonDead -> ElevatorButtonL4 "L4 elevator button" with name '4//' 'L4'; ElevatorButtonDead -> ElevatorButtonL5 "L5 elevator button" with name '5//' 'L5'; ElevatorButtonDead -> ElevatorButtonL6 "L6 elevator button" with name '6//' 'L6'; ElevatorButtonDead -> ElevatorButtonL7 "L7 elevator button" with name '7//' 'L7'; ElevatorButtonDead -> ElevatorButtonL8 "L8 elevator button" with name '8//' 'L8'; ElevatorButtonDead -> ElevatorButtonL9 "L9 elevator button" with name '9//' 'L9'; ElevatorButtonDead -> ElevatorButtonL10 "L10 elevator button" with name '10' 'L10'; ElevatorButtonDead -> ElevatorButtonL11 "L11 elevator button" with name '11' 'L11'; ElevatorButtonDead -> ElevatorButtonL12 "L12 elevator button" with name '12' 'L12'; ElevatorButtonDead -> ElevatorButtonL13 "L13 elevator button" with name '13' 'L13'; ElevatorButtonDead -> ElevatorButtonL14 "L14 elevator button" with name '14' 'L14'; ElevatorButtonDead -> ElevatorButtonL15 "L15 elevator button" with name '15' 'L15'; ElevatorButtonDead -> ElevatorButtonL16 "L16 elevator button" with name '16' 'L16'; ElevatorButtonDead -> ElevatorButtonL17 "L17 elevator button" with name '17' 'L17'; ElevatorButtonDead -> ElevatorButtonL18 "L18 elevator button" with name '18' 'L18'; Object -> ElevatorDoor "elevator door" with door_to nothing, door_dir s_to, has door locked scenery; ! ---- Ofiisu Redii Object -> OfficeLady "foreign businesswoman" with name 'businesswoman' 'woman' 'foreigner' 'worker' 'OL', worried false, can_id false, description "The businesswoman smiles and nods. This woman is dressed to the nines and is carrying a locked briefcase. She does not appear to be a local; you wonder what sort of business would compel her to come here from lands unknown. Hopefully this means that she won't be particularly accustomed to cultural norms, and that she will write off any odd appearances as being unique to this region.", each_turn [; switch(PlayerReaction(self)) { PlayerReactionScared: deadflag = true; "^ ~Yaaaaaaaaaaaaaaah!~^ ^ A businesswoman jumps back away from you, and unleashes her ~Kaban to no Bokusatsu~ technique. As she plants her briefcase firmly and repeatedly into your skull, you use your last moments to contemplate what might have set this woman off just by looking at you."; PlayerReactionNaked: self.worried = true; self.can_id = true; "~Excuse me, sir? Should not you be wearing shirt?~"; } ] has static; ! ---- Inventory Object BlueRose "blue rose" with name 'blue' 'rose' 'baggie', description "This is a rose, tinted to be an artificial blue, gently placed in a plastic baggie. There are two blocks of styrofoam in with the rose, forcing the bag to assume a minimum width, larger than that of the rose. Cotton balls keep everything in place."; ! TODO: "take rose from bag" Object ScaryDolls "stuffed dolls" ! Red herring :D with name 'stuffed' 'doll' 'dolls', description "These are three stuffed dolls, about the size of your fist. A cut divides the outer fabric of each from the center of the stomach to the lower-most point of the pelvis." has pluralname evidence; Object BloodyShirt "bloody shirt" with name 'shirt' 'bloody', description "This white t-shirt has been decorated with a festive red speckled pattern." has blood clothing evidence; ! ---- Shared bathroom classes Class BathroomFlood(2) with initial "The ground is flooded here.", short_name "flood" has static; Class BathroomStall with name 'stall' 'toilet', description "This is a bathroom stall. It is tall and beige." has enterable scenery; Class BathroomToilet with name 'toilet', overflowed false, description [; if(~~ self.overflowed) "A fine porcelain fixture, but otherwise unremarkable."; else "What a mess."; ], before [; LetGo: "It's soaked in toilet water. You let it be."; Receive: if(self.overflowed) "You don't need to plug the toilet up a second time."; if(noun has evidence) "You decide against flushing evidence down the toilet. It could get stuck, and someone might find it."; if((~~ noun ofclass BathroomPaperTowel) && (~~noun ofclass BathroomPaperTowelStack)) "That doesn't belong in the toilet."; ], after [ target flood result; Flush: if(FindFirstObjectOf(self, BathroomPaperTowelStack)) { self.overflowed = true; flood = BathroomFlood.create(); if(flood) { target = self; while(parent(target)) { target = parent(target); give target ~blood; } move flood to target; } print "The toilet tries to gobble up the stack of paper towels, but it's too much: The bathroom is flooded.^"; result = true; } else if(FindFirstObjectOf(self, BathroomPaperTowel)) { print "The toilet happily consumes its contents. You note that it would take a great deal of mass to clog this device.^"; result = true; } while(child(self)) { give child(self) ~blood ~prints; remove(child(self)); } return result; ] has open container scenery toilet; Class BathroomSink with name 'sink' has scenery; Class BathroomMirror with name 'mirror', description [; ExamineSelf(); ] has scenery; Class BathroomSoapDispenser with name 'soap' has scenery; Class BathroomHandDryer with name 'hand' 'dryer' has scenery; Class BathroomPaperTowel(24) with name 'paper' 'towel', short_name "paper towel", plural "paper towels", after [; Drop: if(CombineTowels(parent(player))) "You add the paper towel to the stack on the ground."; Take: if(CombineTowels(player)) "You take a paper towel and put it in your stack."; ]; Class BathroomPaperTowelStack with name 'paper' 'towels' 'stack', after [; Drop: if(CombineTowels(parent(player))) "You drop the paper towel stack on the ground, adding the towels that are already there to the stack, so as not to make a mess."; Take: if(CombineTowels(player)) "You take the stack of paper towels, and add the paper towels you already have to it."; ]; Class BathroomPaperTowels with name 'paper' 'towel' 'dispenser', before [ towel_object; Take: if(self has open) { towel_object = child(self); <>; } else if(FindFirstObjectOf(self, BathroomPaperTowelStack)) { towel_object = BathroomPaperTowel.create(); if(towel_object) { move towel_object to player; if(CombineTowels(player)) "You take a paper towel from the dispenser, adding it to the stack of towels you already have"; else "You take a paper towel from the dispenser."; } else { "Haven't you taken enough of these things?"; } } else { "There aren't any paper towels left."; } ], has scenery; Class BathroomTrash with name 'trash' 'can' has scenery; Class BathroomSchedule with name 'schedule' 'sign' 'note', cleaned false, description [; print "There is a chart on the wall here. Someone has used marker to write on it.^ ^ CUSTODIAL SCHEDULE week of 3/17 - Nuvoritch Plaza^ ^ 3/17 Sun --- XXXXX^ 3/18 Mon XXXXX XXXXX^ 3/19 Tue XXXXX XXXXX^ 3/20 Wed XXXXX XXXXX^ 3/21 Thu XXXXX XXXXX^ 3/22 Fri XXXXX "; if(self.cleaned) print "XXXXX"; else print " 7:00"; print "^ 3/23 Sat --- 7:00^ ^ 3/24 Sun --- 7:00^ 3/25 Mon 1:00 7:00^ 3/26 Tue 1:00 7:00^ 3/27 Wed 1:00 7:00^ 3/28 Thu 1:00 7:00^ 3/29 Fri 1:00 7:00^ 3/30 Sat --- 7:00^"; ], before [; Take: "It's attached to the door with superglue. You can't budge it."; ] has scenery; ! ---- Men's Room Object BathroomMens "Men's Room" with description "This is the inside of a men's room. These are - under normal circumstances - quite upscale facilities indeed. A small box hanging from a peach-colored wall radiates a genuinely pleasant odor. The usual fixtures are present: urinals, stalls, sinks, a big mirror, a soap dispenser, one of those hand dryer thingies, some paper towels, and a trash bin. A door to the north leads out. A note is posted on this door.", n_to SouthHallway, out_to SouthHallway has light blood; Object -> BathroomMensUrinal "men's room urinal" with name 'urinal', description "Warning: do not eat the urinal cakes." has scenery toilet; BathroomStall -> BathroomMensStall "men's room stall"; Object -> -> BathroomMensDuct "air duct" with name 'grate' 'duct' 'air' 'vent', description "You notice a small ventilation grate on the floor. It's quite wide, as well." has openable container static; BathroomToilet -> -> BathroomMensToilet "men's room toilet"; BathroomSink -> BathroomMensSink "men's room sink"; BathroomMirror -> BathroomMensMirror "men's room mirror"; BathroomSoapDispenser -> BathroomMensSoapDispenser "men's room soap dispenser"; BathroomHandDryer -> BathroomMensHandDryer "men's room hand dryer"; BathroomPaperTowels -> BathroomMensPaperTowels "men's room paper towel dispenser" with description "Inside you can see a few hundred individual paper towels. This one appears to be quite sturdy."; BathroomPaperTowelStack -> -> BathroomMensPaperTowelStack "paper towels"; BathroomTrash -> BathroomMensTrash "men's room trash can"; BathroomSchedule -> BathroomMensSchedule "men's room schedule"; Object -> MrBody "dead body" with name 'body' 'corpse' 'dead', initial_desc false, description [; print "This is a well-dressed corpse. It is covered in blood, some of it yours. "; if(~~ self.initial_desc) { self.initial_desc = true; print "You note that due to the extent of some of the cuts and bruises on this poor individual appear to be the result of some sort of physical conflict or struggle, rather than as the result of an accident. Given your present state, it would appear that you would be the causative factor here, and that, given the level of culpability you seem to have in this situation, it would be in your best interests to attempt to obscure the events that have transpired here. "; } ""; ], before [; Insert: if(second == GarbageBags) rfalse; if(second ~= BathroomMensDuct && (~~ second has enterable)) print_ret "The body's too big to fit in the ", (name)second, ".^"; rfalse; ], after [; Insert: if(second == GarbageBags) "You quadruple bag the body. Wouldn't want that falling out accidentally."; Take: if(PlayerBloodLevel < 4) PlayerBloodLevel = 4; print "(oof!) Picking up the body, you notice a patch of blood on the ground below. Blood continues to dribble down, leaving a red trail leading from the patch.^"; if(~~parent(FraankvagenKeys)) { move FraankvagenKeys to parent(player); print "^Oh, and a set of keys just fell out of this guy's pocket onto the floor. Just FYI.^"; } rtrue; Drop: give parent(self) blood; "The body oozes blood onto the floor."; ] has blood prints evidence; ! ---- South Hallway Object SouthHallway "South Hallway" with description "This is a quiet hallway, running east to west. To the west end of the hallway, a window shows the outside world. To the east, more hallway. A men's restroom is to the south, and towards the end of the hallway is a women's restroom, to the southwest.", e_to EastHallway, s_to BathroomMens, sw_to BathroomWomens has light; Object -> SouthHallwayWindow "south hallway window" with name 'window', description "Below you, you see city. Plenty of places to get lost." has scenery; ! ---- Women's Room Object BathroomWomens "Women's Room" with description "This is the inside of a women's room. Like the men's room, there are toilets, sinks, a mirror, a soap dispenser, an electric hand dryer, paper towels, and a trash bin. The exit is to the north. A sign similar to the one in the men's room hangs from the door.", n_to SouthHallway, ne_to SouthHallway, out_to SouthHallway has light; ! TODO: Should the women's room have, say, a tampon dispenser? BathroomStall -> BathroomWomensStall "women's room stall"; BathroomToilet -> -> BathroomWomensToilet "women's room toilet"; BathroomSink -> BathroomWomensSink "women's room sink"; BathroomMirror -> BathroomWomensMirror "women's room mirror"; BathroomSoapDispenser -> BathroomWomensSoapDispenser "women's room soap dispenser"; BathroomHandDryer -> BathroomWomensHandDryer "women's room hand dryer"; BathroomPaperTowels -> BathroomWomensPaperTowels "women's room paper towel dispenser" with description "Inside you can see a few hundred individual paper towels. The door appears to be loose.", before [; Receive: if(noun ofclass BathroomPaperTowel) "You know, there's really no point in putting a single paper towel in there."; if(~~ noun ofclass BathroomPaperTowelStack) "Only paper towels can fit in a paper towel dispenser."; ] has container openable; BathroomPaperTowelStack -> -> BathroomWomensPaperTowelStack "paper towel stack"; BathroomTrash -> BathroomWomensTrash "women's room trash can"; BathroomSchedule -> BathroomWomensSchedule "women's room schedule"; ! ---- East Hallway Class ClosetDoor with name 'closet' 'door', with_key JanitorCartKeys, partner nothing, before [; Open: if(self has locked && self.with_key in player) { print "(first unlocking the ", (name)self, " with the ", (name)self.with_key, ") "; ; print "^"; } ], after [; CopyAttribute(self.partner, self, open); CopyAttribute(self.partner, self, locked); rfalse; ] has door lockable locked openable scenery; Object EastHallway "East Hallway" with description "This is a quiet hallway, running north to south. To the north, an elevator. To the south, more hallway. and the offices of Reid, Reid, and MacMarshallsmithson are to the west. A closet is to the east.", s_to SouthHallway, e_to EastHallwayClosetDoor, n_to EastHallwayElevatorDoor, w_to "The offices are closed, and you're not getting in." has light; ClosetDoor -> EastHallwayClosetDoor "closet door" with door_to Closet, door_dir e_to, partner ClosetClosetDoor; Object -> EastHallwayOffices "offices" with name 'office' 'offices' 'west', description "Behind the glass door, you can see a reception desk, and a few hallways leading away from it. A sign identifying this particular law firm hangs above the desk. It's closed right now, and remember: breaking and entering is highly illegal." has scenery locked; ElevatorButton -> EastHallwayElevatorButton "15th floor elevator button" with outer_dest EastHallway, outer_door EastHallwayElevatorDoor, floor 15; ElevatorDoorOuter -> EastHallwayElevatorDoor "15th floor elevator door"; ! ---- Closet Object Closet "Closet" with description "The closet is cluttered, but there is still just enough room to fit yourself inside.", w_to ClosetClosetDoor, out_to ClosetClosetDoor has light; ClosetDoor -> ClosetClosetDoor "closet door" with door_to EastHallway, door_dir w_to, partner EastHallwayClosetDoor has ignore_crime; Object -> BomberJacket "bomber jacket" with name 'bomber' 'jacket', description [; if(self has reversed) { "The jacket, now inside out, has a plain tan appearence."; } else { "The jacket is covered with patches, all of them alluding to participation in the Canadian-Bhutan war. You note that the label says ~Reversible.~"; } ] has clothing reversible; Object -> GarbageBags "garbage bags" with name 'garbage' 'bag' 'bags', description "Triple-strength Stout (R) brand garbage bags. Woven with space-age triple recursive polymerized ceramic threads for maximum durability, these bags can hold up to ten times what the leading competitor can. Stout (R). For your industrial-strangth household. (TM)", after [; Close: "You tie the garbage bag up securely."; ] has openable container pluralname; Array RadioMessages0 --> "...Police were stunned to find the victim hanging from the ceiling at the Mt. Rainee street station this morning with her intestines literally hanging out of her body. Few details are available at this time, but authorities have stated that they believe this to be the work of the man who has come to be known as the ~Blue Rose Killer.~ Joining me now is...^ ^ You switch the radio off.^" "...Well, as you know, we had a major break last week when at least half a dozen witnesses spotted this man either approaching or fleeing from the scene. And for the first time since January, we finally have an idea of what this man looks like...^" "W-U-H-H 103.1 FM. More talk, less commercials.^ ^ Are creditors bothering you? Do you feel like you're at the end of your rope? Well we at Levensworth Financial Consulting can help you consolidate your...^"; Constant RadioMessages0Count = 3; Array RadioMessage1 --> "...is Dick. Dick is looking well, thanks to a call to Insite, the once-a-month solution for your B2B needs...^" "...Here it comes, it's Ian and the Gootch! Every morning from...^" "...It's radical! (children: All right!) Sugar bombs are fortified with over four essential vitamins and nutrients, to help your kids get the strength they need for school...^" "...Side effects may include diarrhea, halitosis, cramps, insomnia, hypersomnia, post-traumatic stress disorder, and heart fluttering. More rare side effects include blood in stool or urine, coma, speaking in toungues, and death. Horizobin, take control of your cholesterol...^" "...One thing liberals have to understand...^"; Constant RadioMessages1Count = 5; Object -> Radio "radio" with name 'radio', description "It's a small, portable, battery-powered radio.", stage 0, after [; Switchon: give self ~on; if(self.stage < RadioMessages0Count) { print (string)RadioMessages0-->self.stage; ++self.stage; } else { print (string)RadioMessage1-->(random(RadioMessages1Count) - 1); } EmitSound(); rtrue; ] has switchable; ! ---- L2 Object Level2 "Second Story" with description [; deadflag = DeadflagSecurity; "On this wood-paneled floor you see hallways leading to a number of offices, apparently for building administr...^ ^ ~Hey, that's him! That's the guy!~^ ^ Also worth noting is the security desk on this floor."; ] has light; ! ---- L1 Object Level1 "Main Floor" with description [; deadflag = DeadflagCaught; "This is the main floor for Nuvoritch Plaza. Despite the late time of day, there is still a moderate amount of activity here, mostly due to various small commercial ventures present on this floor and underground. It's mighty easy to get lost in the crowd here.^ ^ ~Yeah, the guy looks exactly like him. Yeah, he's not doing anything right now. Hold on.~ You look over and find the front desk; a guy manning the desk looks back at you.^ ^ ~Uh-oh.~"; ] has light; ! ---- B1 Object ShoppingComplex "Underground Shopping Complex" with description [; deadflag = DeadflagCaught; "It would seem that the Nuvoritch Plaza has a mall located below ground level: various eateries and shops are lined up along in rows extending from the cluster of elevators you stepped from. In the distance, you can see escalators going up and down, and in the foreground, you can see a small child pointing knowingly at you.^ ^ ~Mommy, look! It's the sketchy man from teevee!~"; ] has light; ! ---- B2 Object ParkingB2 "Underground Parking - Level B2" with description "You are surrounded by concrete and motor vehicles. A ramp takes both cars and people down to level B3. A ramp also goes up to the surface, but you don't want to go there.", u_to "Look, walking around a city is just too much work for me to set up, and I really haven't thought of any good puzzles. So no city for you.", d_to ParkingB3 has light; ElevatorDoorOuter -> ParkingB2ElevatorDoor "B2 elevator door"; ElevatorButton -> ParkingB2ElevatorButton "B2 elevator button" with outer_dest ParkingB2, outer_door ParkingB2ElevatorDoor, floor -2; Object ParkingB3 "Underground Parking - Level B3" with description "You are surrounded by concrete and motor vehicles. A ramp takes both cars and people up to level B2.", u_to ParkingB2 has light; ElevatorDoorOuter -> ParkingB3ElevatorDoor "B3 elevator door"; ElevatorButton -> ParkingB3ElevatorButton "B3 elevator button" with outer_dest ParkingB3, outer_door ParkingB3ElevatorDoor, floor -2; Array FutureJobs --> "forensics expert" "grad student" "circus freak" "moose jockey" "custodian" "priest"; Constant FutureJobsCount = 6; Array FuturePlaces --> "Berlin" "Bangladesh" "Harbin" "Ottawa" "Darfur" "Bangalore"; Constant FuturePlacesCount = 6; Object Fraankvagen "Fraankvagen Ezona AM" with name 'fraankvagen' 'ezona' 'am' 'car' 'automobile' 'auto' 'motor' 'vehicle', description "This two door car is painted grey, same color as the road. It's not exactly sporty, but it at least looks sturdy.", with_key FraankvagenKeys, before [; Enter: deadflag = 2; print_ret "^You start the car, and drive off into the sunset. You begin your new life as a ", (string)(FutureJobs-->(random(FutureJobsCount) - 1)), " in ", (string)(FuturePlaces-->(random(FuturePlacesCount) - 1)), "."; ] has static enterable lockable locked openable switchable; Object FraankvagenKeys "car keys" with name 'car' 'key' 'keys' 'alarm', description "These car keys are labeled with the letter F. The remote for the car's alarm system is on the same keyring.", before [; Switchon, Push: if(player in ParkingB3) { if(~~ parent(Fraankvagen)) move Fraankvagen to ParkingB3; "A car alarm goes on. You press the button again, and it goes off."; } "Nothing happens."; ] has evidence pluralname; Include "Grammar";