! =========================================================================== ! "Detective" ! An Interactive MiSTing ! By C.E. Forman (ceforma@rs6000.cmp.ilstu.edu ! Created using Unix Inform 5.5 ! Original AGT version by Matt Barringer ! =========================================================================== ! ! Attention beginning Inform programmers: Commented explanations of various ! text tricks have been inserted throughout the code. These are indicated ! by a series of asterisks (***). ! ! =========================================================================== Switches dxsv5; !Constant DEBUG; !*** If you want a better idea of how this game functions, delete the !*** exclamation point from the line above, then re-compile the game to allow !*** for the use of debugging commands (see section 22 of the Inform manual). Constant Story "~Detective~"; Constant Headline "^An Interactive MiSTing^\ By C.E. Forman (ceforma@@64rs6000.cmp.ilstu.edu)^\ Created using Unix Inform 5.5^\ Original AGT version by Matt Barringer^"; Release 101; Include "Parser"; Constant MAX_SCORE 355; Constant ROOM_SCORE 10; Attribute general2; Attribute general3; !*** These extra general attributes exist mainly for the purpose of setting !*** up the text so that the comments by Mike and the 'bots are printed only !*** once, even if the game is in verbose mode (which it starts out in by !*** default). Specific examples are discussed as they pertain to individual !*** rooms. (If you find 'general2' and 'general3' to be too confusing, you !*** can always do a global search-and-replace to give them more creative !*** names -- 'hypno_helio_static_stasis' and 'ecstato_euphoro_fun (with !*** patented hinder-90)' come to mind. B-) Include "VerbLib"; Object Chiefs_Office "<< Chief's Office >>" with description [; print "You are standing in the Chief's office. "; if ((self has visited) && (self hasnt general)) print "^^MIKE: So is this guy Commissioner Gordon, or what?^^"; print "He is telling you^~The mayor was murdered yeaterday night^"; if (self hasnt visited) print "^MIKE: Yeaterday? Is that like Veterans' Day?^^"; print "at 12:03 am. I want you to solve it before we get any bad^\ publicity "; if ((self has visited) && (self hasnt general)) print "^^CROW: Which would only serve to counteract the GOOD \ publicity brought about by^ the mayor's death!^^"; print "or the FBI has to come in.~^"; if (self hasnt visited) print "^TOM: Tonight, on ~The X-Files!~^^"; print "~Yessir!~ You reply. He hands you a sheet of paper.^Once you \ have read it, go north or west.^"; if ((self has visited) && (self hasnt general)) "^TOM: Uh...haven't we been through this already?"; rtrue; ], each_turn [; if ((self has visited) && ((action==##Go) || (action==##Look))) give self general; ], w_to Closet_1, n_to Outside_1, s_to [; print "You can't go south from here!^"; return self; ], e_to [; print "You can't go east from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light scored; !*** Okay, let's decipher the first room (which is one of the more complex). !*** The first statement under 'description' is always printed, because no !*** if-then test precedes it. The second statement, though (which has been !*** broken into two lines to fit on the screen), does have a test. The !*** first time through, it returns false and doesn't print anything. We'll !*** get back to this one shortly. The third statement, like the first, is !*** always printed. !*** !*** Now let's look closer at the fourth. The if-then test for this reads, !*** 'if (self hasnt visited).' The 'self,' in this case, refers to the room !*** object, Chiefs_Office. When the 'description' routine is called, the !*** expression is evaluated, and it is determined whether or not !*** Chiefs_Office has the 'visited' property. (Inform keeps track of this !*** property and automatically assigns it at the end of a routine after a !*** room has been visited.) When the game first starts, Chiefs_Office !*** hasn't been visited by the player yet, so the expression 'self hasnt !*** visited' is true. Since it's true, the 'print' statement is executed, !*** and Mike says his first line ("Yeaterday? Is that like Veterans' day?"). !*** (The ^ marks indicate a line-feed, and are for spacing conventions only.) !*** The statement after this is another one that is always printed, and so !*** on, until the 'description' routine is finished. The game then calls !*** the 'each_turn' routine (which we'll get to in a moment), then stops to !*** ask for the player's command. !*** !*** Suppose the player types "LOOK," to read the room description again. !*** Once again, 'description' is run, and the first statement is printed !*** again. This time around, however, the expression 'if ((self has visited) !*** && (self hasnt general))' returns true, because the player has been in !*** the room for one move, so Chiefs_Office has been visited. The expression !*** also checks to see if Chiefs_Office has been given the 'general' !*** attribute. (It hasn't at this point.) Both checks must be true for the !*** 'print' statement to work, because we're using AND (&&), and not OR (||). !*** In this instance, both are true (Chiefs_Office has been visited, and it !*** hasn't been given the 'general' attribute). So Mike says something new !*** this time ("So is this guy Commissioner Gordon, or what?"). !*** !*** Continuing on, the third statement is always printed, but the fourth !*** statement, which was printed last time, is NOT printed again this time. !*** Why not? Because this time around, Chiefs_Office has been visited, !*** and so the expression 'if (self hasnt visited)' returns false. The !*** reason for all this expression evaluating is to prevent the room !*** description from becoming cluttered with comments from Mike and the !*** 'bots. There are 5 jokes to be made about a rather short room !*** description, so, to keep it neat, they are split up -- 2 are shown during !*** the first visit, and the other 3 the second time the text is printed. !*** !*** Before we go on, one final note about the last two statements. You may !*** notice that the final 'if' expression is followed by a short string of !*** quoted text, but without a 'print' statement. Any string of quoted text !*** in Inform returns a value to the routine that calls it. (In this case, !*** we're working with the 'description' routine.) Normally, the routine !*** returns 'true,' meaning that the text is done. But including a 'print' !*** statement in front of the quoted text causes it to return 'false,' !*** meaning there is more text coming. So we use 'print' statements up !*** until the very last 'if' expression, then follow that up with an 'rtrue', !*** which tells the routine to return 'true.' (This last statement is only !*** used if the last 'if' expression returns false.) !*** !*** Finally, let's look at 'each_turn.' This routine is called, !*** appropriately, at the end of each turn, immediately before the player's !*** command is requested. So, when the game first loads up, the room !*** description is first printed, then 'each_turn' is called. For this !*** game, 'each_turn' is used almost solely for the purpose of displaying !*** game text in different ways. (However, it can do far more than that.) !*** !*** When 'each_turn' is first called, the game checks to see if Chiefs_Office !*** has the 'visited' property. It does, because Inform gave it that !*** property immediately after printing the room description. Since the !*** room has been visited, it is given the 'general' property. Remember !*** what that does? It allows for the printing of the second set of !*** comments by Mike and the 'bots, the next time the description is printed. !*** Okay so far? !*** !*** The 'each_turn' routine checks for one other thing. It checks to see !*** if the player's action that turn was either LOOK (which prints the room !*** description) or GO (a directional move). If it wasn't one of these, the !*** 'general' attribute is not given to the room. Why not? Well, if you !*** decided to pick up or read the White_Paper object (which is in the room !*** at the start), Inform's built-in library would let you take or read it, !*** but then the 'each_turn' routine would be called again (since it's called !*** after EVERY move). That means that the 'if (self has visited)' !*** expression would be evaluated as true, and 'give self general' would be !*** executed. The problem with this is that typing "LOOK" after picking up !*** the paper would cause the game to skip over the second set of comments !*** completely, since 'general' has already been given to Chiefs_Office. !*** To fix this, the expression blocks the 'give' statement unless a LOOK or !*** GO action was invoked. !*** !*** All this is purely to make the text look neat, and to prevent the !*** comments from being inserted over and over again (which would look !*** cheesy). Your room descriptions shouldn't be nearly this complicated, !*** but, should you encounter a situation where special text needs to be !*** printed under special conditions, you'll know how to start. !*** !*** One other note: The player can only go north or east from this first !*** room. I've set up the other directions so they lead back to the same !*** room and print the description over again, in mockery of the AGT parser, !*** with which the original game was written. One of these is needed for !*** each direction (Inform won't let you use 'cant_go,' and it can't be !*** modified in VERBLIB.H). These take up a lot of space, and can be !*** deleted, if desired. !*** !*** Admittedly, some of these techniques are quite crude, but they get the !*** job done. I've learned not to question the practicality of things that !*** work. !*** !*** Now let's look at the White_Paper object, which is on the floor of !*** Chiefs_Office: Nearby White_Paper "white paper" with name "white" "paper", describe [; print "^It is a white sheet of paper.^"; if (self hasnt general) { give self general; "^MIKE: Thanks for clearing that up."; } rtrue; ], description [; print "CONFIDENTIAL:^^Detective was created by Matt Barringer. "; if (self hasnt general2) print "^^CROW: [Snide] Oh, the great Matt Barringer!^\ TOM: You never get tired of that line, do you, Crow?^^"; print "He has worked hard on this^so you better enjoy it. "; if (self hasnt general2) print "^^MIKE: We've been warned, fellas.^^"; print "I did have fun making it^though. But^I'd REALLY appreciate \ it if you were kind enough to send a postcard^or...dare I \ even say it?...money...to:^^Matt Barringer^325 Olive Ave^\ Piedmont^Ca 94611^^"; if (self hasnt general2) print "CROW: We'll do that, Matt. We'll do that.^^"; print "Just tell me if you like it or not. "; if (self hasnt general2) print "^^TOM: We don't, okay? Deal with it.^^"; print "If you want to talk to me over^a BBS^call the Ghostbuster \ Central BBS at (510)208-5657."; if (self hasnt general2) print "^^MIKE: Who ya gonna call?^ALL: GHOSTBUSTERS!!^"; print "^There is an Exile Games message area^and an Exile Games \ file area.^Have fun. I WILL give hints out over the BBS \ to any of my games.^"; if (self hasnt general2) { give self general2; "^TOM: Oh right, like you'd actually NEED hints to win this \ game."; } rtrue; ], after [; Take: "You are now carrying the white paper."; ]; !*** The white paper is set up similarly, except it also has a 'describe' !*** routine, for the initial description. With this object definition, we !*** use two attributes -- 'general' and 'general2.' 'general' is used to !*** note that Mike's comment for the white paper's initial description has !*** already been printed. 'general2' is used to indicate that the letter !*** has been read once, so the comments aren't printed the next time through. Object Closet_1 "<< Closet >>" with description [; print "You are in a closet. There is a gun on the floor. "; if ((parent(Black_Gun) ~= self) && (self hasnt general)) { give self general; print "^^TOM: Yes, the gun remains here despite the fact that \ we've already picked it up.^MIKE: How DO you do it, Matt \ Barringer?^^"; } "Better get it.^To exit, go east."; ], e_to Chiefs_Office, n_to [; print "You can't go north from here!^"; return self; ], s_to [; print "You can't go south from here!^"; return self; ], w_to [; print "You can't go west from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light scored; !*** This room makes special use of 'parent,' one of Inform's object-hierarchy !*** functions. If Closet_1 is not the parent of the Black_Gun (i.e., the !*** gun is in another room or is being carried by the player), comments are !*** printed. The 'self hasnt general' expression is again used to prevent !*** the same comments from appearing twice. Nearby Black_Gun "black gun" with name "black" "gun" "pistol", describe [; print "It is a small black pistol.^"; if (Closet_1 hasnt general2) { give Closet_1 general2; "^CROW: Hey, hey, hey! That's ~African-American pistol!~"; } rtrue; ], description [; print "It is a small black pistol. It has 10 bullets in it. "; if ((Man has general2) && (self hasnt general2)) { give self general2; print "^^MIKE: Oh, it must be auto-reloading.^^"; } print "You must^use them wisely.^"; if (self hasnt general) { give self general; "^TOM: Or not. It's not like it matters."; } rtrue; ], after [; Take: "You are now carrying the black gun."; ]; !*** The text for firing the gun is in VERBLIB.H, and the grammar extensions !*** at the end of the source code. Object Outside_1 "<< Outside>>" with description [; print "You are outside in the cold. To the east is a dead end. \ To the^west is the rest of the street. Papers are blowing \ around. It's^amazingly cold for this time of year.^"; if (self hasnt visited) "^MIKE: [Minnesotan voice] Yah, that kinda weather'll take ya \ by surprise, all^ right.^CROW: [Minnesotan voice] Oh, yah, \ I remember the summer of '58 when it got ta be^ this cold.^\ TOM: [Minnesotan voice] Yah, we musta got at least 8 feet o' \ snow that day, and^ all the streets was closed."; rtrue; ], w_to Outside_2, s_to [; print "You can't go south from here!^"; if (self has general) return self; if (self hasnt general) { give self general; print "^TOM: Sorry, folks, it looks like the door just vanished \ into thin air.^"; } rtrue; ], n_to [; print "You can't go north from here!^"; return self; ], e_to [; print "You can't go east from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light scored; !*** Note that trying to go back into the Chief's Office from this room !*** does not work, and an appropriate observation is made by Tom Servo. On !*** subsequent attempts, the room description is reprinted in the usual !*** manner. Object Outside_2 "<< Outside >>" with description [; print "You are still on the streets. To the north is a restraunt "; if (self hasnt visited) print "^^MIKE: Uh, I think you mean ~restaurant,~ Matt.^^"; print "where^the mayor ate often. To the East is the mayor's \ home.^"; if (self hasnt visited) print "^CROW: Hey, isn't the _street_ back to the east?^"; rtrue; ], n_to Restaurant, e_to [; if (self hasnt general) { give self general; print "^CROW: I thought the _street_ was back this way!^MIKE: \ Nope, apparently we were mistaken.^"; } return Mayors_House; ], s_to [; print "You can't go south from here!^"; return self; ], w_to [; print "You can't go west from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light scored; Object Restaurant "<< Restraunt >>" with description "You are about to enter the restraunt when two guys \ jump you.^The take your wallot and beat you a bit. \ Then you flash your badge^and that riles them. Your \ body was discovered in a river 10 miles away.^^\ MIKE: Man, that is one rough T.G.I. Friday's!", each_turn [; Deadflag = 1; ], has light; !*** The "restraunt" is one of many rooms in the game that kill the player !*** upon entry (Deadflag = 1). Since the player never gets a chance to !*** examine the room twice, there's no need to check if 'self has visited.' Object Mayors_House "<< Mayor's house >>" with description [; print "You are in the house, at the scene of the crime. You \ enter "; if (self hasnt visited) print "^^TOM: Didn't it just say we were already IN the house?!^^"; print "and flash^your badge before a cop. He admit's you. "; if (self hasnt visited) print "^^MIKE: [As your character] Where's the body?^CROW: [As \ the cop] I ate it.^^"; if ((self has visited) && (self hasnt general)) print "^^TOM: But he _already_ admitted us!^CROW: Why, Mike?! \ Why does it do this?!^MIKE: Shhh, it's okay, guys.^^"; print "To the north is the upstairs^"; if ((self has visited) && (self hasnt general)) print "^CROW: Gee, you'd think the upstairs would be UP from \ here!^^"; print "to the east is the living room and to the west is the \ dining room.^"; if (self hasnt visited) print "^TOM: I thought we just CAME from the west!^MIKE: I don't \ think this author quite grasped the concept of a two-way \ door.^"; rtrue; ], before [; if ((self has visited) && ((action==##Go) || (action==##Look))) give self general2; ], each_turn [; if ((self has visited) && (self has general2)) give self general; ], n_to Upstairs_Hallway, e_to Living_Room, w_to Dining_Room, s_to [; print "You can't go south from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light scored; Object Dining_Room "<< Dining Room >>" with description [; print "You are in the dining room. You look around and see a note \ on the table.^"; if ((parent(Paper_Note) ~= self) && (self hasnt general)) { give self general; print "^MIKE: The exact same note you picked up only moments \ before!^TOM: It's magic!^^"; } print "You can go back east.^"; if (self hasnt visited) { score = score + 5; "^CROW: Wow! A two-way door! We can go back! Check it out, Mike!^"; } rtrue; ], e_to Mayors_House, n_to [; print "You can't go north from here!^"; return self; ], s_to [; print "You can't go south from here!^"; return self; ], w_to [; print "You can't go west from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light; Nearby Paper_Note "paper note" with name "paper" "note", describe [; print "It is a note. With writing on it.^"; if (Dining_Room hasnt general2) { give Dining_Room general2; "^TOM: Any questions?^MIKE: Yeah. Could it technically be \ considered a note if it _didn't_ have^ writing on it?"; } rtrue; ], description [; print "The note was writen on a computer^"; if (self hasnt general) print "^MIKE: I think he means it was _typed_ on a computer.^^"; print "obviously this murder was planned^^and it says:^^"; if (self hasnt general) print "CROW: Wait a minute -- the MURDER says something?!^MIKE: \ I think he means the note.^TOM: It's hard to tell with \ this game.^^"; print "We have acclaimed Justice! The Justice of the future! Our \ next hit is the governer! You CAN'T STOP US!^^"; if (self hasnt general) print "MIKE: YOU CAN'T HANDLE THE TRUTH!!^CROW: Well, at least \ they're being nice and telling us ahead of time.^^"; print "The note sounds like the killers are a group^and that they \ are vigilantes^(look it up). "; if (self hasnt general) print "^^TOM: Right, this from Matt ~Restraunt~ Barringer.^^"; print "You are now getting a bit worried.^"; if (self hasnt general) { give self general; "^MIKE: Because you realize this game could potentially spawn a \ sequel.^CROW: Say it ain't so, Mike!!"; } rtrue; ], after [; Take: print "You are now carrying the paper note.^"; if (self hasnt general2) { give self general2; "^TOM: I'd like a note, please.^CROW: Paper or plastic, \ sir?^TOM: Paper, please."; } rtrue; ]; Object Living_Room "<< Living Room >>" with description [; print "You are standing in the living room. You see a battered \ piece of wood^You wonder ~Should I pick this thing up?~^"; if (self hasnt visited) print "^MIKE: Wow, it's like he's reading our minds.^^"; "Well, wether you do or don't the only way out of the room is back \ west."; ], w_to Mayors_House, n_to [; print "You can't go north from here!^"; return self; ], s_to [; print "You can't go south from here!^"; return self; ], e_to [; print "You can't go east from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light scored; Nearby Wooden_Wood "wooden wood" with name "wooden" "wood", initial "It is a battered brown piece of wood.", description [; print "You look at it closely and figure that the guys in the \ forsenic's lab would be better at this then you."; if (self hasnt general) { give self general; "^^TOM: Well, that'd be great if there actually WAS a forensics \ lab in this game."; } rtrue; ], after [; Take: print "You are now carrying the wooden wood.^"; if (self hasnt general2) { give self general2; "^CROW: Wooden wood -- as opposed to metal wood, stone \ wood, and plastic wood!"; } rtrue; ]; Object Upstairs_Hallway "<< Upstairs Hallway >>" with description [; print "You are in the hallway of the large house of the mayor. It \ is an^amazingly large house. "; if (self hasnt visited) print "^^CROW: The house is so large it is amazing.^TOM: You are \ amazed by how large the mayor's large house is.^MIKE: The \ amazing largeness of the mayor's large house amazes you.^^"; "You can go north, south, east or west."; ], s_to Mayors_House, w_to Closet_2, e_to Bathroom, n_to Hallway_1, nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light scored; Object Closet_2 "<< Closet>>" with description [; print "You are in a closet. The closet is of the walk in variety, \ with^about thirty pairs of tennis shoes, ten pairs of heels \ and about^ninety coats and shirts. "; if (self hasnt visited) print "^^TOM: None of which you can interact with, so don't \ bother trying.^^"; print "You start to get claustrophobia. "; if (self hasnt visited) print "^^CROW: Klaustrophobia? Let's play that instead!^^"; print "Better^get out.^"; if (self hasnt visited) "^TOM: Of this game."; rtrue; ], e_to Upstairs_Hallway, n_to [; print "You can't go north from here!^"; return self; ], s_to [; print "You can't go south from here!^"; return self; ], w_to [; print "You can't go west from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light; Object Bathroom "<< Bathroom >>" with description [; print "You are in the first bathroom, out of the 5 there is. "; if (self hasnt visited) print "^^TOM: Yes, there IS five bathrooms in this house.^CROW: \ I bet the mayor needed all those bathrooms because he had \ to--^MIKE: [Grabs Crow's beak and holds it shut.] Not \ another word, Crow.^^"; print "You notice^that it is almost as big as your apartment. "; if (self hasnt visited) print "^^TOM: Oh no, don't tell me you play Mitchell in this \ game!^CROW: Mitchell -- ask for him by name!^^"; "You see a knife on the floor^here."; ], w_to Upstairs_Hallway, n_to [; print "You can't go north from here!^"; return self; ], s_to [; print "You can't go south from here!^"; return self; ], e_to [; print "You can't go east from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light; Nearby Knife "knife" with name "knife", description [; print "You can't see that here.^"; if (self hasnt general) { give self general; "^MIKE: Yes, folks, the knife is right here in plain sight, but \ you can't see it."; } rtrue; ], before [; Take: print "You can't see that here.^"; if (self hasnt general2) { give self general2; "^TOM: Boy, where's Sergeant Duffy when you need him?"; } rtrue; ], has concealed scenery; Object Hallway_1 "<< Hallway >>" with description [; print "You are at the end of the hallway. To the north is a room, \ while^to the west is the rest of the hallway.^"; if (self hasnt visited) "^CROW: Except the part that's to the south."; if ((self has visited) && (self hasnt general)) "^TOM: Do you know who did it? Have you figured it out yet?"; rtrue; ], before [; if ((self has visited) && ((action==##Go) || (action==##Look))) give self general2; ], each_turn [; if ((self has visited) && (self has general2)) give self general; ], n_to Closet_3, w_to Hallway_2, s_to [; print "You can't go south from here!^"; return self; ], e_to [; print "You can't go east from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light; Object Closet_3 "<< Closet >>" with description [; print "You are in a closet. There is no reason to be in here.^"; if (self hasnt visited) print "^TOM: There is no reason to have this room in the game, \ but we put it here^ anyway.^^"; "Go south."; ], s_to [; if (self hasnt general) { give self general; print "^CROW: Ahh, coming out of the closet!^MIKE: Stop it, \ Crow.^"; } return Hallway_1; ], n_to [; print "You can't go north from here!^"; return self; ], e_to [; print "You can't go east from here!^"; return self; ], w_to [; print "You can't go west from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light; Object Hallway_2 "<< Hallway >>" with description [; print "You are in the hallway. To the north is more hallway, and \ to the east is^a door marked^~Guests~.^"; if (self hasnt visited) "^CROW: I'm starting to get really sick of this hallway.^MIKE: \ Patience, Crow. It can't go on forever.^CROW: Tell me about it."; rtrue; ], n_to Hallway_3, e_to Guest_Room_1, s_to [; print "You can't go south from here!^"; return self; ], w_to [; print "You can't go west from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light; Object Guest_Room_1 "<< Guest Room >>" with description [; print "You are in one of the many guest rooms. It is a nice room, \ big screen^TV in one corner, 2 king size beds in the back \ of the room, strategicly^placed so that you can see the TV \ while comfortably proped up in bed.^You see nothing of \ intrest, you should go west.^"; if (self hasnt visited) "^TOM: What?! He described all that just to tell us there's \ nothing to do here?!?^CROW: I still say this is Matt's best \ room description so far.^TOM: That's still not saying much."; rtrue; ], w_to Hallway_2, n_to [; print "You can't go north from here!^"; return self; ], s_to [; print "You can't go south from here!^"; return self; ], e_to [; print "You can't go east from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light; Object Hallway_3 "<< Hallway >>" with description [; print "You are STILL in the hallway. "; if (self hasnt visited) print "^^CROW: Aaaaarrgh! NO!! Get me outta here!!^^"; print "There is EVEN MORE hallway to the north,^"; if (self hasnt visited) print "^CROW: That's it. I'm leaving.^^[Crow tries to get up, \ but Mike holds him back.^^"; "and a room to the west and a room to the east of you."; ], e_to Closet_4, w_to Closet_5, n_to Hallway_4, s_to [; print "You can't go south from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light; Object Closet_4 "<< Closet >>" with description [; print "You are in a small closet. The room is bare. Why not go \ east and get^back to the situation at hand?^"; if ((self hasnt visited) && (Closet_5 hasnt visited)) "^TOM: What the...? We came in here from the WEST!^CROW: Try \ going east."; if (((self has visited) || (Closet_5 has visited)) && (Hallway_3 hasnt general)) { give Hallway_3 general; "^CROW: [Ominous] We have entered the mysterious Closets of \ Teleportation!^MIKE: Beam us up, Scotty."; } ], e_to Hallway_3, n_to [; print "You can't go north from here!^"; return self; ], s_to [; print "You can't go south from here!^"; return self; ], w_to [; print "You can't go west from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light; Object Closet_5 "<< Closet >>" with description [; print "You are in a closet. There is no reason to be in here. \ Go west.^"; if ((self hasnt visited) && (Closet_4 hasnt visited)) "^TOM: What the...? We came in here from the EAST!^CROW: Try \ going west."; if (((self has visited) || (Closet_4 has visited)) && (Hallway_3 hasnt general)) { give Hallway_3 general; "^CROW: [Ominous] We have entered the mysterious Closets of \ Teleportation!^MIKE: Beam us up, Scotty."; } ], w_to Hallway_3, n_to [; print "You can't go north from here!^"; return self; ], s_to [; print "You can't go south from here!^"; return self; ], e_to [; print "You can't go east from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light; Object Hallway_4 "<< Hallway >>" with description [; print "You are still in the hallway. "; if (self hasnt visited) print "^^CROW: AAAARRRGGHHH!! MAKE IT STOP, MAKE IT STOP, MAKE \ IT STOP--^^[Mike pats Crow's shoulder reassuringly until \ he calms down.]^^"; print "You can go north to where there is a police officer who \ will let you outside, or you can go east or west.^"; if (self hasnt visited) "^CROW: North! Go north! Get us out of here!!"; rtrue; ], e_to Guest_Room_2, w_to Bedroom, n_to Outside_3, s_to [; print "You can't go south from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light; Object Guest_Room_2 "<< Guest Room >>" with description [; print "You are in a guest room. You see that there isn't much \ here,^the murderers ransacked the room. "; if (self hasnt visited) print "^^MIKE: Yet for some reason they didn't touch the big \ screen TV in the OTHER guest^ room!^^"; "You can go west."; ], w_to Hallway_4, n_to [; print "You can't go north from here!^"; return self; ], s_to [; print "You can't go south from here!^"; return self; ], e_to [; print "You can't go east from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light; Object Bedroom "<< Bedroom >>" with description [; print "You are in the bedroom. You noticed that there was a guard^\ guarding the stairs to the 3rd story, "; if (self hasnt visited) print "^^MIKE: Yeah, that's what guards typically do. They guard \ things.^CROW: Hence the name.^^"; print "because there is remodelling going^on there. "; if (self hasnt visited) print "^^TOM: And remodelling is far more important than some \ petty murder investigation.^^"; "You see nothing of importance. Go east."; ], e_to Hallway_4, n_to [; print "You can't go north from here!^"; return self; ], s_to [; print "You can't go south from here!^"; return self; ], w_to [; print "You can't go west from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light scored; Object Outside_3 "<< Outside >>" with description [; if (self hasnt visited) print "^^CROW: Oh, thank God that hallway's over with!^^"; print "You pass the guard. He nods at you. You are now outside \ standing^on the street. "; if ((self has visited) && (self hasnt general)) print "^^TOM: Hey, guys, I just thought I'd point out once again \ how this game blends the^ room, object, and character \ descriptions into a muddled mess.^MIKE: Thanks for the \ reminder, Tom.^^"; print "You can go north and east, your choice.^"; if (self hasnt visited) print "^MIKE: It's good when a game lets players make a choice \ like this.^CROW: Matt Barringer made a wise creative \ decision here.^^"; "To the north is more of the street, and to the east is a video \ store."; ], before [; if ((self has visited) && ((action==##Go) || (action==##Look))) give self general2; ], each_turn [; if ((self has visited) && (self has general2)) give self general; ], n_to Dead_End_1, e_to Video_Store_1, s_to [; print "You can't go south from here!^"; return self; ], w_to [; print "You can't go west from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light scored; Object Dead_End_1 "<< Dead end >>" with description [; print "You are at a dead end. You can go south, or west. Which \ way?^"; if (self hasnt visited) "^TOM: Mike, is it really a dead end if you can go 2 ways?"; rtrue; ], s_to Outside_3, w_to Murderers_Lounge, n_to [; print "You can't go north from here!^"; return self; ], e_to [; print "You can't go east from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light; Object Murderers_Lounge "<< Murderer's lounge >>" with description "You are in the so called ~Murderers Lounge~. \ Unfortunatly,^there ARE murderers here, and when you \ check around, they get angry.^But, that's life. Ya \ lose!^^TOM: And that's death.^CROW: But it's nice to \ know that this city has establishments that cater^ \ exclusively to criminals.^MIKE: No weapon, no criminal \ record, no service!", each_turn [; Deadflag = 1; ], has light; Object Video_Store_1 "<< Video Store >>" with description [; print "You are in a video store called^Brickbuster Video.^"; if (self hasnt visited) print "^MIKE: Let's make it a Brickbuster night!^^"; print "There are about 3,000 videos here. "; if ((self has visited) && (self hasnt general)) print "^^CROW: Wonder if they have ~Caligula?~^MIKE: Crow!^TOM: \ Or maybe ~Mandingo.~^MIKE: Tom!^^"; print "You can go north, or east.^"; if (self hasnt visited) "^TOM: But the door you came through has mysteriously \ disappeared.^MIKE: Hey, that really deters late-night \ robberies."; rtrue; ], before [; if ((self has visited) && ((action==##Go) || (action==##Look))) give self general2; ], each_turn [; if ((self has visited) && (self has general2)) give self general; ], n_to Backroom, e_to Video_Store_2, s_to [; print "You can't go south from here!^"; return self; ], w_to [; print "You can't go west from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light; Object Backroom "<< Backroom >>" with description [; print "You are in the backroom of Brickbuster Video. "; if (self hasnt visited) print "^^CROW: [Little kid voice] I hafta go to the backroom!^^"; print "You see a small video^on the floor, but you dismiss it as \ having no potential value to the^crime. "; if (self hasnt visited) print "^^MIKE: Boy, _nothing_ in this game is connected to the \ crime!^CROW: What crime were we supposed to be \ investigating, again?^MIKE: You've got me, Crow.^^"; "You can go south."; ], s_to Video_Store_1, n_to [; print "You can't go north from here!^"; return self; ], e_to [; print "You can't go east from here!^"; return self; ], w_to [; print "You can't go west from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light; Object Video_Store_2 "<< Video Store >>" with description [; print "You are still in the video store. You can go north, or \ east.^"; if ((Outside_4 has visited) && (self hasnt general)) { give self general; "^CROW: What the...? I thought we were OUTSIDE before!"; } rtrue; ], n_to Closet_6, e_to Outside_4, s_to [; print "You can't go south from here!^"; return self; ], w_to [; print "You can't go west from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light scored; Object Closet_6 "<< Closet>>" with description [; print "You are in a closet. There is no use for being here. Gotta \ go south.^"; if (self hasnt visited) "^TOM: Why do I get the feeling that Matt Barringer is just \ padding out the game?"; rtrue; ], s_to Video_Store_2, n_to [; print "You can't go north from here!^"; return self; ], e_to [; print "You can't go east from here!^"; return self; ], w_to [; print "You can't go west from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light; Object Outside_4 "<< Outside >>" with description [; print "You are outside. You can go north, south, east, or west.^"; if ((self has visited) && (self hasnt general)) "^MIKE: You know, it's the vivid descriptions that make this \ game come alive."; rtrue; ], before [; if ((self has visited) && ((action==##Go) || (action==##Look))) give self general2; ], each_turn [; if ((self has visited) && (self has general2)) give self general; ], w_to Video_Store_2, s_to McDonalds, e_to House, n_to Outside_5, nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light; Object McDonalds "<< McDonalds >>" with description [; if (self hasnt visited) print "^CROW: Boy, I could really go for a hamburger sandwich \ and some French-fried^ potatoes!^^"; print "You are in a McDonalds. You pay the guy behind the counter. "; if (self hasnt visited) print "^^MIKE: Shouldn't you have ordered first?^TOM: Nah, this \ is fast food. It all tastes the same.^^"; print "Now there^is a hamburger there. "; if ((parent(Food_Hamburger) ~= self) && (self hasnt general2)) { give self general2; print "^^TOM: By an astounding coincidence, it's the same one \ you picked up earlier!^CROW: This could solve the world \ hunger problem in no time!^^"; } "When you have picked it up, go north."; ], n_to [; if (self hasnt general) { give self general; print "^CROW: Hey, Mike, I just noticed that no one killed us in \ that restaurant.^MIKE: Those thugs probably find fast-\ food franchises to be too low-class.^"; } return Outside_4; ], s_to [; print "You can't go south from here!^"; return self; ], e_to [; print "You can't go east from here!^"; return self; ], w_to [; print "You can't go west from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light scored; Nearby Food_Hamburger "food hamburger" with name "food" "hamburger" "burger", initial "It is a hamburger wrapped in cheap paper.", description [; print "It is a hamburger. If you eat it you'll have satisfied that \ little hunger in your stomach. Go North.^"; if (self hasnt general) { give self general; "^CROW: Umm, well, you can go north assuming you're still in \ the McDonald's."; } ], after [; Take: print "You are now carrying the food hamburger."; if (self hasnt general2) { give self general2; "^^CROW: Is that anything like ~wooden wood?~^TOM: No, \ ~wooden wood~ is redundant, whereas callling a \ McDonald's hamburger^ ~food~ is an oxymoron.^CROW: \ Ah."; } rtrue; Eat: "The hamburger slides down your throat, and your stomach is \ quickly full.^^TOM: So how many hamburgers can you eat on an \ empty stomach?^MIKE: Only one. After that your stomach \ isn't empty!^TOM: D'OH!!"; ], has edible; Object House "<< House >>" with description "You enter the house. A man charges down the stairs. \ Before you even have^time to say anything, he shoots \ you. You lose!^^CROW: Once again, the social effects \ of listening to Ice-T's ~Cop Killer~ song.", each_turn [; Deadflag = 1; ], has light; Object Outside_5 "<< Outside >>" with description [; print "You are still outside. You hit a dead end, then notice that \ you can go east only.^"; if (self hasnt visited) "^CROW: Mike, I'm lost. Where are we?"; rtrue; ], e_to Music_Store_1, n_to [; print "You can't go north from here!^"; return self; ], s_to [; print "You can't go south from here!^"; return self; ], w_to [; print "You can't go west from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light scored; Object Music_Store_1 "<< Music Store >>" with description [; print "You are in a music store. "; if (self hasnt visited) print "^^TOM & CROW: No! NO!! NO!!^CROW: Not Mr. B Natural \ again!^TOM: Make it stop, Mike!!^^"; print "You ask the man behind the counter if he^knew any \ information.^"; if (self hasnt visited) print "^MIKE: So are we just grasping at straws now?^^"; print "~Uhh...nope! But the guy back there might be able ta help.~^\ You politly thank him and head to the back. You can only go \ north.^"; if (self hasnt visited) "^TOM: So, was that man behind the counter the STAFF of the \ music store? Staff?^ Get it?^MIKE & CROW: [Groan]"; rtrue; ], n_to Back_of_Music_Store, s_to [; print "You can't go south from here!^"; return self; ], e_to [; print "You can't go east from here!^"; return self; ], w_to [; print "You can't go west from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light scored; Object Back_of_Music_Store "<< Back of Music Store >>" with description [; print "You are in the back of the music store. "; if (self hasnt visited) print "^^MIKE: Just like the name of this room says.^^"; print "You ask the guy who's looking^at the cool tapes.^"; if ((Man has general2) && (self hasnt general)) print "^TOM: Hey, you know anything about the guy I just killed? \ Did he maybe kill the^ mayor, or something?^^"; print "He looks up at you.^~Duh.. no...don't t'ink so...lemme \ see...~^"; if ((Man has general2) && (self hasnt general)) { give self general; print "^TOM: Well, thanks anyway.^^"; } if (self hasnt visited) print "^CROW: So what exactly did we ask him about?^^"; "You decide that he's no help. To the west there is a dazed \ looking man^and to the north there is an exit."; ], w_to Music_Store_2, n_to Alley, s_to [; print "You can't go south from here!^"; return self; ], e_to [; print "You can't go east from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light scored; Object Music_Store_2 "<< Music Store >>" with description [; print "You walk over to the guy. "; if ((Man has general2) && (self hasnt general)) { give self general; print "^^TOM: He's already dead and gone, but you walk over to \ him anyway.^^"; } print "He jumps up with a wild look, and says^Freeze!~ You stop. \ He motions you to the exit.^"; if (self hasnt visited) print "^MIKE: So he doesn't want you to move, yet he wants you \ to leave?^^"; print "But you know he'll probably just kill you. You NEED to get \ the weapon^from him or kill him. Best chance: use your \ gun.^"; if (self hasnt visited) "^CROW: Assuming you brought it with you, of course."; rtrue; ], after [; if (Man hasnt general2) StartDaemon(Man); ], e_to [; if (Man hasnt general2) { print "The man blocks your way and will not let you leave!^"; return self; } return Back_of_Music_Store; ], n_to [; print "You can't go north from here!^"; return self; ], s_to [; print "You can't go south from here!^"; return self; ], w_to [; print "You can't go west from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light; Nearby Man "man" with name "dazed" "man" "guy", initial [; print "He is a dazed guy. "; if (self hasnt general) { give self general; print "^^MIKE: The 60's were good to him.^^"; } "He says ~One more minute mom!~"; ], description "He is a dazed guy. He says ~One more minute mom!~", number 3, daemon [ t; if (self has general2) { StopDaemon(self); rtrue; } t = self.number - 1; self.number = t; if ((self hasnt general2) && (t ~= 0)) print "^The man seems to be getting angrier!^"; if (t == 0) { Deadflag = 1; "The man seems to calm down for a moment,^but suddenly attacks.^\ Its mouth opens to reveal^teeth grotesquely out of proportion \ to the rest^of its body, a fact you notice as those same^teeth \ tear your flesh into tiny pieces.^^TOM: What the...?^CROW: Are \ we in a different game all of a sudden?!^MIKE: Folks, we have \ no idea what's going on here, so just undo that last move^ \ and forget about it."; } ], before [; Attack: if (parent(Black_Gun) == player) { StopDaemon(self); give self general2; remove self; "You aim the gun at the man and pull the trigger.^It's a \ direct hit!^The man screeches angrily, and writhes in \ agony and^fades away in a cloud of green smoke.^^CROW: \ Oh, so he was the thief from Zork!^MIKE: Or maybe the \ troll.^TOM: So was that supposed to be the exciting \ part?^CROW: No, but it _was_ the game's first puzzle.^\ MIKE: Boy, Matt Barringer is the Coleman Francis of \ Interactive Fiction.^TOM: This makes ~Space Aliens \ Laughed at my Cardigan~ look like ~Trinity.~^MIKE: Hey, \ I kind of liked ~Space Aliens.~^CROW: So, if ~Space \ Aliens~ is Infocom on acid, what's this?^TOM: Oh, this \ is Infocom drunk and passed out on the couch."; } ], has animate; !*** The game's (only) puzzle makes use of a simple daemon (a timer attached !*** to an object, which has some effect each turn). The daemon is activated !*** when the player enters the room with the man in it (Music_Store_2). !*** The daemon has a counter of 3 moves. A message about the man getting !*** angrier appears each turn the player is in the room (and he can't leave !*** without killing the man first). Also each turn, the timer variable 't' !*** is decreased by one, and the new value is added to the number of moves !*** left in the daemon's counter. When the time runs out, the man attacks !*** and kills the player. If the player shoots the man first, the daemon !*** is permanently stopped and the man is removed from the room (but he !*** still appears in the room description! B-). Object Alley "<< Alley >>" with description [; print "You are in an alley. A drunken man stagers up to you and \ says^Boycott FDR~ .~^You just walk away. "; if (self hasnt visited) print "^^MIKE: What was THAT all about?^^"; "You can go north, east or west. Your call."; ], w_to Mob_House, e_to Drug_House, n_to Police_Station, s_to [; print "You can't go south from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light scored; Object Mob_House "<< Mob House >>" with description "You enter the infamous ~Mob House~.^^CROW: Of pancakes.\ ^^When you enter a hugh quiets the^room as guys in \ ugly pin striped suits look over at you. Fearing for^\ your live, you turn to run away. But before you can do \ that, a big thug^comes by with a .44 and shoots you in \ the head. A grisly death, for sure.^^MIKE: Gee, you'd \ think the Chief would've told you where these places \ were, so^ you could avoid them.", each_turn [; Deadflag = 1; ], has light; Object Drug_House "<< Drug House >>" with description "You are in a druggies house.^^CROW: Of pancakes.^^Guys \ look over at you.^~Hey~ It's a cop! Get 'im!~ One \ yells.^^TOM: So how come these guys know you're a cop, \ but the guys who jumped you in^ the restaurant \ didn't know until you flashed your badge?^^They all \ grab their guns^and aim' em at you. When the police \ find you 2 days later, you are^scattered across the \ room - literally.^^TOM: So why didn't the other cops \ get shot when they came in?", each_turn [; Deadflag = 1; ], has light; Object Police_Station "<< Police Station >>" with description [; print "You are in the 3rd precinct police station. This isn't your \ station.^"; if (self hasnt visited) print "^MIKE: So don't put your feet up on the desks.^^"; print "You get admitance from the guy at the desk^and go to the \ holding cells.^You ask each offender if they know anything. "; if (self hasnt visited) print "^^TOM: Man, you ARE getting desperate!^^"; if ((self has visited) && (self hasnt general)) print "^^CROW: [Rocket J. Squirrel voice] Again?!^^"; print "You promise a lighter^sentance for the ones who help. "; if ((self has visited) && (self hasnt general)) print "^^MIKE: Do you have the authority to do that?^^"; print "But one guy really sets you straight.^~I got caught wit' \ t'ree ounces o'crack. "; if (self hasnt visited) print "^^CROW: Okay, so we've got crack _and_ FDR. What decade \ is this supposed to be?^^"; print "I'm supposed to get 20 years^but I'll be out in 2."; if (self hasnt visited) print "^^TOM: [As the prisoner] Cuz I've started diggin' this \ tunnel so I can-- [As if^ covering his mouth to keep \ from saying any more] oop--Damn!^^"; print "You can't make me talk cuz it don't matter to me.^If I \ squeal, da guys "; if ((self has visited) && (self hasnt general)) print "^^ALL: DA Bears!^^"; "who did it are gonna come lookin' for me. I know^but I ain't \ gonna tell ya. Now git outta my face.~^You are surprised but \ used to it.^You can go north to the outside, south to go back to \ the alley^and west or east to talk to more guys."; ], before [; if ((self has visited) && ((action==##Go) || (action==##Look))) give self general2; ], each_turn [; if ((self has visited) && (self has general2)) give self general; ], s_to Alley, e_to Holding_Cells_1, w_to Holding_Cells_2, n_to Outside_6, nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light scored; Object Holding_Cells_1 "<< Holding Cells >>" with description [; print "You are talking to more guys. But none tell you what you \ need to know. You can only go west.^"; if ((self hasnt visited) && (Holding_Cells_2 hasnt visited)) "^[Tom and Crow simply start snickering at this.]"; rtrue; ], w_to Police_Station, n_to [; print "You can't go north from here!^"; return self; ], s_to [; print "You can't go south from here!^"; return self; ], e_to [; print "You can't go east from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light; Object Holding_Cells_2 "<< Holding Cells >>" with description [; print "You are talking to more guys. But none of them tell you \ what you need to know. You can only go east.^"; if ((self hasnt visited) && (Holding_Cells_1 hasnt visited)) "^[Tom and Crow simply start snickering at this.]"; rtrue; ], e_to Police_Station, n_to [; print "You can't go north from here!^"; return self; ], s_to [; print "You can't go south from here!^"; return self; ], w_to [; print "You can't go west from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light; Object Outside_6 "<< Outside >>" with description [; print "You are outside. It's bitter cold and you pull your jacket \ around^yourself. To the north is a nice, warm Holiday Inn \ hotel, where^the killer is rumored to be staying. "; if (self hasnt visited) print "^^ALL: WHAT?!?^CROW: Where did we hear THAT?!^^"; print "Or you could go to his favorite^hang out, the Wall, to the \ west, or to the east is the place where he is^supposed to \ be working, the Doughnut King.^"; if (self hasnt visited) "^MIKE: Wow! And we figured all that out just by entering this \ room!^TOM: That was first-class detective work!"; rtrue; ], w_to The_Wall, e_to Doughnut_King, n_to Holiday_Inn, s_to [; print "You can't go south from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light scored; Object The_Wall "<< The Wall >>" with description [; if (self hasnt visited) print "^ALL: [Sing] ~We don't need no ed-u-ca-tion!~^^"; print "You don't see him here. You ought to go east.^"; if (self hasnt visited) "^CROW: Wow! We entered a building without getting killed!^TOM: \ So how would we recognize the killer if we saw him? We don't \ even know who^ he is!"; rtrue; ], e_to Outside_6, n_to [; print "You can't go north from here!^"; return self; ], s_to [; print "You can't go south from here!^"; return self; ], w_to [; print "You can't go west from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light scored; Object Doughnut_King "<< Doughnut King >>" with description [; if (self hasnt visited) print "^MIKE: ~Cops~ is filmed live on location at Doughnut \ King!^^"; print "You are in the Doughnut King, where the greasiest doughnuts \ on earth^reside. He isn't here, no one seems to be for that \ matter, so you should^go west.^"; if (self hasnt visited) "^TOM: You mean no one's here, and they just left the doors \ wide open?!^CROW: Cool! Free coffee for everyone!^MIKE: [Coffee \ Guy voice] Coffee? I like coffee!"; rtrue; ], w_to Outside_6, n_to [; print "You can't go north from here!^"; return self; ], s_to [; print "You can't go south from here!^"; return self; ], e_to [; print "You can't go east from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light scored; Object Holiday_Inn "<< Holiday Inn >>" with description [; print "You are in the Holiday Inn registration room. You talk to \ some^suspicious guys, but they don't talk until you hold \ your gun to there side^~Allright! Allright! I'll talk! He's \ on the 15th floor! That's all I can^tell ya!~^"; if (self hasnt visited) print "^TOM: Geez, now you ARE acting like Mitchell!^^"; print "You shove them away. you walk up to the registration desk \ and show the^woman there your badge. "; if ((self has visited) && (self hasnt general)) print "^^MIKE: [As your character] See my badge? Got my picture \ on it and everything.^ Cool, huh?^^"; print "She gives you the master ring. "; if (self hasnt visited) print "^^CROW: [Ominous] One Ring to bring them all and in the \ darkness bind them!^^"; print "You now have^access to all of the facilitys on the 15th \ floor."; if ((self has visited) && (self hasnt general)) print "^^CROW: Good thing, too, because you don't think you can \ hold it much longer.^TOM: Should've gone back at the \ mayor's house.^^"; print "But the problem^is that the 15th floor is the suite level, \ and there are 30 suites, and^5 pools, 2 saunas and 5 game \ rooms. Big problem! Well,^you have all night. You get a \ picture of all on the 15th floor,^the people up there have \ to show there drivers license to be admitted,^and the \ license is secretly xeroxed. "; if (self hasnt visited) print "^^ALL: WHAT?!?^MIKE: Uh...folks, we're completely lost \ here too.^CROW: At this point the game has finally thrown \ up its hands and said, ~I just^ don't know.~^^"; "You look at them all. Well, better^get started. You see one \ person who stands out. You get his room^number from the lady. \ Room 30. Now you have to find it. To get^started, go north."; ], before [; if ((self has visited) && ((action==##Go) || (action==##Look))) give self general2; ], each_turn [; if ((self has visited) && (self has general2)) give self general; ], n_to Holiday_Inn_15th_Floor, s_to [; print "You can't go south from here!^"; return self; ], e_to [; print "You can't go east from here!^"; return self; ], w_to [; print "You can't go west from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light scored; Object Holiday_Inn_15th_Floor "<< Holiday Inn 15th Floor >>" with description [; print "You go up the elevator. When you step out, you see the \ wallpaper^is pink, with little flowers on it. "; if (self hasnt visited) print "^^TOM: You're a detective, so you're trained to notice \ stuff like that.^^"; if ((self has visited) && (self hasnt general)) print "^^MIKE: Okay, guys, at this point we need to start \ piecing together the^ information we've gathered. So \ let's make a list of what we've learned.^TOM: Well, we've \ learned that the mayor has been murdered.^MIKE: Right. \ Anything else?^CROW: Ummm...no, I think Tom pretty much \ covered everything.^MIKE: Okay, let's get moving then.^^"; "You can go east or west."; ], before [; if ((self has visited) && ((action==##Go) || (action==##Look))) give self general2; ], each_turn [; if ((self has visited) && (self has general2)) give self general; ], e_to Dead_End_2, w_to Hallway_5, n_to [; print "You can't go north from here!^"; return self; ], s_to [; print "You can't go south from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light scored; Object Dead_End_2 "<< Dead End >>" with description [; print "You hit a dead end. There is a fire extinguesher here, but \ it is of no^importance to you. "; if (self hasnt visited) print "^^CROW: Because we didn't want to spend time implementing \ it.^MIKE: I bet Matt Barringer spent a whole hour writing \ this game.^TOM: And no time at all testing it.^^"; "You can only go west."; ], w_to Holiday_Inn_15th_Floor, n_to [; print "You can't go north from here!^"; return self; ], s_to [; print "You can't go south from here!^"; return self; ], e_to [; print "You can't go east from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light; Object Hallway_5 "<< Hallway >>" with description [; if (self hasnt visited) print "^CROW & TOM: No! No! Not MORE hallways!! Aaaaagh!!^^"; print "You are in the hallway. You see many doors...1...2...3...\ 4...5...6....7^"; if (self hasnt visited) print "^MIKE: [Looking behind him] Huh? Are the theater doors \ closing?^^"; print "boy, you have a long way to go. You can only go north.^"; if (self hasnt visited) "^MIKE: But you can go north for a long way."; rtrue; ], n_to Hallway_6, s_to [; print "You can't go south from here!^"; return self; ], e_to [; print "You can't go east from here!^"; return self; ], w_to [; print "You can't go west from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light scored; Object Hallway_6 "<< Hallway >>" with description [; print "You are still in the maze of hallways. You can go west or \ east.^"; if (self hasnt visited) "^CROW: Man, these hallways are the I-F equivalent of ~rock \ climbing.~^ALL: DEEEEP HURRRRRTING! DEEEEEP HUURRRRRRTING!!"; rtrue; ], e_to Dead_End_3, w_to Hallway_7, n_to [; print "You can't go north from here!^"; return self; ], s_to [; print "You can't go south from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light scored; Object Dead_End_3 "<< Dead End >>" with description "You are at a dead end. there is nothing to do but go \ west.", each_turn [; Deadflag = 1; ], has light; !*** This room is a special case. There's no explanation whatsoever for the !*** player's sudden death here, but I wanted the comments to appear after !*** the "*** You have died ***" message. It was necessary to modify !*** VERBLIB.H for this to take effect, so the comments for this room appear !*** there rather than in this room object's code. Object Hallway_7 "<< Hallway >>" with description [; print "You are in the hallway. You see numbers flash by as you run \ through the^halls. 19.."; if (self hasnt visited) print "^^CROW: Hit me.^^"; print "20.."; if (self hasnt visited) print "^^CROW: Hit me.^^"; print "21.."; if (self hasnt visited) print "^^CROW: Hit me.^^"; print "22.. "; if (self hasnt visited) print "^^CROW: Damn, I'm busted.^TOM: Can _I_ hit him, Mike? \ PLEASE??^MIKE: Sit tight, guys. It's almost over.^^"; "you are getting close! You can only go north."; ], n_to Hallway_8, s_to [; print "You can't go south from here!^"; return self; ], e_to [; print "You can't go east from here!^"; return self; ], w_to [; print "You can't go west from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light scored; Object Hallway_8 "<< Hallway >>" with description [; print "You are in the hallway. You fell the heat from the sauna to \ the west,^and to the east is a door marked^~Pool A~. To the \ north is more hall.^"; if (self hasnt visited) "^TOM: Man, I'm starting to long for the good old days of Bert \ I. Gordon, Roger^ Corman, and Sandy Frank."; rtrue; ], e_to Pool, w_to Sauna, n_to Room_30, s_to [; print "You can't go south from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], u_to [; print "You can't go up from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light scored; Object Pool "<< Pool >>" with description "You are in the pool when the killer shoots you from \ behind! You lose!^^CROW: But we just wanted to check \ out the room!", each_turn [; Deadflag = 1; ], has light; Object Sauna "<< Sauna >>" with description "You are in the sauna when from the steam steps the \ killer.^^MIKE: Man, that killer is EVERYWHERE!^CROW: \ Like God.^TOM: Only evil.^MIKE: But he does have the \ same aura of mystery about him.^^You realize the guys \ downstairs must have tipped him off.^^CROW: The first \ indication that the author has looked back at any of \ his^ previous writing!^^~So ya thought ya could \ get me eh?~^He flashes a gun. Well, let's not get into \ details.^^TOM: Yeah, why start now, this close to the \ end?^^You lose.", each_turn [; Deadflag = 1; ], has light; Object Room_30 "<< Room # 30 >>" with description [; print "You enter room 30...after a harrowing gun battle you conk \ him on the head^and take him in."; if (self hasnt visited) print "^^TOM: What the...?^CROW: That's IT?!?^TOM: We sat \ through the whole game for THIS?!?!^^"; if ((self has visited) && (self hasnt general)) print "^^MIKE: Yep, this is the kind of ending that you want to \ read twice.^^"; print "You get promoted and suddenly, with the ~Jurassic Park~^\ theme song playing in your head, you feel proud to be an \ American.^"; if (self hasnt visited) print "^TOM: So you go home and watch the Whitewater hearings \ and the O.J. Simpson trial^ until the feeling passes.^\ CROW: And now we've got ~Jurassic Park~ and FDR!^^"; print "For special info about Exile Games, and to leave this \ darned game, press^up.^"; if (self hasnt visited) "^CROW: Uh, guys...~darned~ isn't exactly the adjective \ I'd choose here."; rtrue; ], before [; if ((self has visited) && ((action==##Go) || (action==##Look))) give self general3; ], each_turn [; if ((self has visited) && (self has general3)) give self general; if (self hasnt general2) { give self general2; score = score + 100; } ], u_to Info, n_to [; print "You can't go north from here!^"; return self; ], s_to [; print "You can't go south from here!^"; return self; ], e_to [; print "You can't go east from here!^"; return self; ], w_to [; print "You can't go west from here!^"; return self; ], nw_to [; print "You can't go northwest from here!^"; return self; ], ne_to [; print "You can't go northeast from here!^"; return self; ], sw_to [; print "You can't go southwest from here!^"; return self; ], se_to [; print "You can't go southeast from here!^"; return self; ], d_to [; print "You can't go down from here!^"; return self; ], has light; Object Info "<< Info >>" with description "Exile Games is a group of people who like text games.^^\ CROW: But just aren't very good at making them.^^We \ plan to get into graphic games sometime in 1995.^^TOM: \ God help us all.^^We don't ask for money, we just want \ to know if you like it or not.^^TOM: For the last time, \ we don't!^MIKE: If I remember right, they DID ask for \ money way back at the start.^^Our support BBS is (510) \ 208-5657, the Ghostbuster Central BBS>^^MIKE: Who ya \ gonna call?^ALL: GHOSTBUSTERS!^^We have accounts on \ CompuServe and Prodigy.^Exile Games is currently made \ up of:^^Matt Barringer, president and head programmer \ ^^ALL: All hail, Matt Barringer!^^Nathaniel Smith, \ advisor^^TOM: [As Nathaniel Smith] Hey, guys, let's \ make a really crappy text adventure^ with no \ puzzles in it!^^Kurt Somogue, assistent programmer,^^\ CROW: If you ever meet any of these people, please do \ us all a favor and put^ them out of their misery.^^\ And all the users of the Ghostbuster Central BBS, who \ give me ideas!^^MIKE: Uh...Matt, buddy, I think it's \ time you got yourself some new idea people.^^*** \ Congratulations. You have won the game. ***^^MIKE: And \ the crowd goes wild!^ALL: [Subdued] Yaaaaay.", each_turn [; Deadflag = 2; print "CROW: So, do you think this game was hard-boiled, like Dr. \ Forrester said?^TOM: No, I personally thought it was over-\ easy!^MIKE: D'OH!!^CROW: Lemme at him, Mike! Lemme at him!^^\ [Crow tries to attack Tom, but Mike stops him.]^^TOM: So \ did either of you guys see anything here remotely connected \ to^ detectives?^MIKE: Nope, can't say I did.^CROW: You \ know, the AGT parser was _ideal_ for making this game.^\ MIKE: I wonder if Matt Barringer ever considered making the \ killer more^ realistic. Like, I dunno, maybe giving \ him a _name_, or something.^CROW: I think there are some \ questions better left unasked.^MIKE: That's a good point, \ Crow.^^[Tom sidles over into Mike's lap.]^^TOM: Well, \ c'mon, guys, we gotta go.^MIKE: I still liked this game WAY \ better than ~Leather Goddesses of Phobos 2.~^TOM: Oh, yeah, \ definitely.^CROW: Shut up, Servo. That's not funny!^TOM: \ Geez, what's _your_ problem?^^[Mike and the bots leave the \ theater.]^^1...2...3...4...5...6...G..."; print "^^[SOL]^^[Mike and the bots are in their usual places.]^^\ MIKE: Well, when you come right down to it, I thought the \ writing was one of the^ strong points of this game.^\ TOM: Oh, for me it was the intense and addictive gameplay \ that just left you^ begging for more.^CROW: You guys \ are CRAZY, you know that? Just plain no-holds-barred^ \ out-of-your-minds seats-of-honor-at-the-local-funny-farm-\ convention CRAZY!^ This game was terrible! It was \ torture! I mean, LOOK AT IT!! You get sent^ to \ investigate the mayor's murder, but you never see his body \ or even^ learn his name, and his house is scattered \ with weird useless items^ preceded by stupid \ adjectives, including a knife that's there but you^ \ CAN'T EVEN PICK IT UP!! Then you go through about a million \ hallways^ that never lead anywhere, closets that \ TELEPORT YOU AROUND LIKE THE^ STARCROSS DISKS, AND IN \ HALF THE ROOMS YOU GET KILLED SIMPLY BY ENTERING^ \ THEM, AND WITH ONE OF THEM YOU LEARN EVERYTHING THERE IS TO \ KNOW ABOUT^ THE KILLER SIMPLY BY ENTERING IT, AND THEN \ YOU RUN THROUGH A MILLION^ _MORE_ STUPID HALLWAYS AND \ YOU CATCH THE KILLER AND THAT'S THE _END_!!!^ BUT YOU \ ONLY CATCH _ONE_ KILLER, AND THERE'S A NOTE IN THE MAYOR'S \ HOUSE^ THAT SAYS THEY'RE A _GROUP_ OF VIGILANTES AND \ THEN MATT BARRINGER TELLS^ US TO LOOK IT UP WHEN IT'S \ PAINFULLY OBVIOUS THAT HE HAS AN EVEN SMALLER^ \ VOCABULARY THAN THIS GAME!!!!! AND THEN THERE'S THE SCENE \ IN THE CELLS^ WHERE YOU JUST ASK EVERYONE IF THEY KNOW \ ANYTHING!!!! AND THE MUSIC^ STORE!!! WHAT THE _HELL_ \ WAS THE POINT OF KILLING THE GUY IN THE MUSIC^ \ STORE?!?!? NOTHING MADE _ANY_ SENSE, I TELL YOU!!!!!! AND \ WHEN IT'S ALL^ OVER, YOU DON'T EVEN KNOW _WHY_ OR \ _HOW_ THE KILLER DID IT!!!!!!!"; print "^^[Crow continues babbling incoherently.]^^TOM: Wow, sounds \ like he's taking this pretty hard.^MIKE: Well, I know what \ will cheer him up. [Goes over to Gypsy at one of the^ \ computers.] Gypsy's been working on another game while \ we've been in the^ theater.^GYPSY: Yaaaay! ~Richard \ Basehart Adventure II!~ Yaaaaaaay!!^MIKE: C'mon, check it \ out, Crow!^CROW: NO!! YOU KEEP THAT THING AWAY FROM ME!! \ I'M NEVER TOUCHING ANOTHER TEXT^ ADVENTURE AGAIN -- \ NEVER, EVER, EVER, AS LONG AS I LIVE, AND YOU CAN'T^ \ MAKE ME!!!!^^[Crow storms off the set.]^^MIKE: Gee, sounds \ like Crow's a little upset.^^[The mads' light flashes.]^^\ MIKE: Well, I hope you're happy, Dr. F, now that you've \ alienated him from^ Interactive Fiction forever.^TOM: \ Yeah, how 'bout a little more science and less mystery next \ time, huh?"; print "^^[Deep 13]^^DR.F: Ah, very cute, my little brass lantern. \ But do you really think you can^ quit I-F that easily? \ Your little friend will come back to it, Nelson, and^ \ then I'll send him _another_ game like this. And another! \ And ANOTHER!^ [Laughs evilly.] Push the button, Frank. \ [Pause] Frank?^^[Dr. Forrester looks around, and sees that \ Frank has once again donned the^ Fictionary helmet.]^^\ FRANK: Sorry, but I can't see any 'button' here.^DR.F: Oh, \ will you just drop it, Frank?!^FRANK: I'm not carrying \ that.^DR.F: [Sighs with exasperation, then picks up a game \ manual and glances at it.]^ Okay, let's see now...Ah, \ here it is! The special magic word that'll make^ Frank \ push the button. 'XYZZY.'^^[Frank hears Dr. F say it, and \ pushes the button. The screen goes dark.]"; print "^^^^^^^^^^^^^^^^^^^^^^^^^^^^\ ^ @@92 | /\ ^ --o--\ ^ / | @@92\ ^^^^^^^^^^^^^^^\ FRANK'S VOICE: It is now pitch black. You are likely to be \ eaten by a grue.^DR.F'S VOICE: I'll get you for this, \ Frank. I swear it.^"; return; ], has light; [ Initialise; location = Chiefs_Office; ; ; @erase_window $ffff; print "^^^^^^^^^^G...6...5...4...3...2...1...^^\ [Mike and the bots enter the theater.]^^"; ]; !*** I've used a few special commands for the initialization routine. Line 3 !*** (';') calls a pre-defined verb subroutine which puts the game !*** into Verbose mode at the start. This is necessary so that the comments !*** displayed when the player visits rooms a second time are not overlooked. !*** Line 4 (';') turns score notification off, because it would !*** just get in the way of the comments. The 5th line is an assembly-level !*** command that clears the screen to get rid of the 'Verbose' and 'Notify !*** Off' text before printing the introduction. [ HelpSub; "Sorry, you're on your own here."; ]; Include "Grammar"; Verb "help" "hint" * -> Help; Verb "shoot" "fire" * -> Attack * animate -> Attack * "at" animate -> Attack * animate "with" noun -> Attack * noun "at" animate -> Attack * "at" animate "with" noun -> Attack; !*** Last but not least, the simple grammar extensions given above. end;