!--------------------The Post That Started It All----------------- !rec.arts.int-fiction #25410 --(?)--(?)--(?)--(?)--(?)+-(1) !From: fake-mail@anti-spam.address (Neil K.) \-(1) !Newsgroups: rec.games.int-fiction,rec.arts. !+ int-fiction ![1] Re: Infocom vs. r.*.if! !Date: Sun Apr 13 00:27:52 EDT 1997 !Organization: tela design !Lines: 15 !x-no-archive: yes !In article <334FEB01.6E6F@romulus.sun.csd.unb.ca>, Brad O`Donnell ! wrote: !> I thought that "mimesis" was the "M" word... !> ...and what *is* mimesis, again? ! ! I think it's a kind of houseplant. You can get both linear and variegated !types. Handle low light well. ! ! - Neil K. ! !-- ! t e l a computer consulting + design * Vancouver, BC, Canada ! web: http://www.tela.bc.ca/tela/ * email: tela @ tela.bc.ca !---------------Notes from the Author----------- ! This is the second major release of Sins Against Mimesis, which was ! the ninth-place entry in the 1997 IF Competition ! Warning! This source file contains some obscenity and also spoils ! the ending of _So Far_. It also will probably spoil a lot of other ! IF for you if you haven't played the games being referenced. ! The Makefile assumes that the library is in the library subdirectory ! of the directory containing mimesis.inf (this file) and that other ! Inform libraries are in library/contrib or the contrib subdirectory ! of the current directory. This is the way it's set up on my system, ! and your mileage may vary. Change the Makefile and Include ! directives as necessary. ! Further Warning! This was my very first Inform game. It is, ! consequently, not elegant at all. There were a number of things I ! figured out while coding that would have, in retrospect, made the ! code nicer. This tends towards the brute-force and ignorance model ! of coding. ! Final Warning! I know it's not that good a game. It was intended ! as a light diversion; I expected this year's competition to have a ! lot of games like "Tapestry" and "Delusions" that were hard, long, ! and serious in tone. This was intended to be a fluffy little romp ! through IF convention, a nice short break from heavy and serious ! games. If you aren't a rec.arts.int-fiction regular it probably ! makes little or no sense. But it is proof that someone with no prior ! Inform experience (though some programming skill) can write a ! fair-to-middling small game in about two weeks. ! The good game, if I ever finish writing it (no promises), is ! tentatively entitled "Flathead," although it has more to do with ! Bitterroot than Dimwit, if you know what I mean. ! And now on with the show. ! Adam Thornton ! Princeton, NJ ! January 1998 !-------------------Global Stuff--------------------------- Constant Story "Sins Against Mimesis"; Constant Headline "^An Interactive Theosophy^\ Copyright 1997 by One of The Bruces \ (bruce@@64ifcompetition.org)^\ (actually Adam Thornton, adam@@64princeton.edu)^"; Constant OBJECT_SCORE 0; Constant HINT_STYLE 1; Release 3; Global MAX_SCORE=7; ! This changes when we enter the scrapple factory ! Therefore we can't use precompiled libraries. Global show_quote = 0; Constant AMUSING_PROVIDED; Constant TASKS_PROVIDED; Constant NUMBER_TASKS 11; Constant PRIDE 0; ! Sin Tasks Constant AVARICE 1; Constant LUST 2; Constant GLUTTONY 3; Constant SLOTH 4; Constant WRATH 5; Constant ENVY 6; Constant KUNKELDEAD 7; ! Scrapple Factory Tasks Constant RODGOTTEN 8; Constant BLACKSAVED 9; Constant MAPDROPPED 10; ! Easter Egg Task Constant SACK_OBJECT sack; Constant MAX_CARRIED 6; Array task_scores -> 1 1 1 1 1 1 1 1 1 1 255; ! What I did was to ! replace the PANum routine so that 255 is a flag to ! trigger the "minus lots and lots" response. Global lewd = false; Global kunkelturns = 0; ! These probably can be done without globals... Global vixenturns = 0; Global whichworld = 0; !---------------------Grammar and what needs replacing---- Replace LowKey_Menu; Replace DoMenu; Include "Parser"; Replace SleepSub; ! Should have fixed in the Bed code, but... Replace PrintTaskName; ! Because we do. Replace YesOrNo; ! To add "Maybe" Replace Amusing; ! Because we do. Replace AfterPrompt; ! To allow for the epigram Replace PrintRank; Replace PANum; Include "Verblib"; Include "Grammar"; Attribute kissed; ! For the plant Attribute attacked; ! For the plant and the kunkel Attribute watered; ! For the plant !------------------Hint Menus--------------- Include "contrib/domenu"; ! L. Ross Raszewski's hint system Include "contrib/altmenu"; ! (rraszews@skipjack.bluecrab.org) Include "contrib/center"; Include "contrib/hints"; Menu hint_menu "Help!"; Menu -> "Sins"; HintTopic -> -> "What's Going On?"; Hint -> -> -> with description "You've been abandoned and you are depressed."; Hint -> -> -> with description "You could eat something, or take a shower. \ Sometimes that helps."; Hint -> -> -> with description "But you should probably get out of the house."; Hint -> -> -> with description "Not as easy as it looks, huh?"; HintTopic -> -> "What's with this plant?"; Hint -> -> -> with description "What kind of plant is it?"; Hint -> -> -> with description "What does the devil want?"; Hint -> -> -> with description "What's the title of the game?"; Hint -> -> -> with description "You have to commit each of the Seven \ Deadly Sins with or to the mimesis plant."; HintTopic -> -> "What's the devil doing here?"; Hint -> -> -> with description "Just hanging out, and preventing you from \ leaving."; Hint -> -> -> with description "Try talking to him."; Hint -> -> -> with description "You have to prove that you're a sinner or \ he won't let you leave."; Hint -> -> -> with description "Have you checked your inventory after \ fooling around with the plant?"; Hint -> -> -> with description "As you acquire more sins, show the disk \ box to the devil."; Menu -> -> "So how do I collect the sins?"; HintTopic -> -> -> "Pride"; Hint -> -> -> -> with description "That sure is a nice plant you got \ there."; Hint -> -> -> -> with description "EXAMINE MIMESIS."; HintTopic -> -> -> "Wrath"; Hint -> -> -> -> with description "Violence is seldom the answer."; Hint -> -> -> -> with description "But, in this case, it is."; Hint -> -> -> -> with description "ATTACK MIMESIS."; HintTopic -> -> -> "Sloth"; Hint -> -> -> -> with description "A nap might help."; Hint -> -> -> -> with description "But you have no teddy bear."; Hint -> -> -> -> with description "The plant is sort of cuddly."; Hint -> -> -> -> with description "While holding the plant, LIE ON BED. \ SLEEP."; HintTopic -> -> -> "Avarice"; Hint -> -> -> -> with description "Hoard stuff!"; Hint -> -> -> -> with description "GET MIMESIS."; HintTopic -> -> -> "Gluttony"; Hint -> -> -> -> with description "Although you can eat the Chinese food..."; Hint -> -> -> -> with description "The name of the game suggests what you \ should be being gluttonous about."; Hint -> -> -> -> with description "EAT MIMESIS."; HintTopic -> -> -> "Envy"; Hint -> -> -> -> with description "Have you examined the plant carefully?"; Hint -> -> -> -> with description "It's looking kind of dry."; Hint -> -> -> -> with description "Get the glass, and then fill it in the \ kitchen or bedroom, and then..."; Hint -> -> -> -> with description "WATER MIMESIS. (Yes, I know it's lame)"; HintTopic -> -> -> "Lust"; Hint -> -> -> -> with description "Come on. This can't be that difficult."; Hint -> -> -> -> with description "KISS MIMESIS."; Menu -> "The Scrapple Factory"; HintTopic -> -> "What do I need to do?"; Hint -> -> -> with description "Get out."; Hint -> -> -> with description "You must defeat the Kunkel and \ venture into StiffyWorld."; HintTopic -> -> "How do I defeat the Kunkel?"; Hint -> -> -> with description "He seems very into his game."; Hint -> -> -> with description "Maybe if you changed his game..."; Hint -> -> -> with description "But he won't let you if he knows what \ you're up to."; Hint -> -> -> with description "So you have to distract him."; Hint -> -> -> with description "UNPLUG GOGGLES. OPEN COMPUTER. GET \ STIFFY CD. PUT TEXT CD IN COMPUTER. CLOSE COMPUTER."; HintTopic -> -> "What's this sack? This rod? This map?"; Hint -> -> -> with description "Go play Curses."; Menu -> "Inside the VR Goggles"; HintTopic -> -> "Huh?"; Hint -> -> -> with description "After the Kunkel has been vanquished..."; Hint -> -> -> with description "WEAR GOGGLES."; HintTopic -> -> "The Text World"; Hint -> -> -> with description "About all you can do is leave."; Hint -> -> -> with description "STRIKE ROD. POINT IT AT ME."; Menu -> -> "StiffyWorld"; HintTopic -> -> -> "Ultravixens?"; Hint -> -> -> -> with description "Sure, didn't you ever see any Russ \ Meyer films?"; Hint -> -> -> -> with description "Of course, they're deadly."; Hint -> -> -> -> with description "So avoid them."; HintTopic -> -> -> "There's this door..."; Hint -> -> -> -> with description "Have you checked your inventory?"; Hint -> -> -> -> with description [; print "Have you ever played "; style underline; print "DOOM"; style roman; print "?"; rtrue; ]; Hint -> -> -> -> with description "UNLOCK PINK DOOR WITH PINK KEY."; HintTopic -> -> -> "Black"; Hint -> -> -> -> with description "You could attack Black. Or kiss \ Black. Or shoot Black."; Hint -> -> -> -> with description "Or you could rescue Black."; Hint -> -> -> -> with description "STRIKE ROD. POINT IT AT BLACK."; HintTopic -> "Credits"; Hint -> -> with description "Neil K. Guy and Brad O' Donnell, of \ course."; Hint -> -> with description "And of course the ~Crimes Against \ Mimesis~ rec.arts.int-fiction thread."; Hint -> -> with description "Zarf and Graham, for testing and their good \ humor about it all."; Hint -> -> with description "John Baker, as without the Fire Witch we \ wouldn't be having this game in the first place."; Hint -> -> with description "John Holder, because I misidentified \ John Baker as him in the previous releases of this game."; Hint -> -> with description "Whizzard, for hosting the competition this \ year, and for his efforts in getting Activision back on the \ True Path, and for that unfinished game of his..."; Hint -> -> with description "L. Ross Raszewski, for his hint system."; Hint -> -> with description "The 1997 IF Competition judges and \ players, in particular Paul Janzen, who told me of a nasty bug, \ Stephen Granade, who suggested a number of improvements, and \ Martin Braun, who let me know of the John Holder/John Baker confusion."; Hint -> -> with description "The circumstances that brought me to write \ this game, about which I'd rather not think, but without \ which I wouldn't have bothered."; Hint -> -> with description "Graham, again, for Inform."; Hint -> -> with description "rec.arts.int-fiction, without which none of \ this would have been necessary."; Hint -> -> with description "The Famous Grouse, without which none of \ this would have been possible."; Hint -> -> with description "Nuclear Fusion, without which the sun \ wouldn't work."; Hint -> -> with description "The Strong Force, without which...oh, never \ mind."; HintTopic -> "What is ~Mimesis,~ really?"; Hint -> -> with description "Imitation or mimicry."; Hint -> -> with description "In Interactive \ Fiction, something along the lines of ~Creation of a mood such \ that it is possible to suspend disbelief and become immersed in \ the game.~"; HintTopic -> "Walkthrough"; Hint -> -> with description "Are you really that much of a wuss?"; Hint -> -> with description "GET PLANT.X IT.KISS IT.KILL IT.EAT IT.\ E.GET GLASS.FILL IT.\ WATER PLANT.W.W.LIE DOWN.SLEEP.GET UP.E.N.SHOW BOX TO DEVIL.\ N.S.GET SACK.GET ROD.PUT ALL IN SACK.GET CD.N.N.UNPLUG GOGGLES.\ OPEN COMPUTER.GET STIFFY.PUT TEXT IN COMPUTER.CLOSE COMPUTER.\ OPEN COMPUTER.GET TEXT CD.PUT STIFFY IN COMPUTER.CLOSE COMPUTER.\ WEAR GOGGLES.UNLOCK PINK DOOR WITH PINK KEY.NE.GET ROD.\ STRIKE ROD.POINT IT AT BLACK.YES."; Hint -> -> with description "Are you happy now?"; Hint -> -> with description "Wuss."; Menu Amusing_menu "Amusing Things"; HintTopic -> "Have you tried..."; Hint -> -> with description "...LEWD, RACY, and TAME?"; Hint -> -> with description "...asking the devil about himself?"; Hint -> -> with description "...asking about him by name before he's told \ you his name?"; Hint -> -> with description "...asking him about all sorts of stuff?"; Hint -> -> with description "...Lust in LEWD mode?"; Hint -> -> with description "...XYZZY, PLUGH, PLOVER, YOHO, or BUNYON?"; Hint -> -> with description "...examining the scenery objects in the \ bedroom, bathroom, kitchen, and Ganymede Base Room \ J-14-B-3.2?"; Hint -> -> with description "...examining the ~so on~ in the bathroom, \ bedroom, or kitchen?"; Hint -> -> with description "...putting the fork in the microwave?"; Hint -> -> with description "...heating anything besides the fork and \ the Chinese food in the microwave?"; Hint -> -> with description "...smelling the purple mist?"; Hint -> -> with description "...kissing the Kunkel?"; Hint -> -> with description "...smelling or tasting anything in the \ rendering vat?"; Hint -> -> with description "...smelling or tasting the rucksack?"; Hint -> -> with description "...smelling or tasting the Kunkel?"; Hint -> -> with description "...wearing the VR Goggles with the text \ adventure CD in the computer?"; Hint -> -> with description "...dropping the tourist map of Paris in the \ Text World Attic?"; Hint -> -> with description "...attacking Black?"; Hint -> -> with description "...answering ~maybe~ to \ Black's question?"; Hint -> -> with description [; print "...actually playing "; style underline; print "The Incredibly Erotic Adventures of Stiffy Makane"; style roman; "?"; ]; !----------------------Grammar Extensions------------------ [LewdOn; ! We use for the different meanings of "Fuck" and return lewd; ! "Screw" in Lewd mode ]; [ IsPlayer ; if (noun == player) rtrue; rfalse; ]; Extend "kiss" first * noun -> Kiss; ! So you can kiss the plant Extend only "sleep" * "with" noun -> Kiss; ! A variant on the Lust action Extend only "lie" * "down" -> GoToBed * "with" noun -> Kiss; ! Another euphemism Verb "lewd" * -> Lewd; Verb "racy" * -> Racy; Verb "tame" * -> Tame; Verb "xyzzy" "plugh" "plover" "yoho" "bunyon" ! So maybe I've left out a few * -> Xyzzy; Verb "rip" "tear" "defoliate" = "attack"; Verb "shoot" * noun=IsPlayer -> ShootSelf * noun -> Attack * noun "with" noun -> Attack; Extend only "screw" first * noun=LewdOn -> Kiss; ! Means "Turn" if not in lewd mode Extend only "fuck" replace * -> CheckLewd * noun=LewdOn -> Kiss ! And, in lewd mode, "Kiss" is a synonym * noun -> Strong; ! for a stronger action Verb "pour" "douse" * "water" "on" noun -> Water * noun -> Empty; Verb "water" * noun -> Water; Verb "strike" * noun -> Strike; Verb "point" * -> Point * noun "at" noun -> Point; Verb "plug" * "in" noun -> Plug2 * noun "into"/"in" noun -> Plug; Verb "unplug" * noun -> Unplug * noun "from" noun -> Unplug; [ YesOrNo i; ! Adds "Maybe" to the code. for (::) { #IFV3; read buffer parse; #ENDIF; #IFV5; read buffer parse DrawStatusLine; #ENDIF; i=parse-->1; if (i==YES1__WD or YES2__WD or YES3__WD) rtrue; if (i==NO1__WD or NO2__WD or NO3__WD) rfalse; if (i=='maybe') return 2; L__M(##Quit,1); print "> "; } ]; [ PANum m n; print " "; n=m; if (n==255) ! Ugly special-case overloaded-value flag to allow a ! smartass response for destroying the multiverse { print " minus lots and lots "; rtrue; } if (n<0) { n=-m; n=n*10; } if (n<10) { print " "; jump panuml; } if (n<100) { print " "; jump panuml; } if (n<1000) { print " "; } .panuml; print m, " "; ]; [ AfterPrompt; if (show_quote == 1) { Epigram(); show_quote = 0; } rtrue; ]; [PrintTaskName ach; ! What we get points for switch (ach) { AVARICE: "Avarice"; LUST: "Lust"; GLUTTONY: "Gluttony"; WRATH: "Wrath"; PRIDE: "Pride"; SLOTH: "Sloth"; ENVY: "Envy"; RODGOTTEN: "Getting the Rod of Returning"; KUNKELDEAD: "Vanquishing the Kunkel"; BLACKSAVED: "Rescuing Black"; MAPDROPPED: "Destroying the Multiverse"; } ]; [PrintRank; print ", earning you the rank of "; switch (score) { -999 to -1: "Destroyer of the Multiverse and Cosmic Butthead."; 0: "not even bothering to play, apparently."; 1: "someone who doesn't try very hard."; 2: "someone in a big hurry to get to the next game."; 3: "Potential Sinner."; 4: "Rather Naughty Person."; 5: "Malingerer."; 6: "Moral Leper."; 7: "First-Class Passenger on the Hellbound Express."; 8: "Scrapple Warrior."; 9: "Vanquisher of the Kunkel."; 10: "Master Mimetic."; } ]; [Reward ach; if (score == 1) ! first achievement { move disk_box to player; print "^There is a sharp crackling and a sudden smell of ozone, as something appears in your hand.^"; ! Warns player to check inventory. } switch (ach) { AVARICE: move avarice_disk to disk_box; LUST: move lust_disk to disk_box; GLUTTONY: move gluttony_disk to disk_box; WRATH: move wrath_disk to disk_box; PRIDE: move pride_disk to disk_box; print "^^^^^^^^^^^^^^^^^^"; ! Attempt to keep the box from ! obscuring anything important show_quote = 1; SLOTH: move sloth_disk to disk_box; ENVY: move envy_disk to disk_box; } rtrue; ]; [Epigram; box "" "I thought that ~mimesis~ was the ~M~ word..." " ...and what *is* mimesis, again?" " - Brad O' Donnell" "" "I think it's a kind of houseplant." " You can get both linear and variegated" " types. Handle low light well." " - Neil K. Guy" "" "(rec.arts.int-fiction, 13 April 1997)" ""; ]; [KunkelDeath; deadflag = 1; "^^~Please excuse the crudity \ of what I'm about to do, you text-based Neanderthal, \ but my ancestors were AGT monsters.~^^\ 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."; ]; [KillKunkel; print "The Kunkel, not suspecting your ruse, shrieks as \ wave after wave of pure text pummels its senses."; print "^^With a sickening 'schlupp' the VR goggles \ explode from the Kunkel's face as its head splits \ open and it keels over, dead."; give kunkel general; give vr_goggles ~concealed; Achieved(KUNKELDEAD); ""; ]; [Vixendeath; print "A patrol of maurauding ultravixens has entered the area. "; if (lewd) { print "Their heaving breasts are the size of casaba melons; \ their black leather jumpsuits glisten wetly in the \ coruscating light. Their gently filed teeth sparkle \ behind ruby-red, moist, slightly parted lips. While \ terrified, you find yourself horrifically aroused as \ well. "; } if (big_gun in player) { print "Your big gun is no match for their power. "; } else { print "You are vastly overmatched. "; }; print "Swiftly they crush you to "; if (lewd) print "(multiorgasmic) "; print "death between their thighs."; deadflag = 1; rtrue; ]; [Amusing; Amusing_menu.select(); ]; [Endgame x; print "....and, hours later, you awaken on the floor of the Scrappelizer, \ Black, crying, dabbing at your forehead with a cloth.^^ ~I'm really sorry,~ are Black's first words. ~White \ was such a bore. Never let me do anything I wanted to, kept \ preventing me from wrecking history, always sketching animals \ in that dumb little book. So naturally I accepted a lift from \ the first cattle-mutilating ultravixen that came along, and you \ see where "; style bold; print "that"; style roman; print " got me. Thanks for rescuing me. The fate I would have suffered \ at the hands of those ultravixens...~"; print "^^^"; style underline; print "Black (simply):"; style roman; print "^Ah, my love. Can you forgive me?^^>"; x=YesOrNo(); if (x==2) { ! "Maybe": now you see why we replaced it print "^Black blinks. ~Oh. Yes. That's right. Now I remember \ why I left you in the first place. You're a "; if (lewd) print "fucking "; print "wuss.~ Then Black picks up the Kunkel's corpse and beats \ you to death with it."; deadflag = 1; ""; }; if (x==1) { ! "Yes." See _So Far_ for a less happy ending... style underline; print "^^You:"; style roman; ! print "^How can I deny you? There is nothing to forgive.^^^"; print "^"; style bold; print "Your actual words have been censored, at the request of Andrew \ Plotkin, who feels like you should actually play his game"; style roman; print " "; style underline; print "So Far"; style roman; print " "; style bold; print "to find out what this response is. So go play it. When you \ get there, you'll understand.^^"; style roman; print "Black smiles through the tears. ~That's really sweet of \ you, but you know you're full of "; if (lewd) {print "shit";} else {print "it";}; print ". There's a lot to forgive: leaving you, attempting to wreck \ the course of the Twentieth Century, forgetting to water the plant...~ Black bursts into tears again.^^"; }; if (x==0){ ! "No." See _So Far_ for an equally confusing ending... style underline; print "^^You:"; ! style roman; ! print "^How can I ever forgive you? There is nothing to forgive.^^^"; style roman; print "^"; style bold; print "Your actual words have been censored, at the request of Andrew \ Plotkin, who feels like you should actually play his game"; style roman; print " "; style underline; print "So Far"; style roman; print " "; style bold; print "to find out what this response is. So go play it. When you \ get there, you'll understand.^^"; style roman; print "Black begins to weep, then looks confused, then looks angry, \ then looks resigned, then looks inspired, then looks determined. "; print "~I have no idea what you mean. I mean, you "; style bold; print "could"; style roman; print " mean that, no, you don't forgive me, and it doesn't matter \ what I did that needs forgiveness because it's far too late. Or \ maybe you mean that what I've done is irrelevant and thus you don't "; style bold; print "need"; style roman; print " to forgive me. Which strikes me as kind of arrogant, because \ I'd hardly call leaving you, attempting to destroy the multiverse, \ concealing both our genders through the course of a long and \ rocky relationship, and forgetting to water the plant irrelevant. "; print "Or maybe you...~ Black's head shakes from side to side. \ ~I dunno. But I do know one thing: you're stuck with me at least \ until we figure out how to get out of here.~^^"; }; if ((testscope(mimesis,black)) | (testscope(mimesis,player))) { ! MST3K tag: "STINGER" print "Then Black sees the houseplant: ~My goodness, what "; style bold; print "have"; style roman; print " you done to that poor mimesis plant?~^^"; }; print "^^^^^So it's not perfect. But what is? And, all things \ considered, at the end of the day you really \ can't think of anyone with whom you'd rather be trapped in an abandoned \ scrapple factory."; deadflag = 2; rtrue; ]; [CheckLewdSub; ! "Fuck" with no object. if (lewd) "My sentiments exactly."; <>; ]; [GoToBedSub; if (testscope(bed,player)) { move player to bed; "You get onto the bed."; } "There is nothing comfortable to lie on here"; ]; [ShootSelfSub; if (testscope(big_gun,player)) { deadflag = 1; "Oh, it's hopeless. Time to end it all. You insert the barrel of \ the big gun between your lips, and with a sigh composed of equal \ parts ennui and despair, vaporize your own head."; } "Although suicide is an attractive option, you have nothing which which \ to shoot yourself."; ]; [SleepSub; ! See "Ralph" from the '96 Competition for Blamant... if (player notin bed) "You aren't feeling especially drowsy."; if (mimesis notin player) "You toss and turn, but the bed is simply far \ too big to sleep in alone, and you sent \ Blamant the Teddy Bear out to be cleaned \ this morning."; if (player hasnt general) { give player general; Achieved(SLOTH); Reward(SLOTH); "You clutch the mimesis plant to your chest, and fall into \ a troubled sleep, haunted with dreams of chessboards \ and featureless white cubes."; }; ! {_Zork Zero_ | _Curses_} and {_Spellbreaker_ | _Balances_} "Try as you might, you can't fall asleep again."; ]; [LewdSub; ! cf. _Leather Goddesses of Phobos_ lewd = true; "Lewd mode on. No age checks, no verification. Just raw, \ unadulterated lewdness."; ]; [RacySub; ! ditto lewd = false; "Racy mode on."; ]; [TameSub; ! ditto "There is no tame mode in this game! How would we ever sell Fox the \ rights to it?"; ]; [XyzzySub; ! Because I had to. "A hollow voice says, ~Bite me.~"; ]; [WaterSub; ! Stolen from Advent.inf if ((glass in player) && (water in glass)) <>; "Water? What water?"; ]; [StrikeSub; ! Default is Attack, overridden in Rod of Returning <>; ]; [PointSub; ! Default, overridden in Rod if (noun == nothing) "That's not polite."; "You look ridiculous pointing ",(the) noun," at ",(the) second,"."; ]; [PlugSub; ! Default, overridden in Goggles "You can't plug ",(the) noun," into anything."; ]; [UnplugSub; ! Default, overridden in Goggles if (second == nothing) "You can't unplug ", (the) noun,"."; "You can't unplug ",(the) noun," from ",(the) second,"."; ]; [Plug2Sub; ! Default, overriden in Goggles "You can't plug in ",(the) noun,"."; ]; [ Initialise; location = Living_Room; move devil to Front_Hall; ! This lets me put the complicated objects move kunkel to Scrappelizer; ! in their own code blocks move mimesis to Living_Room; print "^^^^^Pain. Unceasing pain. Ever since your lover Black left, \ something \ to do with a mysterious stranger and a time machine, your days have \ been a dull blur of gray loneliness. Perhaps you'd feel better if \ you got out and did something.^^^^"; ! cf. _Jigsaw_ rtrue; ]; !-----------------------The apartment--------------------------------- Object Living_Room "Living Room" with description "This is the living room of your rather squalid apartment. The \ huge compass rose on your floor reminds you that your bedroom \ is west, the front hall is north, the kitchen is east, and the \ bathroom is south.", w_to Bedroom, e_to Kitchen, s_to Bathroom, n_to Front_Hall, has light; Object -> Compass_rose "Compass Rose" ! OK, so this is pretty obscure; it comes from the ubiquitous compass which ! has to do with cavers' mapping obsession. Someday I'll write the ! monograph on assimilation of caving language (minus a thorough ! understanding of it) into IF. with name "rose" "compass", description "This is a compass rose inlaid on your floor, constructed \ painstakingly from pine, mahogany, and oak. You don't \ quite remember why you put it in, but it had something \ to do with caving and survey shots.", has static, has concealed; Object Bedroom "Bedroom" with description "The bedroom is pretty grim these days. It's \ a beige rectangular prism with a bed in it. There \ are also the usual bedroomy things: dressers, a \ lamp, a nightstand, and so on.", e_to Living_Room, has light; 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. It's much too big \ for you alone, you can't help but realize.", 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 -> dust "dust" with name "dust", with description "Persistent, aren't you?", has concealed static; Object -> bedroom_stuff "bedroom stuff" with name "dresser" "dressers" "nightstand" "table" "lamp" "lamps" "mirror" "tables", description [; print "Just the bric-a-brac of a standard adult bedroom. \ You don't want to think about it. If you think you \ do, go check out the bathroom or kitchen scenery \ instead."; style bold; if (self hasnt general) print "^^Author's Note: Sure, I could make a dresser \ and nightstand with opening drawers, a lamp you could \ turn on and off, a headboard you could tie things \ to, box springs for the bed, carpeting with \ repulsive items ground into it, and a sock drawer \ full of real live socks. But I won't. This is just \ scenery and it's going to stay that way."; give self general; if (bathroom_stuff has general) print "^^(Yes, just like \ the bathroom scenery.)"; style roman; ""; ], has concealed static; Object Kitchen "Kitchen" with description "This is your kitchen: walls papered in a yellow floral \ design, counter, cabinet, sink, stove, table, chairs, \ fridge, microwave, and so on. The living room is west.", w_to Living_Room, has light; Object -> kitchen_stuff "kitchen stuff" with name "wallpaper" "walls" "chair" "stove" "oven" "chairs", description "This is still just scenery. Bear with me.", has concealed static; Object -> sink "kitchen sink" with name "sink" "kitchen" "metal", description [; print "This is a standard issue kitchen sink. Rather than \ actually implementing a faucet and two knobs, let's just say that \ you can fill containers from it when you want to. It is an \ unlimited source of the finest tap water"; if (child(self)~=nothing) { print ". It contains "; WriteListFrom(child(self),ENGLISH_BIT); "."; } "."; ], has scenery container open transparent; Object -> -> fork "fork" with name "fork" "metal" "dinner", description "Your basic four-tined dinner fork."; Object -> microwave "microwave" with name "microwave" "oven", description [; print "Just your basic tiny microwave oven. It has a big red button \ labelled ~Zap~ on the front. It is currently "; if (self has open) { print "open, and contains "; if (child(self)==nothing) {print "nothing";} else { WriteListFrom(child(self),ENGLISH_BIT);}; } else {print "closed";}; "."; ], before [; SwitchOn: <>; SwitchOff: "But it's already off!"; ], capacity 1, has scenery container openable ~open; Object -> button "red button" with name "button" "red" "zap", description "The big red button adorns the front of the microwave. It \ is clearly labelled ~Zap~ and almost beckons you to press it.", Before [; Push: if (microwave has open) "The microwave beeps petulantly."; if (chinese_food in microwave) { if (chinese_food has general) { remove chinese_food; "A horrid plume of greasy smoke goes up as the food in the \ microwave vaporizes."; } else { give chinese_food general; "The tantalizing aroma of hot Chinese food assails your \ nostrils."; } } if (fork in microwave) { "Oooh! Look at all the pretty, pretty sparks!"; } if (children(microwave) == 1) { print "The microwave hums briefly, and the "; print (name) child(microwave); remove child(microwave); " vanishes in a plume of greasy smoke. You can almost hear the \ microwave chuckle evilly."; } "The microwave hums briefly."; ], has scenery; Object -> table "kitchen table" with name "white" "wood" "wooden" "small" "kitchen" "table", description "A white wooden table, large enough for two people to \ eat at comfortably.", has scenery supporter enterable; Object -> cabinet "kitchen cabinet" with name "wood" "wooden" "kitchen" "cabinet", description "Merely a plain wooden cabinet.", has scenery container openable ~open; Object -> -> cereal_box "red cardboard box" with name "box" "Puffs" "red" "cardboard", description "This is a bright red box of ~Sugar Coated Corn \ Puffs,~ a terrifyingly unhealthy part of your complete breakfast.", has container openable ~open; Object -> -> -> cereal "cereal" with name "cereal" "sugar" "coated" "corn" "puff" "puffs" "white" "yellow" "whitish", description "The Sugar Coated Corn Puffs are whitish-yellow, with \ a coating of sugar.", article "some", After [; Eat: remove self; "Mmmmm, tasty. Just like, in fact, you'd expect \ something called ~Sugar Coated Corn Puffs~ to \ taste."; Taste: "Sugary."; ], has edible; Object -> -> -> toy "toy" with name "toy" "plastic" "blue" "ugly" "useless", description "This is an ugly blue plastic toy included as a prize in \ the box of cereal. It appears to have no use whatsoever, and indeed \ it is unclear what, exactly, it is meant to represent."; Object -> fridge "refrigerator" with name "refrigerator" "fridge" "red", description [;print "This is a gigantic old fridge, bright red, of the \ latching-handle variety. It is "; if (self has open) { print "open, and contains "; if (child(fridge)==nothing) {print "nothing";} else { WriteListFrom(child(fridge),ENGLISH_BIT);}; } else {print "closed";}; "."; ], before [; Close: if (player in fridge) { deadflag = 1; "Congratulations. Ignoring your mother's sage advice, you \ have locked yourself in the fridge. Your futile cries \ for help go unheeded. Your death is slow, grisly, and \ cold."; } ], has scenery container openable ~open enterable; Object -> -> chinese_food "Chinese food" with name "food" "chinese" "box" "cardboard" "greasy" "chicken" "general" "tso^s" "spicy", article "some", description [; print "Some of last night's take-out General \ Tso's chicken. It's spicy and encased in a \ cardboard box for your convenience. "; if (self has general) "It is piping hot."; "Cold and greasy, though."; ], before [; Eat: if (self hasnt general) "But it's cold!"; if (fork notin player) "With your bare hands? \ You have better manners than that."; remove self; "It's actually pretty tasty. So tasty, in fact, \ that you eat the carton too in your \ enthusiasm."; Smell, Taste: if (self hasnt general) "Cold \ grease and cardboard."; "Mmmm! Chili peppers."; ], after [; Insert: if (second == fridge) {give self ~general; rfalse; }; ], has edible ~general; Object -> counter "counter" with name "counter" "formica" "stained" "scarred" "white", description "This is a standard stained and scarred formica \ counter. It's white, where it isn't stained.", has scenery supporter enterable; Object -> -> glass "juice glass" ! The glass and water code are lifted directly from Advent.inf, only ! changing the names. with name "glass" "small" "juice", initial "There is an empty juice glass here.", before [; LetGo: if (noun in glass) "You're holding that already (in the glass)."; Receive: if (noun == water) <>; else "The glass is only supposed to hold liquids."; Fill: if (child(glass) ~= nothing) "The glass is full already."; if (water in location) { move water_in_the_glass to glass; "The glass is now full of water."; } "There is nothing here with which to fill the glass."; Empty: if (child(glass) == nothing) "The glass is already empty!"; remove child(glass); "Your glass is now empty. That wasn't very productive."; ], has container open; Object water_in_the_glass "cold water" with name "water" "h2o" "cold", article "some", before [; Drink: remove self; "The water is cold and refreshing."; ], description "It looks like ordinary water."; Object water "tap water" with name "water" "tap", found_in Kitchen Bathroom, before [; Drink:if (testscope(water_in_the_glass,player)) { remove water_in_the_glass; "You drink cold, refreshing water from the glass."; }; "From the tap? Grow some manners."; Take: if (glass notin player) "You have nothing in which to carry the water."; <>; Insert: if (second == glass) <>; "You have nothing in which to carry the water."; ], has scenery; Object and_so_on "and so on", ! Thanks to Stephen Granade with name "and" "so" "on", description "Stop being a wiseass.", found_in Kitchen Bathroom Bedroom, has concealed static scenery; Object Bathroom "Bathroom" with description [; print "The salient feature, to borrow a technique from "; style underline; print "Detective"; style roman; ", is the exit to the north. Sure, there's a sink, a tub, a \ toilet, a medicine cabinet, and so on in here, but I promise you \ that you lose nothing by failing to examine them."; ], n_to Living_Room, has light; Object -> bathroom_stuff "bathroom stuff" with name "tile" "toilet" "john" "loo" "crapper" "tub" "bathtub" "shower" "sink" "cabinet" "medicine", description [; print "Really, it's still just scenery."; style bold; if (self hasnt general) print "^^Author's Note: I'm certain I could make a \ bathtub you could bathe or shower in, with hot or \ cold water, a toilet that flushed and removed its \ contents, a medicine cabinet with a child-proof \ bottle within, and a fluffy towel on which to dry \ off. But I haven't, and frankly I don't care that \ much about implementing bodily functions or \ sanitation in the game."; if (bedroom_stuff has general) print "^^(Yes, exactly like the bedroom decorations.)"; style roman; give self general; ""; ], has concealed static; Object Front_Hall "Front Hall" with description "This is the front hall; a door north leads outside, \ and the living room is to the south.", s_to Living_Room, n_to Front_Door, has light; Object -> Front_Door "front door" with description "The front door of your house is wooden and painted \ white.", name "door" "front" "white" "wood" "wooden", when_closed "The door is closed.", when_open "Through the open doorway, you can see a swirling \ violet mist, rather unlike the busy, dirty, and \ noisy street onto which it used to open.", door_to [; print "^^^^^^^^As you step into the mist, everything becomes \ indistinct and hazy; you spin, receding ever-farther \ from consciousness. Everything goes black...^^^^^^^"; MAX_SCORE = 10; ! Suddenly, there are three more puzzles! return Scrapple_Factory; ], dir_to n_to, before [; Open, Unlock: if (self hasnt general) "The devil, giggling nastily, \ stops you. ~Not until I see some sin, son.~"; move purple_mist to Front_Hall; ! Mist appears through rfalse; ! open door only. Close: if (self has general) remove purple_mist; rfalse; ], has static door openable locked; Object disk_box "diskette case" with name "box" "case" "disk" "diskette" "plastic" "small" "disks", description [; give self general; print "This looks very much like every other cheap open-topped plastic disposable diskette case \ you've ever seen, although the ~Made In Hell~ \ label is a little disturbing. It looks like it could \ hold about seven disks. It seems to contain "; WritelistFrom(child(disk_box), ENGLISH_BIT); "."; ], capacity 7, before [; Receive: if (second ofclass diskette) rfalse; "The diskette box can only hold diskettes. Hence the name."; ], has container open transparent; Object if_cdrom "~Sinful Delights and More: Masterpieces of Interactive Fiction, CD Edition~" with name "CD" "CD-ROM" "cdrom" "sinful" "delights" "compact" "disc" "disk" "masterpieces" "if" "interactive" "fiction" "more" "text" "adventure" "adventures", description [; print "A sparkling CD-ROM, with an attractive logo \ proclaiming it to be "; style underline; print "Sinful Delights and More: Masterpieces of \ Interactive Fiction"; style roman; "."; ], has proper; Class diskette with name "disk" "diskette" "floppy", description [; print "A floppy disk labelled "; style underline; print (object)self; style roman; "."; ], before [; Take,Remove: if (self in disk_box) "You know if you take a disk out of the \ box you'll probably lose it."; ! This is merely a really cheesy way to prevent massive ! inventory problems while getting past the devil. rfalse; ], has proper; ! This probably would have worked better with an array, but I'm just ! learning Inform. Object lust_disk "~The Incredibly Erotic Adventures of Stiffy Makane~" class diskette, with name "Stiffy" "Makane" "Erotic" "Adventures" "Incredibly"; Object wrath_disk "~Beyond Zork~" class diskette, with name "beyond" "zork"; Object avarice_disk "~Zork I~" class diskette, with name "zork" "one" "I"; Object sloth_disk "~In The End~" class diskette, with name "in" "the" "end"; Object gluttony_disk "~Planetfall~" class diskette, with name "Planetfall"; Object pride_disk "~Curses~" class diskette, with name "Curses"; Object envy_disk "~Hollywood Hijinx~" class diskette, with name "Hollywood" "Hijinx"; Object purple_mist "purple mist" with name "mist" "purple" "haze" "violet", description "This is probably what Hendrix was thinking of when he \ wrote his song. It is disturbingly opaque, and \ swirls around in an unsettling and faintly \ nauseating manner.", before [; Smell: "Cardamom. Or is it coriander?"; ! cf. _So Far_ ], has scenery; !-----------------------------The Mimesis--------------------------- ! This plant comes from the post referenced in the Epigram() box and ! reprinted at the top of the source. Object mimesis "variegated mimesis plant" with name "mimesis" "variegated" "striped" "yellow" "green" "yellow-green" "plant" "potted" "houseplant", initial "Your mimesis plant squats in its pot in a corner of the \ room, slowly photosynthesizing.", description [; print "This is a prizewinning specimen of the species "; style underline; print "Mimesis Variegans"; style roman; print ". It is dark green, with yellow stripes on \ its luxurious leaves. The mimesis plant thrives in \ low light and requires occasional watering. You've \ always preferred the variegated to the linear \ variety, yourself. This one is about ten inches high. "; ! Start listing visible signs of the sins committed on the plant if (self hasnt edible) { print "A large bite has been taken out of one leaf. "; }; if (self has kissed) { print "It appears well-loved. "; }; if (self has attacked) { print "One of the leaves is ripped. "; }; if (self hasnt watered) { print "The plant looks rather dry. "; }; if (self hasnt general) { print "^^Your heart swells with pride as you consider your \ beautiful houseplant.^"; give self general; Achieved(PRIDE); Reward(PRIDE); } else ""; rtrue; ], before [; Kiss:if (self hasnt kissed) { Achieved(LUST); Reward(LUST); give self kissed; }; print "You plant a kiss on the mimesis. "; if (lewd) { print "Your kiss deepens. Your embrace \ becomes hot and heavy and you surrender to the \ delights of floral sex. In the words of Stiffy \ Makane, "; style bold; print "Aaaaaaaaaaaahhhhhhhhhhhhahhhhhhhhhh!"; style roman; }; ""; Attack:if (self hasnt attacked) { Achieved(WRATH); Reward(WRATH); give self attacked; "You angrily rip a leaf from the mimesis plant."; } else { "You haven't the heart to damage your lovely \ plant any farther."; }; Eat: if (self has edible) { Achieved(GLUTTONY); Reward(GLUTTONY); give self ~edible; "You gluttonously take a bite out of one of the \ plant's leaves. It's really nasty. Ugh."; } else { "After that last taste of it? No, thank you."; }; Water: if ((glass notin player) || (child(glass) == nothing) ) "You have nothing with which to water the plant."; if (self hasnt watered) { give self watered; Achieved(ENVY); Reward(ENVY); remove child(glass); "You carefully water the plant, wishing that you \ had someone to nurture you. Lucky plant."; } else { "You wouldn't want to over-water the plant."; }; ], after [; Take: if (self hasnt moved) { Achieved(AVARICE); Reward(AVARICE); print "You greedily snatch at the mimesis.^"; }; rfalse; ! So we can eat without holding and get both points Drop: "You carefully set the mimesis down."; ], has edible ~kissed ~watered ~attacked; !-----------------------------The Devil----------------------------- ! See _John's Fire Witch_ for the devil on whom this is loosely based, and ! for the source of the "give the sins to the devil" puzzle. This devil ! is actually a cross between that devil and the Nerd from _Bureaucracy_. Object Devil "devil" with name "Bob" "demon" "daemon" "imp" "devil" "nerd" "dork", description "He is a jolly, fat little devil, \ with thick glasses, a Moe \ haircut, short but sharp-looking horns, a long tail with \ a barb on the end, a pink T-shirt reading ~IETF 28 \ Terminal Room~, Birkenstocks (which look particularly \ silly on his hooves), too-tight cordouroy pants, and a \ pocket protector. His complexion manages, through the \ mysteries of the supernatural, to be simultaneously firebrick red and pasty white.", initial "A devil, looking for all the world like a cross between the \ BSD Unix devil and Bill Gates, slouches insolently in the corner.", life [; Answer: "The devil glares at you and mumbles, ~Bletch foobar \ to you too!~"; Ask: switch(second) { 'devil', 'demon', 'himself', 'self': if (self hasnt general) { give self general; print "~Bob's the name! Interactive \ fiction's the game! Well, actually, the meta-game, I \ guess, because 'the game' properly ought to \ refer to an actual title, such as "; style underline; print "Jigsaw"; style roman; " or something. Say, , can I go out with \ your sister?~"; } else { "~ Can I go out with your sister?~"; ! cf. Nerd in _Bureaucracy_ }; 'bob': if (self hasnt general) { "~How did you know my name? Did you use \ DejaNews?~"; } else { "~That's my name! Don't wear it out! ~"; } 'dejanews': "~A way to hold people accountable for things they said \ in moments of madness and wish were forgotten!~"; 'newsgroup','rec','raif','rgif','usenet': "~The rec dot star dot int dash fiction groups are \ just the coolest!~"; 'zarf','plotkin': "~He's so dreamy!~"; 'graham','nelson': "~I want to bear Graham Nelson's children!~"; 'whizzard','gkw','gerry','kevin','wilson': "~It's really swell of him to host the \ competition and all, but I sure wish he'd finish that \ game of his!~"; 'adam': "~Do you mean Cadre, who's cool, or \ Thornton, who's a total choad?~"; 'cadre': "~He's a very sinful IF author indeed!~"; 'bruce', 'thornton': "~Adam Thornton. Wow, talk about a \ total dork !~"; 'choad': "~Save the choad!~"; 'john', 'baker': "~He wrote a really cool game with my \ cousin in it.~"; 'holder': "~He wrote JZIP, but Thornton screwed up the \ attributions.~"; 'kunkel', 'bill': "~Ugh. The Kunkel is smelly and stupid.~"; 'toy','blue','plastic','ugly': "~What do I look like ? The Troll of \ Omniscience?~"; 'xyzzy','plugh','plover','yoho','bunyon': "~That's an ancient word of power there. Be \ careful using it!~"; 'mimesis', 'plant', 'houseplant': "~ A hardy houseplant. I never was much into \ botany myself. Now, the subtle manipulations of \ Turbo Pascal...~"; ! High school math competition. You had to be there. 'water': "~Dihydrogen monoxide. Cool. ~"; 'me', 'myself', 'player': "~I hope you're feeling sinful \ today, because otherwise I can't let you leave.~"; 'door': "~ You gotta pay your dues before you can go, \ buddy.~"; 'sin', 'sins', 'deadly': "~Sins, deadly. Pride, \ Avarice, Sloth , Gluttony, Envy, Wrath, and Lust.~"; 'ietf','internet': "~The Internet Engineering Task Force is \ so cool! I got this shirt from some guy. Sucker \ wanted to buy a soul off me. I got the better \ end of that deal. ~"; ! One of my shirts. It *is* nauseatingly pink. 'interactive', 'fiction', 'IF': "~ It's the best! \ Graham Nelson is mega--cool!~."; 'avarice', 'greed': print "~You know, greed. Like, uh, grabbing onto stuff \ and keeping it."; ! All of these explain why the particular game chosen for each sin is ! representative of that sin, only after the sin has been achieved. if (mimesis has moved) { print " "; style underline; print "Zork I"; style roman; print " epitomizes the snatch-and-hoard genre of IF."; } "~"; 'wrath', 'anger': print "~Anger, rage. Whackin' on stuff ."; if (mimesis has attacked) { print " "; style underline; print "Beyond Zork"; style roman; print " is unique among Infocom games for its RPG-like \ and too-oft repeated combat system."; } "~"; 'pride': print "~Goeth before a fall . Knowing you're \ the best, whether you are or not. Taking credit \ where maybe it isn't due."; if (mimesis has general) { print " The first line of "; style underline; print "Curses"; style roman; print " is ''It's become a matter of pride now not to \ give up.''"; } "~"; 'envy', 'jealousy': print "~That ol' green-eyed monster!"; if (mimesis has watered) { print " Cousin Herman, your nemesis in "; style underline; print "Hollywood Hijinx"; style roman; print ", is consumed with his jealousy."; } "~"; 'sloth': print "~When in doubt, take a nap, I always say."; if (player has general) { print " "; style underline; print "In The End"; style roman; print " is, in addition to being tedious, all about \ ennui, which is almost the same as sloth. A \ better choice would have been "; style underline; print "Avalon"; style roman; print " but, since the time machine is busted, we \ couldn't get you the disk."; } "~"; 'gluttony': print "~Yummy, yummy, yummy, I've got "; style bold; print "looooooove"; style roman; print " in my tummy ."; if (mimesis hasnt edible) { print " "; style underline; print "Planetfall"; style roman; print "'s worst feature is the obnoxious food \ daemon."; } "~"; 'lust': print "~The horizontal polka! The \ beast with two backs! My favorite sin of all...\ in theory, anyway. Starts with a little kiss, \ but quickly progresses to the unspeakably lewd."; if (mimesis has kissed) { print " The obvious choice for a game about raw \ animal lust is, of course, "; style underline; print "The Incredibly Erotic Adventures of Stiffy Makane"; style roman; print ". It makes "; style underline; print "Leather Goddesses of Phobos"; style roman; print " look like "; style underline; print "Lady Chatterly's Lover"; style roman; print "."; } "~"; 'zork', 'beyond', 'planetfall', 'curses', 'hollywood', 'hijinx', 'in', 'end', 'incredibly', 'stiffy', 'makane', 'cd', 'seven', 'cdrom', 'cd-rom': "~That's for me to know and you to play!~"; } "~NAK! NAK! Re-transmit! ~"; Tell: "~Less chin, more sin! ~"; Order: "~You can't make me! I'm supernatural.~"; ThrowAt, Attack, Kiss: "~No, you nincompoop! \ I'm not the target of your sins!~"; Give, Show: switch(noun) { mimesis: "~That poor plant!~"; if_cdrom: "~You earned it, you nasty bad \ sinner, you.~"; disk_box: print "The devil peers into the case. ~So, you think \ you're a sinner, huh? Well, let's see...so far \ you have "; if (player has general) print "Sloth, "; if (mimesis has moved) print "Avarice, "; if (mimesis has general) print "Pride, "; if (mimesis has watered) print "Envy, "; if (mimesis hasnt edible) print "Gluttony, "; if (mimesis has attacked) print "Wrath, "; if (mimesis has kissed) print " Lust, "; print "and "; if (score == 7) { give front_door ~locked open general; move purple_mist to front_hall; remove disk_box; move if_cdrom to player; "that's the complete set. Good job! \ Tell you what. Diskettes are so archaic. \ Let me...~ The devil takes your diskette case \ and squeezes it hard while chanting ~Fee, Fie, Foe, \ Foo!~ Squashing it into a CD, he hands it \ to you. Then he gestures with his finger, \ and the front door swings open."; }; print "that's all. "; if (score < 4) "You call this sinful? Your maiden \ aunt could do better!~"; if (score < 5) "You're getting closer. ~"; if (score < 6) "Just a couple of sins left. Well into the \ naughty realm, if not actually sinful.~"; " Only one sin to go, before you're very \ bad indeed!"; }; "The demon stares at you as if you are mad."; ], has animate male transparent; Object -> -> Devil_Clothes "devil's clothing" with name "clothing" "t-shirt" "birkenstocks" "pants" "cordouroy" "pocket" "protector", description "Fashion is not this devil's strong point.", has concealed static; !-----------------The Scrapple Factory------------------------- ! This is my object from the Silly Game on rec.arts.int-fiction, although ! when I wrote it I described the factory while still in operation. Object Scrapple_Factory "Scrapple Factory" with description "Once upon a time, this was a scrapple factory. \ The floor would have been covered in piles of barely-identifiable \ pig parts, awash in blood and industrial chemicals. However, \ those times are long gone. The conveyor belt that used to \ connect the Scrappelizer to the reduction vat has long since \ rusted into immobility. There are no doors or windows; \ light comes from a bare light bulb hanging in the immense empty \ space. The rusted Scrappelizer squats to the north, and the vat is south.", n_to Scrappelizer_door, s_to vat, d_to vat, has light; Object -> bulb "light bulb" with name "light" "bulb" "bare", description "The bare light bulb, favored by tinpot dictators and \ goonish interrogators everywhere.", has scenery; Object -> scenic_scrappelizer "Scrappelizer" with name "scrappelizer" "machine" "metal" "rusty" "rusted" "conveyor" "belt" "vat" "hopper", description "The Scrappelizer was a fairly simple machine. You \ dumped pigs--or whatnot--into the hopper at the top, and with \ a hideous squealing noise, a mass of bloody pig--or \ whatnot--parts would emerge on the conveyor belt, to be carried \ to the vat, where heat, chemicals, and time would conspire to \ produce Scrapple.", found_in Scrapple_Factory Scrappelizer Vat, has scenery; Object Scrappelizer_door "scrappelizer door" with name "hole" "trap" "door", description "A rectangular hole, big enough to squeeze \ through.", ! Classic two-way door when_open [; if (location == Scrapple_Factory) "A rectangular hole allows access to the innards \ of the Scrappelizer."; "A rectangular hole allows access to the \ factory."; ], ! Unplug the goggles before we leave door_to [; if (location == Scrapple_Factory) return Scrappelizer; if ((vr_goggles in player) && (vr_goggles hasnt general)) {print "^[Unplugging the VR goggles first.]^^"; give vr_goggles general; }; return Scrapple_Factory; ], door_dir [; if (location == Scrapple_Factory) return n_to; return s_to; ], found_in Scrapple_Factory Scrappelizer, has door static open; Object Scrappelizer "Scrappelizer" with description "Horrifyingly, the interior of the Scrappelizer has \ been remodelled into a home, of sorts. It is, in \ fact, the lair of a Kunkel, complete with \ multimedia PC.", s_to Scrappelizer_Door, has light; Object -> vr_goggles "VR goggles" with description [; if (kunkel hasnt general) "It's hard to see the goggles clearly, since they're \ on the Kunkel's face, and consequently twitching and swerving \ around."; print "A pair of slightly charred VR goggles, currently "; if (self has general) "unplugged."; "plugged into the computer."; ], name "goggles" "vr" "virtual" "reality" "pair" "goggle" "of" "them", article "a pair of", before [; Remove,Take: ! You cannot take them while the Kunkel is alive if (kunkel hasnt general) { "As you approach, you see that the Kunkel's face has \ actually grown into the goggles. Revolted, you \ retreat."; }; rfalse; Unplug:if (self has general) "But the goggles are \ already unplugged!"; if (kunkel hasnt general) { StartDaemon(kunkel); ! Wake him up... }; give self general; "You unplug the VR goggles."; Plug:if (self hasnt general) "But the goggles are \ already plugged in!"; if (vr_goggles in sack) "Not while the goggles \ are in the sack, you won't."; if (second == nothing) "You must specify something \ to plug the goggles into."; if (second ~= computer) "You can't plug the \ goggles into ",(the) second,"."; print "You plug the goggles into the computer"; if (kunkel hasnt general) { StopDaemon(kunkel); kunkelturns = 0; print ", and the Kunkel relaxes."; if (computer has open) {print " The Kunkel sighs \ and closes the CD-ROM drive.^^"; give computer ~open;}; ! See the explanation of how the Kunkel works in its code if (child(computer) == if_cdrom) KillKunkel(); if (child(computer) == nothing) { print "The Kunkel is awfully displeased at having its game interrupted."; KunkelDeath(); }; } else print "."; give self ~general; ""; Plug2: if (location ~= Scrappelizer ) "There's nothing \ into which to plug the goggles here."; <>; Insert: if (second == computer) <>; if (second == sack) { if (self hasnt general) { give self general; print "^[Unplugging the VR goggles first.]^^";}; rfalse; }; "You can't put the goggles in ",(the) second,"."; Wear: if ((computer hasnt on) || (vr_goggles has general) || (child(computer)==nothing) || (computer has open)) "You put the goggles on, but they show nothing, \ so you remove them."; print "^Wow! Virtual reality really does work! \ With a sensation of great speed, you are \ transported to....^^^^^"; remove vr_goggles; if (child(computer)==if_cdrom) { PlayerTo(TextWorld); rtrue; }; PlayerTo(StiffyWorld); StartDaemon(vixens); move big_gun to player; move pink_key to player; rtrue; ], has clothing concealed; Object -> Computer "computer" with name "computer" "PC" "multimedia" "expensive" "drive" "cd-rom" "speakers", description [; print "This must be the Kunkel's computer. It's the very \ latest in ultra-whiz-bang mega-expensive technology. It seems \ to have VR goggles, a CD-ROM drive, and big speakers. "; if (self has open) {print "The CD-ROM drive is open"; if (child(self)==nothing) "."; print " and contains "; WriteListFrom(child(self),ENGLISH_BIT); "."; }; ""; ], capacity 1, before [; Open: if ((vr_goggles hasnt general) && (kunkel hasnt general)) "You open the CD-ROM drive. The Kunkel's game must \ have come to a screeching halt, because it stops \ twitching, swears, and thumbs the drive door shut \ before you can react."; ! So you need to distract the Kunkel... rfalse; SwitchOff: if (kunkel hasnt general) { print "By doing so, you are striking at the very \ reason for the Kunkel's existence. It is not pleased."; ! Bad idea... KunkelDeath(); ""; }; rfalse; Insert: if ((noun ~= Stiffy_CD) && (noun ~= if_cdrom)) "You can't put ",(the) noun," in the CD-ROM drive!"; rfalse; ], has static concealed switchable on openable ~open container; Object -> -> Stiffy_CD "a CD labelled ~Stiffy Makane, Space Marine~" with name "Stiffy" "Makane" "Space" "Marine" "CD" "CD-ROM" "CDROM", description [; ! Yes, "Stiffy Meets Doom" print "It's a garishly printed CD entitled "; style underline; print "Stiffy Makane, Space Marine"; if (lewd) print ": The Second Cumming"; style roman; "."; ], has proper; Object vat "The Vat" with description "You are inside the rendering vat of the abandoned \ scrapple factory. Even now it reeks of despair and waste-meat \ food products.", before [; Smell, Taste: print "The stench in here is enough to make \ far stronger people than you "; if (lewd) "puke their guts out."; ! cf. _LGOP_ "retch."; ], n_to Scrapple_Factory, u_to Scrapple_Factory, has light; Object -> sack "rucksack" with name "rucksack" "backpack" "pack" "sack", initial "Great Scott! What can only be the rucksack of the Meldrews, \ fabled in song and story, lies here at the bottom of \ the rendering vat.", ! cf. _Curses_. Contents too. description [; print "Actually, it's very tatty and greasy, saturated \ with long-rancid lard, stained with blood (or worse), \ and beginning to give at the seams. It is "; if (self hasnt open) "presently closed."; print "open and contains "; WritelistFrom(child(sack), ENGLISH_BIT); "."; ], before [; Smell: "The sack smells revoltingly of pork byproducts."; Taste: "Something like pork rinds, only really \ disgusting."; ], capacity 25, has container open openable clothing; Object -> -> map "tourist map of Paris" with name "map" "paris", description "An exorbitantly expensive map of Paris \ circa 1993."; Object -> -> rod "Rod of Returning" with name "rod" "returning" "magic" "magick", article "the", description "One of the last remaining bits of Druidical Magic.", after [;Take: if (self hasnt moved) { print "^With a 'pop' and a whiff of ozone, the devil \ appears. ~Look, I shouldn't be doing \ this, but if you're one of the last three people in \ the world who hasn't played "; style underline; print "Curses"; style roman; print " then maybe you need some instructions. "; print "To charge the rod, 'strike rod.' To use it \ 'point rod at .' Got it?~"; print "^^There is another 'pop' and the devil is \ gone.^^"; Achieved(RODGOTTEN); }; rfalse; ], before [;Point: if (self notin player) "You need to be holding \ the rod before you can point it at \ something."; if (self hasnt general) "As the rod is not \ charged, nothing happens."; give self ~general; if (second == player) { print "A flash of white light engulfs you"; if ((location == TextWorld) || (location == StiffyWorld) || (location == StiffyWorld2)) { ! Only useful for getting beings out of the VR worlds move vr_goggles to Scrappelizer; give vr_goggles ~concealed; print " and you awaken on the hard metal \ floor of the Scrappelizer. The VR goggles \ lie next to you as you painfully regain \ your feet.^^"; if (location ~= TextWorld) { vixenturns = 0; StopDaemon(vixens); remove big_gun; remove pink_key; }; PlayerTo(Scrappelizer); "";} else { ", but nothing else happens.";};}; ! Use on self or Black if (second ~= Black) { give self ~general; "A flash of white light \ engulfs ",(the) second,", but nothing else happens.";}; print "A flash of white light engulfs Black. There \ is a huge noise and white blots out your vision as the rod melts in your hands....^^^^"; Achieved(BLACKSAVED); StopDaemon(vixens); vixenturns = 0; move vr_goggles to Scrappelizer; give vr_goggles ~concealed; move Black to Scrappelizer; PlayerTo(Scrappelizer,1); remove big_gun; remove pink_key; remove self; Endgame(); rtrue; Strike: if (self has general) "The rod is already \ charged."; give self general; "The Rod of Returning charges up, drawing \ power from ley lines, or something like that."; ]; !-----------------------------The Kunkel---------------------------- ! Ahh, the Kunkel. Remember William (?) Kunkel's diatribe against the Sci-Fi ! pack, reposted to raif, in which it became obvious that he'd never ! actually played the games and his big problem was the primitive two- ! word parser? ! ! Well, this Kunkel lives only to play "Stiffy Makane, Space Marine" ! ! Here's the deal: you have to kill it by substituting the text adventure ! CD for Stiffy. But you can't open the computer unless the goggles are ! unplugged, because it'll notice. ! ! Once you've unplugged the goggles, you have a few turns to make the switch. ! if you leave the CD tray empty, you anger the Kunkel. If it's angry, it ! kills you the next turn you're in the room with it. ! ! The death-by-Kunkel routine is an homage to _Detective_ and more ! generally to AGT monsters, and I think it dates back to GAGS monsters. Object kunkel "Kunkel" with name "Kunkel", article "the", description [; if (self hasnt general) { print "The Kunkel is small and troll-like. It squats before \ its computer"; if (vr_goggles has general) ", trying to plug in its VR goggles."; ", twitching occasionally as the virtual reality \ mittens on its hands control some action in the game going on \ in the VR goggles plugged into its computer."; }; "The dead Kunkel lies on the ground, its head blown open and its \ eyes popped out, revealing the emptiness of its cranial cavity."; ], life [; if (kunkel has general) "The Kunkel isn't good for much \ of anything anymore, not that it ever was."; ThrowAt, Attack: print "The Kunkel somehow senses \ your impending attack. It rises and faces you."; KunkelDeath(); rtrue; Ask,Tell,Give,Show,Order,Answer: "The Kunkel is far too \ engrossed in its multimedia extravaganza to notice you."; WakeOther: "The Kunkel isn't asleep, just...engrossed."; Kiss: "Ugh."; ], before [; Smell: "The Kunkel smells of sweat, adrenaline, and poor \ hygiene. Add that to the stench of the \ Scrappelizer..."; Taste: "No."; ], daemon [; kunkelturns++; if (kunkelturns == 5) {kunkelturns=0; give vr_goggles ~general; Stopdaemon(self); if (location == Scrappelizer) {print "The Kunkel manages \ to plug the goggles back into the computer.^"; if (computer has open) {print "The Kunkel sighs and \ closes the CD-ROM drive.^"; give computer ~open;}; if (child(computer) == nothing) { print "The Kunkel is inordinately displeased that its \ game is no longer running."; KunkelDeath(); rtrue; }; if (child(computer) == if_cdrom) { KillKunkel(); rtrue; } } else { if (child(computer) == if_cdrom) { give self general; give computer ~open; Achieved(KUNKELDEAD); "There is a muffled shriek from the Scrappelizer."; }; if (stiffy_cd in Scrappelizer) move stiffy_cd to computer; give computer ~open; rtrue; }; }; if (location == Scrappelizer) { switch (kunkelturns) { 1: "The Kunkel sits stock-still, stunned by the loss \ of visual input."; 2: "The Kunkel begins to fumble for the cord of its \ VR goggles."; 3: "The Kunkel blunders around trying to reconnect \ the goggles."; 4: "It looks as if the Kunkel is about to succeed in \ plugging in the goggles."; }; }; ], each_turn [; if ((kunkel has general) || (vr_goggles has general)) rtrue; if (location ~= Scrappelizer) rtrue; if (self has attacked) { print "The Kunkel, searching for its lost CD, sees you, and \ determines (correctly, as it happens), that you are the \ cause of its problems.^"; KunkelDeath(); } switch (random(6)) { 1: "^The Kunkel flinches and swears."; 2: "^The Kunkel yelps."; } ], has animate neuter ~general ~attacked; !----------------------The Endgame------------------------ ! The Text World. All actions simply return one of the descriptions, ! except for inventory and playing with the rod, so you can get out. ! ! The worlds, in order, are: Adventure, Zork I, Curses, Planetfall, ! Enchanter, Trinity, Leather Goddesses, So Far, Deadline, and Hitchhiker's ! Guide. Object TextWorld "Text World", with describe [; whichworld = random(10); switch (whichworld) { 1: "You are standing at the end of a road before a small \ brick building. Around you is a forest. A small \ stream flows out of the building and down a gully."; 2: "You are standing in an open field west of a white house, with a \ boarded front door."; 3: "The attics, full of low beams and awkward angles, begin here in \ a relatively tidy area which extends north, south and east. \ The wooden floorboards seem fairly sound, just as well \ considering how heavy all these teachests are. But \ the old wiring went years ago, and there's no electric light."; 4: "This is a featureless corridor similar to every other corridor \ on the ship. It curves away to starboard, and a gangway leads \ up. To port is the entrance to one of the ship's primary escape \ pods. The pod bulkhead is closed."; 5: "You stand at a point of decision on a road which makes a wide fork \ to the northeast and southeast, circling the base of the Lonely \ Mountain, which looms high overhead to the east. A very long and \ winding road starts here and stretches out of sight to the \ west through low, smoky hills."; 6: "A tide of perambulators surges north along the crowded Broad \ Walk. Shaded glades stretch away to the northeast, and a hint \ of color marks the western edge of the Flower Walk."; 7: "An undistinguished bar, yet the social center of Upper Sandusky. \ The front door is almost lost amidst the hazy maze of neon that \ shrouds the grimy glass of the south wall. Doors marked \ ~Ladies~ and ~Gents~ lead, respectively, \ northeast and northwest."; 8: "If nothing else, you have a good seat. The stage is only a few \ rows to the north. People are jammed on benches in every \ direction; you think the aisle is somewhere to the west."; 9: "You are on a wide lawn just north of the entrance to the Robner \ estate. Directly north at the end of a pebbled path is the Robner \ house, flanked to the northeast and northwest by a vast expanse \ of well-kept lawn. Beyond the house can be seen the lakefront."; 10: "The bedroom is a mess.^It is a small bedroom with a faded \ carpet and old wallpaper. There is a washbasin, a chair with \ a tatty dressing gown slung over it, and a window with \ the curtains drawn. Near the exit leading south is a phone."; }; ], n_to [;PlayerTo(TextWorld); rtrue;], s_to [;PlayerTo(TextWorld); rtrue;], e_to [;PlayerTo(TextWorld); rtrue;], w_to [;PlayerTo(TextWorld); rtrue;], ne_to [;PlayerTo(TextWorld); rtrue;], nw_to [;PlayerTo(TextWorld); rtrue;], se_to [;PlayerTo(TextWorld); rtrue;], sw_to [;PlayerTo(TextWorld); rtrue;], u_to [;PlayerTo(TextWorld); rtrue;], d_to [;PlayerTo(TextWorld); rtrue;], in_to [;PlayerTo(TextWorld); rtrue;], out_to [;PlayerTo(TextWorld); rtrue;], before [; if (action == ##Go or ##Look or ##Examine or ##Strike or ##Point or ##Inv or ##Insert) rfalse; if ((action == ##Drop) && (noun == map) && (testscope(map,player)) && whichworld==3) { remove map; Achieved(MAPDROPPED); deadflag = 1; score = -999; "Well now, you just did an end run around the whole idea \ of the Curse Of The Meldrews, didn't you? Your impulsive \ action has destroyed the entire fabric of the multiverse, \ and you along with it."; } if ((action == ##Take) && (noun in sack)) rfalse; if ((action == ##Remove) && (noun in sack)) rfalse; PlayerTo(TextWorld); rtrue; ], has light; ! Stiffyworld is "The Incredibly Erotic Adventures of Stiffy Makane" meets ! "Doom". "Shangri-La" is explained in "Stiffy" as "the Greaseman's" (a ! radio shock jock) term for orgasm, and thus could serve as some kind of ! warning. Object StiffyWorld "Ganymede Base Corridor XQJ-913" with description "A dull metal corridor, lit by flickering lights. The \ corridor continues west and ends in a pink door to the northeast \ with a pink keyhole. Painted in drippy blood on the wall are the word \ @@Shangri-La@@ and an arrow pointing west.", ne_to pink_door, w_to [; print "You stumble down the corridor and into a large room.^^"; Vixendeath(); rtrue; ], ! Not *quite* unwarned death... has light; Object -> Sign "drippy blood" with name "sign" "blood" "shangri" "la" "shangri-la", description "^^SHANGRI-LA^\ <---------^^", has static concealed; !Surely you don't need the symbolism explained... Object -> pink_door "pink door" with name "pink" "door" "keyhole", description "This is a pink door, about six feet high, with curved sides, \ tapering to a point at the top and bottom. It has a keyhole of a \ similar shape in its center", when_closed "The pink door bars passage to the northeast.", when_open "The pink door yawns open, promising tantalizing secrets \ within.", door_to StiffyWorld2, door_dir ne_to, with_key pink_key, after [;Unlock, Open: remove pink_key; give self ~locked; give self open; print "You "; if (lewd) { print "ram"; } else {print "insert";}; print " the key into the keyhole. It throbs "; if (lewd) print "four or five times "; "and vanishes. The door opens, like a flower blooming."; ], before [;Close, Lock: "^Once opened, these doors can no longer \ be closed.^";], has door static locked ~open lockable; Object StiffyWorld2 "Ganymede Base Room J-14-B-3.2" with description "This is a tiny room full of evil-looking machines and \ flashing lights. The only exit is southwest.", sw_to [; if (vixenturns < 6) return StiffyWorld; print "You reenter the corridor. "; Vixendeath(); rtrue; ], has light; Object -> stiffy_stuff "stiffy stuff" with name "lights" "machines" "flashing" "evil" "machine", description [; print "Yes, this is just scenery. Just like in "; style underline; print "Doom"; style roman; "."; ], has concealed static; ! cf. _Jigsaw_ Object -> Black "Black" with name "Black", description "As attractive as ever. Black appears to be \ unconscious and bolted into some sort of evil-looking machine.", before [; Smell, Taste: "This is hardly the time.";], life [; Attack: print "You beast! Fortunately, (at least for \ karmic justice) before you can attack, there comes a noise from the doorway.^^"; ! _Mimesis_, whatever it might be, is no _Stiffy_. VixenDeath(); rtrue; Kiss: if (lewd) <>; "This is hardly the time for romance."; WakeOther: "Black mumbles slightly, but does not awaken."; default: "Black can neither see nor hear you."; ], has proper animate ~male ~female ~neuter; ! cf. _Jigsaw_ Object pink_key "pink key" with name "pink" "key" "cylinder" "rod-shaped" "cylindrical" "rod", description "It is a pink cylindrical key, several inches long, and \ about an inch thick, with one rounded end."; !cf. _Stiffy_; totally useless, too. You *can* kill yourself with it, !though. Object big_gun "big gun" with name "big" "gun", description "BIG GUN KICK THE HELL OUTTA YOU!"; Object Vixens "a bevy of ultravixens" ! We never actually see these with name "vixen" "vixens" "ultravixen" "ultravixens" "babe" "babes", description "Every Russ Meyer film you have ever seen.", ! The Vixens don't actually need life routines and such, since the first ! time you see them you die. In fact, the description is superfluous too. ! ! Their behavior is loosely based on that of Public Pussy Pamela in "Stiffy" daemon [; vixenturns++; print "^"; switch (vixenturns) { 1: "You hear a sinister giggling from the west somewhere."; 2: "A fearsome ~HONK, HONK!~ echoes from the \ western corridor."; 3: "Loud, sensual moans are coming from the west and \ approaching rapidly."; 4: "~Pwoik, pwoik, pwoik~ resounds from the west, quite \ nearby."; 5: "A girlish shriek comes from just down the corridor."; 6: if (location == StiffyWorld) { Vixendeath(); rtrue;} else { "Just outside the door, someone screams \ ~Aaaaaaaaaaaahhhhhhhhhhhhahhhhhhhhhh!~"; }; 7: "~EEEEEK!~ comes from the southwest"; 8: "You hear a girlish voice reminiscing about the \ delights of ~Cabin Boy~, just to the \ southwest."; 9: "You hear the squeaking of silicone-enhanced breasts \ rubbing together, coming your way!"; 10: Vixendeath(); rtrue; }; ];