Constant Story "In The End II^^"; Constant Headline "an Interactive Leave-Taking^ ^Copyright 1998 by Adam Thornton^ Original story by Joe Mason^^"; Replace LowKey_Menu; Replace DoMenu; Replace HelpSub; [ HelpSub; main_menu.select(); ]; Include "parser.h"; Constant TASKS_PROVIDED; Constant NUMBER_TASKS 6; Constant MAX_SCORE 6; Constant RAZOR 0; Constant RIVER 1; Constant DRUGS 2; Constant TOASTER 3; Constant GAS 4; Constant NOOSE 5; Constant MAX_CARRIED 6; Array task_scores -> 1 1 1 1 1 1 ; Global invjoke=0; Global goto_room; [ UnknownVerb word p i; p = location.&to_places; if (p==0) rfalse; for (i=0:(2*i)i).name) { goto_room = p-->i; return 'go#room'; } rfalse; ]; Attribute legible; [ PrintVerb word; if (word =='go#room') { print "You make your way to ", (name) goto_room; rtrue; } rfalse; ]; Include "utility.h"; Include "domenu.h"; ! L. Ross Raszewski's hint system Include "AltMenu.h"; ! (rraszews@skipjack.bluecrab.org) Include "Hints.h"; ! Menus Menu main_menu "Help!"; Menu -> "Help!"; HintTopic -> -> "What's going on?"; Hint -> -> -> "Life sucks. You want to die.^"; Hint -> -> -> "Have you played Joe Mason's ~In The End~?^"; Hint -> -> -> "If not, go do it. It's in the Competition '96 games.^"; Hint -> -> -> "Spoiler for ~In The End~ ahead.^"; Hint -> -> -> "Basically, you go to a funeral, you come home, you kill yourself.^"; Hint -> -> -> "This game is a riff on that game.^"; Hint -> -> -> "Your house is full of ways you can attempt to snuff it.^"; HintTopic -> -> "What means of ending it all exist?"; Hint -> -> -> "There are six.^"; Hint -> -> -> "The noose, the knife, the toaster, the oven, the river, and the poison.^"; Hint -> -> -> "Hang yourself with the noose. Stab yourself with the knife. Drop the toaster in the bathtub while you're in it. Put your head in the oven. Drink the poison.^"; HintTopic -> -> "Uh, I did all that. And the game isn't over..."; Hint -> -> -> "What's the last line of the Dorothy Parker poem?^"; Hint -> -> -> "LIVE.^"; HintTopic -> -> "I'm just so incredibly lame that I need a walkthrough."; Hint -> -> -> "To quote Joe Mason, ~I reserve the right to heap scorn and abuse on anyone who [sic] I catch using the walk-through.~^"; Hint -> -> -> "Blah blah blah avoiding the atmosphere yadda yadda skipping the supporting background detail mumble cheapening the artistic experience yadda yadda yadda.^"; Hint -> -> -> "KITCHEN. OPEN OVEN. PUT HEAD IN OVEN. GET TOASTER. BATHROOM. OPEN CABINET. DRINK POISON. PLUG IN TOASTER. FILL TUB. PUT TOASTER IN TUB. VERANDA. JUMP. STAB ME WITH KNIFE. BEDROOM. HANG ME. LIVE.^"; Hint -> -> -> "Wuss.^"; Menu -> "Why did you do this?"; HintTopic -> -> "The Artistic Reasons"; Hint -> -> -> "This game is a parody of Joe Mason's _In The End_ for Stephen Granade's IFFF.^"; Hint -> -> -> "The original game didn't make me feel suicidal enough.^"; Hint -> -> -> "There were a lot of things about it that peeved me. For instance, it's supposed to be puzzle-less IF. Fine.^"; Hint -> -> -> "But the only things described and the only objects implemented are those that directly contribute to the grim mood of the story.^"; Hint -> -> -> "If you try to do anything that doesn't lead inexorably toward the conclusion that life sucks, you're met with a curt refusal by the game.^"; Hint -> -> -> "Not to mention the disabling of ~Inventory~ with the response that I'm carrying nothing important, when in fact...^"; Hint -> -> -> "I'm carrying a very significant object indeed. Maybe nothing unusual, but that's something completely different.^"; Hint -> -> -> "And if you want to disable meta-verbs, fine. But don't tell me it's because ~Life doesn't work that way.~ This game is not life.^"; Hint -> -> -> "And the writing just wasn't compelling enough to make me feel suicidal. I didn't buy it.^"; Hint -> -> -> "And then the game copped this attitude, that if I didn't recognize it as the greatest work of IF ever, it was because I was a mouth-breathing Neanderthal.^"; Hint -> -> -> "Since the premise really was intriguing but the execution was so frustrating, I figured I'd do a parody.^"; HintTopic -> -> "The Real Reasons"; Hint -> -> -> "Stephen and I had talked a little about my doing a game like this for IFFF, and then a conversation I had on IFMud with Adam Cadre sparked me to just go do it.^"; Hint -> -> -> "And I wanted to do something kind of ambitious for IFFF.^"; Hint -> -> -> "But really, I just like Dorothy Parker.^"; Menu -> "Credits"; HintTopic -> -> "Material Causes"; Hint -> -> -> "L. (the L is for ~Library~) Ross Raszewski for his menu and hint systems.^"; Hint -> -> -> "Graham Nelson for Inform.^"; Hint -> -> -> "William Shakespeare for all the prose I ripped off.^"; HintTopic -> -> "Formal Causes"; Hint -> -> -> "Stephen Granade for hosting IFFF.^"; Hint -> -> -> "Joe Mason, for giving me something to parody.^"; Hint -> -> -> "Dorothy Parker, because.^"; HintTopic -> -> "Motive Causes"; Hint -> -> -> "The Inform Compiler 6.15.^"; Hint -> -> -> "Gnu Emacs 20.2.^"; Hint -> -> -> "Linux 2.1.109.^"; Hint -> -> -> "Lots of electrons.^"; HintTopic -> -> "Final Cause"; Hint -> -> -> "To expose the bleakness and futility of the modern world?^"; Hint -> -> -> "To show that I am a deeply tormented suffering artist and thereby win the attention of women?^"; Hint -> -> -> "To avoid other, more pressing responsibilities, by writing a dumb parody game?^"; Hint -> -> -> "Ladies and gentlemen, I think we have a winner.^"; Menu -> "Your name here!"; HintTopic -> -> "What?"; Hint -> -> -> "This game comes with source code.^"; Hint -> -> -> "You are hereby encouraged to modify it, to add better syntax for some of the commands, and to add new and exciting ways to not-quite die.^"; Hint -> -> -> "Just make the changes that you make freely available with source, and keep all the original credits in the game as well as any you may add.^"; Hint -> -> -> "Yes, this could become a rec.arts.int-fiction collaboration if we are not careful.^"; Menu -> "The Final Word"; HintTopic -> -> "The Final Word"; Hint -> -> -> "Rosebud."; Replace ScoreSub; [ ScoreSub; if (deadflag == 0) { print "Life doesn't work that way.^^ Fortunately, this isn't life.^^"; } L__M(##Score); PrintRank(); rtrue; ]; Replace SaveSub; [ SaveSub; print "Life doesn't work that way.^^ This game, of course, is not life. But it's still too damn easy to require saving. So there.^"; rtrue; ]; Replace RestoreSub; [ RestoreSub; print "Life doesn't work that way.^^ Fortunately, this game is not life. But since you can't save the game, how much sense would it make to be able to restore it?^"; rtrue; ]; Replace QuitSub; [ QuitSub; print "Life doesn't work that way.^^"; print "Do you really want to spoil all my fine mimesis and ruin the extensive atmosphere of this magnificent exploration of the darkness of the human soul by quitting and returning to your tawdry, humdrum, unspeakably dreary and insignificant life?^^Well, do you? >"; if (YesOrNo()~=0) { print "^Fine. Be that way. Good riddance, ingrate.^"; quit; } "That's more like it."; ]; Replace InvSub; [ InvSub x; if (invjoke == 0) { invjoke = 1; "Life doesn't work that way.^^ Oh. Wait. Yes it does.^^ Well, you're carrying nothing important. Go away."; } if (invjoke == 1) { invjoke = 2; "I mean it. You're carrying nothing important."; } if (invjoke == 2) { invjoke = 3; "This is your last warning. You're not carrying anything important."; } if (invjoke == 3) { print "Fine. Just go and break the mimesis, why don't you?^^"; invjoke = 4; } if (child(player)==0) return L__M(##Inv,1); if (inventory_style==0) return InvTallSub(); L__M(##Inv,2); if (inventory_style & NEWLINE_BIT ~= 0) print ":^"; else print " "; WriteListFrom(child(player), inventory_style, 1); if (inventory_style & ENGLISH_BIT ~= 0) print ".^"; #IFNDEF MANUAL_PRONOUNS; objectloop(x in player) PronounNotice(x); #ENDIF; AfterRoutines(); ]; [ ReadSub; <>; ]; Replace CutSub; [ CutSub; print "There's no point in cutting ",(the) noun; if (second == nothing) "."; " with ",(the) second,"."; ]; [ StickHeadSub; "You can't put your head in ",(the) noun; ]; [ UnplugSub; "You can't unplug ",(the) noun,"."; ]; [ PlugSub; "You can't plug in ",(the) noun,"."; ]; [ HangSub; "You can't hang ",(the) noun,"."; ]; [ LiveSub; deadflag = 2; "Yes, you think to yourself, you've been too whiny all along. Things really aren't bad at all. In fact, it's probably a good time to make something of your life. You pour a dram of bourbon, drink it, and get into bed, resolving to have a good night's sleep and, in the morning, sign up for that class in boat-building you always wanted to take.^^ You sleep the sleep of the just, and awaken at seven. After dressing and drinking a cup of coffee, you step cheerily out of your door into a bright and sunny morning, whistling a happy tune.^^ Overhead, a 747 disintegrates. The grand piano from the upper deck plummets earthward. Just as you switch from ~Good Morning Starshine~ into ~The Girl From Ipanema~ it crushes you."; ]; [ MurderSub; "Violence isn't the answer to this one."; ]; [ DieSub; "If only it were that easy."; ]; Replace PrintTaskName; [ PrintTaskName ach; switch (ach) { RAZOR: "The most unkindest cut of all."; RIVER: "Fell in the weeping brook."; DRUGS: "Venom, to thy work."; TOASTER: "Vaunt-couriers of oak-cleaving thunderbolts."; GAS: "Sulph'rous and thought-executing fires."; NOOSE: "Vital thread be cut with edge of penny cord and vile reproach."; } ]; Replace PrintRank; [ PrintRank; print ", earning you the rank of "; switch (score) { 0: "Bitter Bob."; 1: "Gloomy Gus."; 2: "Sad Sid."; 3: "Melancholy Melvin."; 4: "Depressive Donald."; 5: "Lugubrious Leonard."; 6: "Suicidal Stanley."; } ]; !----------------------------------------- ! Now for some entry points: Object LibraryMessages with before [; Miscellany: if (lm_n == 4) { print "You have died "; rtrue; } ]; Include "verblib.h"; ! ----------- ! Get on with it! [ Initialise; ChangePlayer(bob); box "Razors pain you;" "Rivers are damp;" "Acids stain you;" "And drugs cause cramp." "Guns aren't lawful;" "Nooses give;" "Gas smells awful;" "You might as well live." "" "Dorothy Parker, R@'esum@'e"; WaitForKey(); style underline; print "^^^You used to think it would never catch up to you. All your friends who... passed on (strange how you keep using these euphemisms, even after all this time)...were swingers, playboys, high rollers. They lived on the fast side of life, and probably thought it would never catch up to them, either. But when the endless round of parties and social life and high stakes finally paled, they began to drop off, one by one. Some fell quicker then others, some hung on until the bitter end - or what seemed to them like the bitter end.^^^"; style roman; print "Yet another funeral. Yet another weepy psycho chick \ begging to be taken home in the rain, and then not talking \ to you in the car, and having odd, faintly-incoherent \ answers when you tried to start a conversation. Another trip \ to the bar to slug down umpteen shots of scotch that had no \ effect. Another crappy magazine rack. And the interminable, \ incessant, horrific rain. If only this rain would stop..."; print "And that damn girl. What was this one's name? Annie? Christabel? Terry? Tracy? Sadie? Marnie? Liza? Does it matter?^^"; print "Of course it doesn't matter.^^"; print "Nothing really matters.^^"; print "And here you are, slumped in your favorite chair, in a brown study in the brown study of your enormous although scantily-described house.^^"; location = chair; move penknife to player; give player light; ""; ]; Object bob "bob" with description "As nondescript as ever.", before [ ; Murder: "Ah, but how? Aye, there's the rub."; Cut: if (second == nothing) { if (penknife notin player) "With what?"; second = penknife; print "(with the penknife)^"; } if (second ~= penknife) "I don't think ",(the) second," would be very effective."; remove penknife; print "You begin to press the penknife against your wrist. Harder. Strange how your hands tremble. Then...^^"; style bold; print "**POP**"; style roman; print "^^The blade snaps off the penknife, through your window, across the driveway, into the open window of your neighbor, between the bars of his bird cage, and through the canary's throat. (cf. Henry Petroski, "; style underline; print "To Engineer Is Human"; style roman; Achieved(RAZOR); ", New York: Vintage Books, 1992, p. 126) With a shriek of disgust, you throw the penknife away."; Hang: if ((location == bedroom) && (my_noose in bedroom)) <>; "With what, may I ask?"; ], ; Class Room with cant_go "You don't carry a compass. Do you think you're some kind of a dork? To go to a particular room, just type its name. Rooms include the kitchen, the study, the library, the bathroom, the bedroom, and the veranda.", to_places kitchen study library bathroom veranda bedroom, ; Class Book with description [; print "This is another volume from your library, handsomely custom-bound in Moroccan leather with gilt lettering. This particular volume is "; style underline; print (string) self.title; style roman; " by ", (string) self.author,"."; ], before [; Consult,Read: print "You begin to read "; style underline; print (string) self.title; style roman; " but find it offensively cheery and stop."; ], title "The Book Of The SubGenius", author "Reverend Ivan Stang", has legible proper concealed, ; Room study "Study" with name "study", description "The lights of this room are styled to resemble warm, yellow lamplight, and are low enough to leave the corners in shadow. A window looks out over your lawn, though it is now obscured by sheets of splattering rain. Nestled within the glow of light is a cozy chair pulled up to an ancient-looking wooden desk.", ; Object -> chair "your favorite chair" with name "cozy" "chair" "favorite" "brown" "leather", description "You see nothing special about your favorite chair. Strange, since it's one of the few things in the room you can manipulate at all. Perhaps you're just so used to it that there's nothing unusual about it. Yeah. That's gotta be it. Anyway, it's made of soft brown leather.", Before [; Enter: move player to chair; "With a sigh, you collapse into your chair and let it engulf you."; Exit: move player to study; "You get off of your favourite chair."; ], has scenery supporter enterable proper; Object -> window "window" with name "window" "rain", description "Rain pounds against the window like the drums of a besieging army, but you can relax in safety here.", has scenery, ; Object -> shadows "shadows" with name "shadow" "shadows", description [; print "You always thought that keeping the edges of the room in shadow made it feel more cozy, smaller. But tonight the shadows seem to... "; style bold; print "lurk"; style roman; ". There's no other word for it. ^^(cue spooky music. Too bad this isn't HTML-TADS, huh?)"; ], has scenery, ; Object -> lamplight "light" with name "light" "lights", description "You like to keep the lighting low, to remind you of firelight and make the room seem smaller. One thing about having a large house is that it can seem impersonal if you don't add homey touches.", has scenery, ; Object -> desk "wooden desk" with name "wooden" "desk", description "You see nothing special about the desk. It can't be opened or moved, either. In fact, why it even exists is unclear.", has scenery, ; Room kitchen "Kitchen" with name "kitchen", description "This is your kitchen. It contains kitcheny things which I, the author, am too filled with ennui and disgust to describe, so you'll have to guess." ; Object -> kitchen_junk "junk" with name "sink" "chair" "table" "chairs" "cabinet" "fridge" "refrigerator" "icebox" "blender" "dishwasher" "towel" "linoleum" "mold" "ketchup" "beer" "stove" "glass" "glasses" "plate" "plates" "fork" "forks" "spoon" "spoons" "knives", description "Good guess. But wrong. There's no such thing.", has scenery, ; Object -> my_toaster "toaster" with name "toaster" "silver" "stainless" "steel", description [; print "You see nothing special about the toaster. This shouldn't surprise you. It's just a toaster. It is currently "; if (self has general) "plugged in."; "unplugged."; ], before [; Plug: if (self hasnt general) { give self general; if ((self has on) && ((location == bathroom) || (location == bathtub))) "Alas, all the outlets in the bathroom have been shorted out. Nevertheless, you plug the toaster in."; "You plug the toaster into a handy outlet."; } "But the toaster is already plugged in."; Unplug: if (self has general) { give self ~general; "You unplug the toaster."; } "But the toaster is already unplugged."; Drop: if ((bob in bathtub) && (self has general) && (self hasnt on) && (bathtub has general)) { give self on; move self to bathtub; Achieved(TOASTER); "Triumphantly, you release the toaster and smile bitterly as it plummets towards your water-covered feet. It hits the water...^^^Rather disappointingly, the only effect is a muffled ~pop~ and a wisp of smoke coming from the outlet."; } rfalse; Insert: if ((bob in bathtub) && (second == bathtub)) <>; if ((bathtub has general) && (self has general) && (self hasnt visited)) { give self visited; Achieved(TOASTER); "You stick the toaster triumphantly into the full bathtub...^^^There is a muffled ~pop~ as a wisp of smoke rises from the outlet. That's all."; } ], has general ~on, ; Object -> my_oven "oven" with name "oven" "white" "electric", description "You see nothing special about the oven (bet you couldn't see that one coming, huh?).", before [; StickHead: if (self has general) "You already tried that."; if (self hasnt open) "It's closed."; give self general; print "Nice thinking. Unfortunately, the oven is electric, and you haven't got the cojones to roast yourself to death.^"; Achieved(GAS); rtrue; ], has openable scenery container, ; Room library "Library" with name "library", description "Your library is panelled in the dark and exotic woods of endangered South American rainforests. Unsurprisingly, there are quite a few books here.", ; Book -> plath "The Bell Jar" with name "Sylvia" "Plath" "Bell" "Jar" "book" "books", title "The Bell Jar", author "Sylvia Plath", ; Book -> hardy "The Mayor of Castorbridge" with name "Thomas" "Hardy" "Mayor" "Castorbridge" "book" "books", title "The Mayor of Castorbridge", author "Thomas Hardy", ; Book -> flaubert "Madame Bovary" with name "Gustave" "Flaubert" "Madame" "Bovary" "book" "books", title "Madame Bovary", author "Gustave Flaubert", ; Book -> kafka "The Castle" with name "Franz" "Kafka" "Castle" "book" "books", title "The Castle", author "Franz Kakfa", ; Book -> lawrence "Sons and Lovers" with name "DH" "D" "H" "Lawrence" "Sons" "Lovers" "book" "books", title "Sons and Lovers", author "D.H. Lawrence", ; Book -> oates "Baby Love" with name "Joyce" "Carol" "Oates" "Baby" "Love" "book" "books", title "Baby Love", author "Joyce Carol Oates", ; Object -> wood "wood" with name "wood" "woods" "rainforests" "panel", description "Thousands of trees, and doubtless quite a few peasants, died so that you could have your lovely library. You feel pleased about it, in a guilty, self-incriminating, depressive way.", has scenery, ; Room bathroom "Bathroom" with name "bathroom", description "The bathroom is large and pink. It contains about what you'd expect. And you won't get any clues from me what that'd be.", ; Object -> bathtub "bathtub", with name "bathtub" "tub" "shower" "bath", description [; print "Like the bathroom, the bathtub is large and pink. It is "; if (self has general) { print "full of water"; } else { print "not filled"; } if (child(self) == nothing) "."; print " and contains "; WriteListFrom(child(self),ENGLISH_BIT); "."; ], before [; Fill: if (self hasnt general) { give self general; if ((my_toaster in bathtub) && (my_toaster hasnt on) && (my_toaster has general)) { give my_toaster on; if (bob in bathtub) { Achieved(TOASTER); "You wait impatiently as the water rises to the top of the toaster. Then it sloshes in...^^^There is a muffled ~pop~ and a wisp of smoke from the outlet, and no other effect."; } give my_toaster on; "The water quickly covers the toaster. Sheets of lightning arc and race across the surface of the tub before the outlet explodes in a blinding shower of sparks. Pity you weren't actually in the bathtub when you did that."; } "The bathtub is now full of water."; } "The bathtub is already full!"; Empty: if (self has general) { give self ~general; "The bathtub drains."; } print "The bathtub is already drained.^"; rfalse; ], has scenery container enterable open; Object -> cabinet "cabinet" with name "cabinet" "medicine" "mirror", description [; if (self hasnt open) "The medicine cabinet is one of those with a mirror on the front. Looking in the mirror, you see yourself, as nondescript as ever."; print "The medicine cabinet is open, and contains "; if (child(self) == 0) "nothing."; WriteListFrom(child(self),ENGLISH_BIT); "."; ], has scenery container ~open openable, ; Object -> -> poison "bottle of poison" with name "bottle" "poison" "deadly" "green" "lethal", description "This is a bottle of deadly green poison, with skull and crossbones on it. You bought it from the Verona Apothecary many moons ago.", before [; Drink: StartDaemon(self); Achieved(DRUGS); remove self; "~O true apothecary! Thy drugs are quick! Thus with a kiss I die!~ you shout, tossing the bottle away.^^Your stomach gurgles. Perhaps the drug is not quite as quick as you thought."; ], time_left 10, daemon [; poison.time_left--; if (poison.time_left==0) { print "^You can't hold out any longer. "; if (location ~= bathroom) { print "You rush to the bathroom. "; PlayerTo(bathroom); } StopDaemon(self); "^Kneeling before the toilet, you vomit several times. When it's over your stomach feels much better. On the other hand, you don't seem to be at all dead. You flush and stand up."; } if (poison.time_left == 8) "^Your stomach aches fiercely. The poison must be working."; if (poison.time_left == 6) "^You are sweating heavily and feel very nauseous."; if (poison.time_left == 4) "^Strange. You don't feel like you're dying, just like you're going to throw up."; if (poison.time_left == 2) "^Whatever that poison is, it's making you very miserable. Your stomach does a flip-flop."; if (poison.time_left == 1) "^You retch, but choke the bile back down, determined to make this poison kill you if it kills you."; ], ; Object -> bathroom_stuff "bathroom stuff" with name "tile" "toilet" "john" "loo" "crapper" "sink", description "You see nothing special about any of the things in the bathroom.", has scenery; Room veranda "Veranda" with name "veranda", description "You stand outside in the pouring rain, watching the swollen river roll underneath. A low railing is all that stands between you and it. The swirl of the river is hypnotic, almost begging you to jump.", before [; Jump: if (self has general) "You tried that already. Once was enough. It was very damp."; Achieved(RIVER); give self general; print "With a clich@'ed cry of ~Goodbye Cruel World,~ you leap into the embrace of the river and are immediately dragged under by the current.^^You strike a rock underwater and lose consciousness...^^^And then, somewhat later, you awaken, bedraggled, bruised, and wet, but very much alive. You've been cast up on the river bank not twenty yards from your own front door.^"; print "Sighing, you trudge back indoors to the study.^"; PlayerTo(study); rtrue; ], ; Object -> big_river "river" with name "river" "water" "big" "brown" "rushing", description "Big and brown.", before [; Jump, JumpOver: <>; ], has scenery, ; Object -> railing "railing" with name "railing", description "You see nothing special about the railing. So there.", before [; Jump, JumpOver: <>; ], has scenery, ; Room bedroom "Bedroom" with name "bedroom", description "This is where you sleep. There is a bed here." ; Object -> bed "bed" with name "bed" "four-poster" "cherry" "large" "big" "king" "king-size", description "Your bed is a lovely four-poster king-size bed, made \ out of finely carved cherry wood.", before [;LookUnder: "No monsters, no trap doors, no dollar bills. \ Nothing but dust.";], ! Because I'm not quite _that_ predictable has scenery supporter enterable; Object -> my_noose "noose" with name "noose" "rope", description "The noose coils invitingly just within your reach.", before [; StickHead: Achieved(NOOSE); remove my_noose; print "You stick your head into the noose and attempt to hang yourself. Your windpipe constricts, and your vision starts to blur at the edges...^^^"; style bold; print "**SNAP**"; style roman; "^^^The noose gives way. Picking yourself up, you discard the frayed pieces of rope."; ], has static; Object -> bedroom_stuff "bedroom stuff" with name "dresser" "dressers" "nightstand" "table" "lamp" "lamps" "mirror" "tables", description "Just the bric-a-brac of a standard adult bedroom. You don't want to think about it.", has scenery, ; Object penknife "penknife" with name "penknife" "knife" "small" "blade", description [; print "This is a small penknife, with a two-inch blade, more suited for picking one's teeth than suicide, but any port in a storm. It is currently "; if (self has open) "open."; "closed."; ], has openable, ; include "Grammar"; verb "xyzzy" "plugh" "plover" "yoho" "bunyon" * -> Xyzzy; verb "go#room" * -> GoRoom; extend "read" first * legible -> Read; extend "cut" * noun "with" noun -> Cut; extend only "kill" replace * noun -> Murder; verb "stab" * noun "with" noun -> Cut * noun -> Cut; extend "jump" * "in" noun -> Jump * "into" noun -> Jump; extend only "die" replace * -> Die; extend "put" first * "head" "in" noun -> StickHead; verb "stick" * "head" "in" noun -> StickHead; extend "insert" first * "head" "in" noun -> StickHead; verb "live" * -> Live; verb "unplug" * noun -> Unplug; verb "plug" * noun -> Plug * noun "in" -> Plug * "in" noun -> Plug; verb "hang" * noun -> Hang; [ XyzzySub; "Life doesn't work that way. Nyah, nyah, nyah."; ]; [ GoRoomSub; if (location == goto_room) "You're already there."; if ((my_toaster in player) && (my_toaster has general)) { print "(Unplugging the toaster first.)^"; give my_toaster ~general; } PlayerTo(goto_room); ];