| ! --------------------------------------------------------------------------- | |
| ! Ralph: An interactive sniffing. | |
| ! | |
| ! This game is copyright (C) 1996-2004 Miron Schmidt: you are not allowed to | |
| ! distribute a game file compiled from this source code other than the | |
| ! "official" one which I compiled myself. However, you *are* allowed to | |
| ! distribute this source code, as long as | |
| ! - nothing in it is changed (excluding only the OS-dependent line | |
| ! termination characters) and | |
| ! - there is no fee of any kind involved in the distribution, other | |
| ! than implicit, unavoidable costs such as the postage needed for | |
| ! requesting a copy, or the Internet provision fees for | |
| ! downloading. The only exception here is archive media of | |
| ! non-commercial distribution channels, such as the Aminet CDs, or | |
| ! an official CD of the IF Archive, should there ever be one. | |
| ! Distribution by any other terms requires a permission. | |
| ! | |
| ! Feel free to contact me for comments, critique, discussion about adventure | |
| ! design and programming, or just a friendly chat. | |
| ! | |
| ! For further information (such as my email address) see the help menu -- in | |
| ! play or from the source code. | |
| ! | |
| ! --------------------------------------------------------------------------- | |
| ! Compilation hints: | |
| ! - For a normal compilation run, to compile a version identical to | |
| ! the one "officially" distributed (differing only in the serial | |
| ! number), nothing should have to be done. You just need DMenus.h, | |
| ! which should be available in the IF Archive at www.if-archive.org | |
| ! | |
| ! - If you are playing on a "dumb" terminal which doesn't provide a | |
| ! status line, you can uncomment the line reading "Constant NO_WINDOWS". | |
| ! Through that action, you change certain aspects of the game to go | |
| ! with such a terminal type: there will be no menus, and the | |
| ! starting quotation will just be printed, not relying on any fancy | |
| ! tricks of your interpreter. Everything else will work as | |
| ! expected, and no actual text will be missing. | |
| ! | |
| ! - The Glulx version does not work perfectly at this time. If you | |
| ! don't know the Glulx VM, just ignore this part. | |
| ! There are a couple of differences when compiled to the Glulx VM: | |
| ! Firstly, the game uses the standard Inform library, so the usual | |
| ! styles will be set. | |
| ! Secondly, for some reason Glulx Inform can't properly cope with | |
| ! new_lines at the beginning of a line. That's not my fault, though, | |
| ! and should be fixed in the Glulx Inform compiler (and I should | |
| ! have reported it to the maintainer instead of whining). With any | |
| ! luck, this will be fixed by the time you're trying to compile this. | |
| ! | |
| ! - Please keep in mind that you are not allowed to distribute Glulx | |
| ! or NO_WINDOWS game files. (See above.) Thank you. | |
| ! | |
| ! --------------------------------------------------------------------------- | |
| ! Credits index: | |
| ! - C.E. Forman solved a problem with bad PC handling (move player to x) in | |
| ! an early beta version. | |
| ! | |
| ! --------------------------------------------------------------------------- | |
| ! What beta testers wanted (and I deemed reasonable, but didn't implement): | |
| ! - Verb "shake" (Alfe) | |
| ! - "jump into bushes" (Alfe) | |
| ! - Make garden limits more obvious (Slarti) | |
| ! - "look behind tree" (PDD) | |
| ! - Verb "touch" (PDD) | |
| ! - Verb "feel" (PDD) | |
| ! - Objects "earth", "ground", "ruins" (PDD) | |
| ! - "hunt for fleas" (PDD) | |
| ! - "chase fleas" (PDD) | |
| ! - "prick up my ears" (PDD) | |
| ! - Verb "heel" (PDD) | |
| ! - "stretch paws" (PDD) | |
| ! - "throw ball west" (PDD) | |
| ! | |
| ! --------------------------------------------------------------------------- | |
| ! | |
| ! History: | |
| ! Release 1 - Release 7: See help menu. | |
| ! 19980708 (Release 8): Added a missing "end;" for the Inform 5 dummy code. | |
| ! Changed ChangePlayer(Ralph); to player=Ralph; in initialise() after a | |
| ! hint from Andrew Plotkin (is this documented anywhere?). Added more | |
| ! comments. Gave "holes in the ground" pluralname. Removed holes property | |
| ! from Ralph -- this should be solved by Andrew's hint above (anyway, the | |
| ! next library release 6/8 will have that bug fixed). Used modern syntax | |
| ! for read_char. | |
| ! 19980912: Changed my address. | |
| ! 19981204: Added my phone number, plus a comment about my email's | |
| ! validity. Changed "annoying child" to "annoying kid" (in | |
| ! Acknowledgements section) after re-reading Zarf's reviews. | |
| ! 19990204: Changed player=Ralph back to ChangePlayer(Ralph) again due to | |
| ! some weird bugs. Slightly rephrased a couple of minor sentences. | |
| ! Modernised assembler syntax for @read_char statements. Removed fake | |
| ! names from Near_Objects. | |
| ! 19990518: Temporarily gave Ralph the holes property again. | |
| ! 20000218 (Release 9): Added "Credits index" to source code before | |
| ! cleaning up my Ralph mail folder. Changed to a new "forever valid" | |
| ! email address. Erased stupid "Calyx" from header. Added XYZZY Awards | |
| ! to Trivia section of the help menu. Erased my real-life address (I | |
| ! still like the idea of getting a late night phone call from a fanatic | |
| ! player from, say, Nepal, but addresses unfortunately tend to change) | |
| ! and therefore erased the comment about my email address being valid | |
| ! forever again. | |
| ! 20000303: player=Ralph now works, due to added concealed attribute. | |
| ! 20000320: Two slight rephrasings. Removed some duplicated messages (which | |
| ! are now called in the appropriate place instead). Compressed copyright | |
| ! notice. | |
| ! 20000621: Mentioned changes since R7 in help menu. | |
| ! 20000622: Added NO_WINDOWS stuff (up to now, only affects the help menu, | |
| ! and one line at startup). Rephrased a sentence in the help menu. | |
| ! 20000710: Added Jim Davis to Acknowledgements section. My email address | |
| ! printed in a fixed font. Starting quotation printed with NO_WINDOWS in | |
| ! mind. Corrected @read_char assembler syntax to even more modern form. | |
| ! Changed some source code commentary. Removed extraneous spacing | |
| ! from help menu topics. | |
| ! 20001107: Slight rephrasings in source code and in help menu. | |
| ! 20001113: Menus.h only included #ifndef NO_WINDOWS. FTP URL printed in | |
| ! fixed font. Slight rephrasings in the help menu. | |
| ! 20001223: Minimal corrections. Minimal rephrasings in help menu. | |
| ! 20010102: Adapted to compile to Glulx (unfinished). | |
| ! 20010404: Corrected capitalisation of include files. Cleaned up | |
| ! source code header. | |
| ! 20010411: Finished Glulx stuff. Decided that NO_WINDOWS only makes | |
| ! sense on the Z-Machine (but no consistent checking is done yet). | |
| ! 20010514: Source code commentary. Some tiny rephrasings. Final | |
| ! work-over before this release goes to the IF Archive. Added | |
| ! section "Compilation hints" in source code (s.a.). | |
| ! 20020414: Didn't go to the IF Archive after all. Changed URL of the IF | |
| ! Archive. | |
| ! 20030206: Source code commentary. Changed email address again. (So much | |
| ! for the infinite validity.) Rephrased the "About the author" section of | |
| ! the help menu. | |
| ! 20040309: Adapted for DMenus, to be compatible with Glulx. Minor source | |
| ! code cosmetic changes. Inform 6.30, Library 6/11 needed. Amended | |
| ! credits. Worked out new abbreviations. | |
| ! --------------------------------------------------------------------------- | |
| ! Project 010. | |
| Release 9; | |
| Message "^RALPH: An Interactive Sniffing by Miron Schmidt.^"; | |
| ! Check for Inform 6 being used. (Untested.) | |
| #ifndef VN_1601; | |
| [main; print "You have been using an outdated version of Inform to \ | |
| compile the source code to this game. Please upgrade to Inform 6 for \ | |
| proper error handling." ]; | |
| end; | |
| #endif; | |
| ! Check for suitable Inform version being used. | |
| #ifndef VN_1630; | |
| Message fatalerror "This source code needs Inform 6.30 or later to | |
| compile."; | |
| #endif; | |
| ! Abbreviations worked out by Inform for release 9. | |
| Abbreviate ". " ", " "Christopher Robin" " the " "You" "The" "thing" "you" | |
| "sheet of glass-fibre" "ing" " th" " an" " to" "ere" "That" " wa" | |
| " can't" " clos" " ho" " of" " no" " garden" "~ he s" "**]" " is" " lo" | |
| " from" " do" " for" " ma" " already" " bu" "Inform" "ight" "^ Releas" | |
| " wh" " ba" " tr" " with" " ha" " com" " la" " on" " it" " mo" " pla" | |
| "n't " "ther" "at " "his " "hole" "and" "^ " "he " "'s " "some" "lock" | |
| "ate" "one" "on " "can " "'re" "He " "sed"; | |
| ! Constant NO_WINDOWS; ! Uncomment to slightly change certain | |
| ! aspects of the game's behaviour so that it may be played on | |
| ! non-status line PDA's etc. It's not necessary to uncomment this | |
| ! if you are compiling to the GLULX VM, in which case the interpreter | |
| ! decides how things should look. | |
| Constant Story "RALPH"; | |
| Constant Headline "^An Interactive Sniffing.^ | |
| Copyright (C) 1996-2004 Miron Schmidt.^ | |
| Project 010 / "; | |
| Constant MAX_SCORE 30; ! Maximum score to achieve. | |
| Constant TASKS_PROVIDED; ! Tasks are provided. | |
| Constant NUMBER_TASKS 3; ! Number of tasks to perform. | |
| Global BarkCount; | |
| Array task_scores -> 10 10 10; ! Scores for the individual tasks. | |
| Message "Including Parser."; | |
| Include "Parser"; | |
| Attribute seen; ! Only for Christopher's description really. | |
| ! More messages are defined in the Ralph object. I tried to be somewhat OO. | |
| Message "Library Messages."; | |
| Object LibraryMessages "LibMsg" | |
| with | |
| before [; | |
| Attack: "Your teeth can't find a lethal grip, and your weak paws | |
| don't do any damage."; | |
| Drink: "There's nothing to drink here."; | |
| Eat: "That's plainly inedible, even for you."; | |
| Jump: "You do your famous jump. So there."; | |
| JumpOver: "No time to play now."; | |
| Listen: "You stand still, listening concentratedly, but there's | |
| nothing unexpected."; | |
| Mild: "It's a dog's life."; | |
| Pray: "The Great goD doesn't answer."; | |
| Sing: "Better wait for the full moon."; | |
| Sleep: "Now that you have a goal, you're wide awake."; | |
| Smell: "You snuffle for a few seconds, but nothing gives you any clue."; | |
| Sorry: "So ", (u_style) "now", " you feel sorry!"; | |
| Strong: "That's the spirit! Now go on."; | |
| Take: if (lm_n==12) "You can't carry more than one thing at a time."; | |
| Taste: "The taste is not unlike the scent."; | |
| ]; | |
| Message "Including Verblib."; | |
| Replace DigSub; ! Redefined below. | |
| Include "VerbLib"; | |
| #ifdef TARGET_GLULX; | |
| Include "infglk"; | |
| #endif; | |
| #ifdef NO_WINDOWS; | |
| Class Menu; ! Needed for the help menu items. | |
| #ifnot; | |
| Message "Including DMenus."; | |
| Include "DMenus"; | |
| #endif; | |
| ! --------------------------------------------------------------------------- | |
| ! Class definitions. | |
| ! --------------------------------------------------------------------------- | |
| Message "Class definitions."; | |
| Class Room | |
| with holes | |
| has light; | |
| Class Near_Object | |
| with | |
| before [; | |
| default: "That's just one step further away: you could try to go | |
| there."; | |
| ], | |
| has scenery; | |
| ! --------------------------------------------------------------------------- | |
| ! Objects. | |
| ! --------------------------------------------------------------------------- | |
| Message "Room: Your Hut (with sub objects)."; | |
| Room Your_Hut "Your Hut" | |
| with | |
| description "A thin beam of sunlight illuminates this shabby hut just | |
| enough to see what a mess it really is. Wood planks wildly nailed | |
| together, frozen drops of tar on the roof serve to show what dogs | |
| are worth to their masters nowadays.^ | |
| A somewhat rectangular hole in the eastern wall leads outward.", | |
| before [; Jump: "You bump against the roof."; ], | |
| e_to Lawn, out_to Lawn; | |
| Object -> beam "beam of sunlight" | |
| with | |
| name 'beam' 'of' 'sunlight' 'sun' 'light' 'sunbeam', | |
| description "The early sun has a slightly orange tint but, oddly, no | |
| smell at all.", | |
| before [; | |
| Attack, Close, Kiss, Open, Pull, Push, PushDir, Turn: "Of course."; | |
| Enter: "You step into the beam of sunlight, but nothing happens."; | |
| Listen: "It makes no sound."; | |
| LookUnder: "No matter what you try, it is impossible to look under the | |
| beam of sunlight."; | |
| Smell, Taste: <<Examine self>>; | |
| ], | |
| has scenery; | |
| Object -> hut_hole "rectangular hole" | |
| with | |
| name 'somewhat' 'rectangular' 'hole' 'in' 'eastern' 'wall' 'east' 'e//', | |
| description "It leads outside.", | |
| before [; | |
| Enter: <<Go e_obj>>; | |
| LookUnder: "You find the floor under the hole."; | |
| ], | |
| has scenery; | |
| Object -> teddy "Blamant the Teddy" | |
| with | |
| name 'blamant' 'teddy' 'bear' 'toy' 'teddybear' 'friend', | |
| initial "Your good old friend Blamant the Teddy is here.", | |
| description "He's a fluffy Teddy bear that seems to be nearly | |
| indestructible, given all the effort you put into breaking him | |
| already.", | |
| before [; | |
| Pull, Open, Attack: "You've tried that often enough: it never worked | |
| out."; | |
| Kiss, Push: "His black button eyes seem to sparkle thankfully."; | |
| Listen: "Nothing."; | |
| Smell: "He reeks of old wet fabric fur."; | |
| Pee: "When you did that to Benny the Fluff Duck, it started to rot | |
| away. You want to spare Blamant this destiny."; | |
| ], | |
| has proper; | |
| Object hut_parts "hut" | |
| with | |
| name 'my' 'hut' 'nailed' 'wood' 'planks' 'woodplanks' 'frozen' 'drops' | |
| 'of' 'tar' 'roof' 'your' 'plank' 'woodplank', | |
| description "This hut is a terrible mess.", | |
| found_in Your_Hut Lawn, | |
| before [; | |
| Enter: | |
| if (location==Your_Hut) "You're already in it!"; | |
| <<Go w_obj>>; | |
| LookUnder: if (location==Your_Hut) "Difficult."; | |
| ], | |
| has scenery; | |
| ! --------------------------------------------------------------------------- | |
| Message "Room: Lawn (with sub objects)."; | |
| Room Lawn "Lawn" | |
| with | |
| description "The lawn stretches southward and northward here. To the | |
| northwest is the fence of the herb garden, east is the house, and west | |
| is your hut. The way northeast is blocked by dense bushes.^ | |
| In the beginning, the humans used to trim the lawn to a neat | |
| appearance, but eventually, seeing what you did to their efforts, they | |
| gave it up.", | |
| e_to Front_Of_House, se_to Ruined_Shed, s_to Lawn2, w_to Your_Hut, | |
| nw_to "The fence is too high.", n_to Tree, | |
| ne_to "You can't seem to wriggle through the dense bushes."; | |
| Near_Object -> "house" with name 'house'; | |
| ! Christopher Robin's number property has the following values (sequentially): | |
| ! 0 - knows nothing | |
| ! 1 - has thrown the ball, is waiting | |
| ! 2 - has walked to the tree, has got the ball now | |
| ! 3 - has walked to the tree, hasn't got the ball | |
| ! 4 - has walked back to the lawn with the ball, is waiting for Ralph | |
| ! 5 - has opened the fence gate | |
| ! 6 - has walked into the garden | |
| ! 7 - has walked back to the tree (from the garden) | |
| ! 8 - has walked back to the lawn, doesn't want to play again | |
| Object -> Christopher_Robin "Christopher Robin" | |
| with | |
| name 'christopher' 'robin' 'boy' 'small' 'human' 'chris' 'robins' | |
| 'christophers' 'robin^s' 'chris^' 'chris^s' 'christopher^s' 'hand' | |
| 'hands' 'his' 'kid' 'child', | |
| describe [; | |
| if (self hasnt seen) { | |
| give self seen; | |
| "^A small human the others call Christopher Robin is slouching | |
| here in all his ungraceful wobbly mass."; | |
| } | |
| if (parent(self) ~= Lawn) "^Christopher Robin is here."; | |
| "^Christopher Robin is still slouching here."; | |
| ], | |
| description [; | |
| print "Christopher Robin is a very small human, about one third | |
| the size they come. You can remember a time when he was not much | |
| larger than you, but back then they wouldn't let you play with him.^"; | |
| if (ball in self) "He is carrying the squash ball."; | |
| rtrue; | |
| ], | |
| before [; | |
| Smell: "He smells as you would expect: clean and soapy beyond health."; | |
| Pee: "Your life would change in a very unpleasant manner."; | |
| Listen: "He hums an absolutely stupid melody, seeming to enjoy it."; | |
| Play: "He starts clapping his hands and grasping your paws but | |
| then quickly loses interest."; | |
| ], | |
| life [; | |
| Attack: | |
| deadflag=3; | |
| location=Tree; | |
| DrawStatusLine(); | |
| "You jump at the little human and sink your teeth into his soft | |
| flesh. As he starts screaming, the two bigger humans dash out of the | |
| house.^After a short struggle and a painful encounter with your own | |
| leash, you are chained to a tree."; | |
| Give: | |
| if (noun==ball) { | |
| switch (self.number) { | |
| 0 to 1: | |
| self.number=1; | |
| StartTimer (self,4); | |
| move ball to Tree; | |
| "The small human weighs the ball in his hands, takes aim, and | |
| throws it northward to the tree. He looks at you expectantly."; | |
| ! In case "4" the action won't happen. | |
| 2 to 3: | |
| self.number=2; | |
| StartTimer (self,1); | |
| move ball to Christopher_Robin; | |
| "He takes the ball. ~Come come,~ he laughs."; | |
| 5: | |
| self.number=7; | |
| StartTimer (self,1); | |
| move ball to Christopher_Robin; | |
| "He takes the ball. ~There,~ he blubbers."; | |
| 6: | |
| StartTimer(self,1); | |
| move ball to Christopher_Robin; | |
| "~The ball!~ cries Christopher Robin, picking it up."; | |
| 7 to 8: | |
| move ball to parent(self); | |
| "~Don't want play,~ muses Christopher Robin, dropping the ball | |
| to the ground."; | |
| } | |
| } | |
| move noun to parent(self); | |
| print_ret "He takes ", (the) noun, ", snickering with glee, then | |
| drops it to the ground."; | |
| Kiss: "~Hee-hee-hee,~ blubbers Christopher Robin."; | |
| WakeOther: "He's awake alright."; | |
| Show: | |
| if (noun==ball) { | |
| print "Christopher Robin takes the ball from you.^"; | |
| <<Give noun self>>; | |
| } | |
| "~Doggie doggie dog doggie, nice doggie dog.~"; | |
| Ask, Tell, Answer: "He won't understand you."; | |
| Order: "Christopher Robin giggles stupidly, then pats your head."; | |
| ], | |
| react_before [; | |
| Dig: | |
| if (location==Garden) | |
| "Christopher Robin pushes you away. ~No dig here,~ he exclaims."; | |
| ], | |
| react_after [; | |
| Drop: | |
| if (noun==ball) { | |
| print "Christopher Robin picks up the ball.^"; | |
| move ball to player; | |
| <<Give ball Christopher_Robin>>; | |
| } | |
| Growl, Howl: "Christopher Robin makes a soothing gesture. ~Nice | |
| doggie.~"; | |
| ], | |
| each_turn [; | |
| if (ball in player) { | |
| switch (self.number) { | |
| ! in cases "0," "4," "7," "8" he shouldn't react | |
| 1: | |
| print "^Christopher Robin notices the ball and takes it from | |
| your mouth.^"; | |
| StopTimer(self); | |
| <<Give ball self>>; | |
| 2 to 3: | |
| self.number=2; | |
| StartTimer (self,1); | |
| move ball to Christopher_Robin; | |
| "^The small human takes the ball from you. ~Come come,~ he | |
| laughs."; | |
| 5: | |
| self.number=7; | |
| StartTimer (self,1); | |
| move ball to Christopher_Robin; | |
| "^The small human takes the ball from you. ~There,~ he blubbers."; | |
| 6: <<Give ball self>>; | |
| } | |
| } | |
| if (ball in parent(self) && self.number==6) { | |
| move ball to self; | |
| StartTimer(self,0); | |
| "^Suddenly, Christopher Robin notices the ball on the ground. | |
| ~Hee-hee, stupid,~ he giggles, picking it up."; | |
| } | |
| switch (self.number) { | |
| 0, 7 to 8: | |
| if (random(10) <4) { | |
| switch (random(4)) { | |
| 1: "^Christopher Robin glucks joyfully."; | |
| 2: "^Christopher Robin grins at you and claps his hands."; | |
| 3: "^Christopher Robin crawls a few paces, then settles down | |
| again."; | |
| 4: "^Christopher Robin chuckles about something unseen."; | |
| } | |
| } | |
| 1, 3, 5: | |
| if (random(10) <5) | |
| "^~Get ball doggie,~ says Christopher Robin."; | |
| 2: | |
| if (random(10) <3) "~Come come,~ Christopher Robin chuckles."; | |
| 4: ! Timer is started in Give action. | |
| self.number=1; | |
| print "^As soon as he notices you, Christopher Robin picks up the | |
| ball. "; | |
| move ball to player; | |
| <<Give ball self>>; | |
| 6: | |
| if (ball notin self) | |
| if (random(10) <5) | |
| "^Christopher Robin walks some steps within the plants, still | |
| searching."; | |
| } | |
| ], | |
| number 0, | |
| time_left 0, | |
| time_out [; | |
| switch (self.number) { | |
| ! Cases "0", "4" and "8" are not applicable for the time_out property. | |
| 1: | |
| move self to Tree; | |
| self.number=3; | |
| StartTimer(self,2); | |
| if (ball in Tree) { | |
| move ball to self; | |
| self.number=2; | |
| } | |
| if (player in Lawn) | |
| "^Christopher Robin raises to his feet and hobbles northward."; | |
| if (player in Tree) { | |
| if (ball in player) { | |
| move ball to self; | |
| self.number=2; | |
| "^Christopher Robin hobbles in from the south. He starts looking | |
| around for a few seconds, all the while smiling brightly, then | |
| catches sight of the ball and takes it from you. He pats you | |
| clumsily on the head, mumbling ~Good dog doggie got ball.~"; | |
| } | |
| if (ball in self) | |
| "^Christopher Robin hobbles in from the south. He starts looking | |
| around for a few seconds, all the while smiling brightly, then | |
| catches sight of the ball and takes it."; | |
| "^Christopher Robin hobbles in from the south. He starts looking | |
| around, mumbling ~Where's ball doggie?~"; | |
| } | |
| 2, 7: | |
| move self to Lawn; | |
| move ball to Lawn; | |
| if (self.number==2) | |
| self.number=4; | |
| else ! self.number==7 | |
| self.number=8; | |
| if (player in Lawn) | |
| "^Christopher Robin hobbles in from the north, drops the ball and | |
| settles down."; | |
| if (player in Tree) | |
| "^Christopher Robin hobbles southward."; | |
| 3: | |
| give gate open; | |
| self.number=5; | |
| StartTimer(self,2); | |
| if (player in Tree) | |
| "^Christopher Robin tries to peer through the fence, craning his | |
| head. He starts fiddling with the gate, then, finally, opens it."; | |
| 5: | |
| move self to Garden; | |
| self.number=6; | |
| if (ball in Garden) { | |
| move ball to self; | |
| StartTimer(self,1); | |
| } | |
| if (player in Tree) | |
| "^Christopher Robin hobbles through the gate."; | |
| if (player in Garden) { | |
| if (ball in self) | |
| "^Christopher Robin hobbles in through the gate. ~Ball!~ he | |
| screams delightedly, picking it up."; | |
| "^Christopher Robin hobbles in through the gate and starts looking | |
| for something."; | |
| } | |
| 6: | |
| StartTimer(self,1); | |
| move self to Tree; | |
| self.number=7; | |
| if (player in Tree) | |
| "^Christopher Robin hobbles in through the gate."; | |
| if (player in Garden) | |
| "^Christopher Robin hobbles through the gate."; | |
| } | |
| ], | |
| has proper animate transparent; | |
| Object -> fence "fence" | |
| with | |
| name 'high' 'fence' 'of' 'herb' 'garden' 'vegetable', | |
| description "The fence is about twice your own height. It has been | |
| erected only this winter, to finally stop you from digging holes.", | |
| found_in Lawn Tree Garden, | |
| before [; | |
| Enter: "There's no way you can overcome this fence."; | |
| JumpOver: "It's too high even for your capabilities."; | |
| Open: "If it were possible for you to open it, there'd be no point to | |
| the fence, don't you think?"; | |
| ThrowOver: | |
| if (second==glass_fibre) | |
| "The sheet of glass-fibre is too large to be thrown that high."; | |
| if (location==Garden) move second to Tree; | |
| else move second to Garden; | |
| print_ret "You throw ", (the) second, " over the fence."; | |
| ], | |
| has scenery; | |
| Object bushes "dense bushes" | |
| with | |
| name 'dense' 'bushes' 'bush' 'cypress' 'cypresses', | |
| article "some", | |
| description [; | |
| if (bushes has general) print "Indeed, cypresses"; | |
| else { | |
| give bushes general; | |
| print "Cypresses"; | |
| } | |
| if (cat in Limbo && cat hasnt general) | |
| print ". Through the branches, you can see a pair of glowing eyes"; | |
| "."; | |
| ], | |
| found_in Lawn Front_of_House Tree, | |
| before [; | |
| Enter: "You can't seem to wriggle through the dense bushes."; | |
| Smell, Taste: | |
| if (cat in Limbo && cat hasnt general) | |
| "A caustic sensation of fear from inside the bush shrouds | |
| everything else."; | |
| if (bushes has general) "Indeed, cypresses."; | |
| else { give bushes general; "Cypresses."; } | |
| Pee: | |
| if (cat in Limbo && cat hasnt general) | |
| "OK. Within the bushes, you perceive an uneasy shifting."; | |
| "OK."; | |
| ], | |
| has scenery; | |
| ! --------------------------------------------------------------------------- | |
| Message "Room: Front of House (with sub objects)."; | |
| Room Front_of_House "Front of House" | |
| with | |
| description "The entrance door has a smaller door inlet in the lower | |
| part, now nailed shut because the cat used to enter the house through | |
| it. Scratchmarks of a very young dog's paws decorate most of the door | |
| and the walls next to it.^ | |
| The lawn is west, southward are the remains of a shed, and the way | |
| north is blocked by dense bushes.", | |
| e_to "The door is closed.", s_to Ruined_Shed, sw_to Lawn2, w_to Lawn, | |
| nw_to Tree, n_to "You can't seem to wriggle through the dense bushes."; | |
| Near_Object -> "lawn" with name 'lawn' 'shed' 'remains' 'of' 'a//'; | |
| ! The entrance door's number property holds the number of scratches: | |
| ! 0 - Hasn't been scratched yet. | |
| ! 1, 2 - Carl has dropped his reading pipe. | |
| ! 3, 6 - Carl becomes indignated. | |
| ! 4, 5 - Carl has gotten his pipe back. | |
| Object -> entrance_door "entrance door" | |
| with | |
| name 'large' 'big' 'entrance' 'door' 'closed' 'knob', | |
| number 0, | |
| article "an", | |
| before [; | |
| Smell: "It's locked. (Just joking; you smell nothing unexpected.)"; | |
| Open: "Unfortunately, the door knob is round. No way."; | |
| Close: "But it's already closed!"; | |
| Enter: "But the door is closed!"; | |
| Pull, Push, Turn: "The door remains closed."; | |
| Kiss, Taste: "Wood splinters, old paint, smeared dust."; | |
| Pee: "Serves them right!"; | |
| Attack, Scratch: | |
| switch (self.number) { | |
| 0: | |
| self.number=1; | |
| move pipe to Front_of_house; | |
| "You scratch wildly at the door. You hear footsteps from | |
| inside. Soon, the door is opened. Carl, one of the bigger | |
| humans, looks down at you. ~And what would ", (u_style) "you", | |
| " want? Go play,~ he says, pushing you a few steps back. He | |
| closes the door again. But wait! He's dropped something!"; | |
| 1 to 2: | |
| if (pipe notin player && pipe notin Front_of_House) { | |
| print "You scratch at the door again. Almost instantly, Carl | |
| opens it, looking at you with a strange sort of disbelief. "; | |
| if (Garden.holes >0 && pipe notin Garden) { | |
| Achieved(2); | |
| location=Your_Hut; | |
| DrawStatusLine(); | |
| deadflag=2; | |
| "~What...~ he starts, then abruptly jerks his head up, staring | |
| wide-eyedly through the bushes. ~The garden,~ he screams, | |
| ~what have you done to my herb garden? How... what...~ He | |
| gives a start and scrambles toward the fence, and through | |
| the gate.^ | |
| ~Hetty,~ he shouts, ~the miserable wretch has buried my | |
| pipe!~ He digs into the ground and starts making a new hole.^ | |
| ^For a few seconds, you watch as lumps of earth are hurled | |
| into the air. Then, before your very eyes, a longish white | |
| shape sails up, slowly, twirling in the air, sprinkling | |
| dark drops around. You follow it with your eyes, then your | |
| head. It's -- the bone!^^ | |
| Hours later, you lie in front of your hut, gnawing happily, | |
| while distant voices curse the day you were born."; | |
| } | |
| if (Garden.holes >0 && pipe in Garden) { | |
| location=Your_Hut; | |
| DrawStatusLine(); | |
| deadflag=3; | |
| "~What...~ he starts, then abruptly jerks his head up, staring | |
| wide-eyedly through the bushes. ~The garden,~ he screams, | |
| ~what have you done to my herb garden? How... what...~ He | |
| gives a start and scrambles toward the fence, and through | |
| the gate.^ | |
| ~There's my pipe!~ he shouts, and ~I'll kill the beast!~ | |
| Finally, he stalks back from the garden, beads of sweat | |
| dripping from his red face.^ | |
| Your fate is most gruesome, and it seems like hours later | |
| that you awake shaking in your hut."; | |
| } | |
| self.number++; | |
| "~Scurry off,~ he snarls. Before slamming the door shut, he | |
| adds, ~I bet you know where my darn pipe is!~"; | |
| } ! Ralph has pipe or pipe is in Front_of_House | |
| move pipe to limbo; | |
| print "You scratch at the door again. Almost instantly, Carl opens | |
| it, only briefly looking at you. He hurriedly picks up the pipe | |
| and pats you on the head. ~Good"; | |
| if (Garden.holes >0) { | |
| location=Your_Hut; | |
| DrawStatusLine(); | |
| deadflag=3; | |
| "...~ he starts, suddenly jerking his head up. He stares through | |
| the bushes, his mouth working silently. ~What...~ he whispers, | |
| then, again, ~what,~ still absent-mindedly patting your | |
| head. All at once, he closes his hand around the back of your | |
| neck. ~The garden! You've ruined my herb garden!~ He screams | |
| in panic and drags you toward the fence.^ | |
| Thankfully, your mind blanks out at this point. Hours later, | |
| you cower in the backmost corner of your hut, your body | |
| throbbing painfully.^^ | |
| The bone is lost."; | |
| } | |
| self.number=4; | |
| " boy, good boy,~ he smiles. Grinning happily, he closes the door. | |
| You can't help feeling this was a bad mistake."; | |
| 3, 6: | |
| location=Limbo; ! because it's called "In the Cellar" | |
| DrawStatusLine(); | |
| deadflag=3; | |
| "Yet again, you scratch at the door. It opens, Carl | |
| glowering at you with open disgust. ~You? Again?~ he grates. He | |
| pulls you up by the fur of your neck. ~You - don't - scratch - | |
| at - this - door!~ Every word is accompanied by a painful | |
| shake.^ | |
| Chasing spiders in the dark cellar, you wonder if you'll ever | |
| find the bone again."; | |
| 4 to 5: | |
| self.number++; | |
| "You scratch at the door again. Carl opens it, arms folded in | |
| front of his chest. ~Go away,~ he barks, slamming it shut. A | |
| muffled ~And stop doing this to my door~ is added."; | |
| } | |
| ], | |
| has scenery; | |
| Object -> small_door "smaller door" | |
| with | |
| name 'small' 'smaller' 'door' 'inlet' 'nailed' 'nailed-shut', | |
| description "It used to be your entrance when you were little.", | |
| before [; | |
| Open, Pull, Push, Turn: "It's nailed shut!"; | |
| Close: "It's closed alright."; | |
| Attack, Scratch: <<Scratch entrance_door>>; | |
| ], | |
| has scenery; | |
| Object -> scratchmarks "scratchmarks" | |
| with | |
| name 'scratchmarks' 'scratch' 'marks', | |
| article "some", | |
| description "You faintly remember creating the marks and being unable to | |
| sit a short while later. Everything in between is clouded.", | |
| before [; | |
| Attack, Scratch: "That's stupid."; | |
| Smell: "A faint smell of wood."; | |
| ], | |
| has scenery; | |
| Object -> house_object "house front" | |
| with name 'front' 'of' 'house' 'wall' | |
| has scenery; | |
| ! --------------------------------------------------------------------------- | |
| Message "Room: Under a Tree (with sub objects)."; | |
| Room Tree "Under a Tree" | |
| with | |
| description "Here, the branches of a tall tree provide cool shade on | |
| sunny days and some basic protection from rain and snow on the | |
| less-than-sunny days.^ | |
| The lawn continues southward, while the ways east and west are | |
| blocked with dense bushes and a high, gated fence, respectively.^ | |
| Within the bushes, a tight hole seems to lead into a hollow.", | |
| e_to [; | |
| if (glass_fibre has general) | |
| "You crash against the sheet of glass-fibre. Fooled yourself, eh?"; | |
| if (cat in Limbo && cat hasnt general) | |
| "Even if you'd fit into the hole, it might be dangerous with the | |
| cat inside."; | |
| "The hole is too small for you to wriggle through."; | |
| ], | |
| se_to Front_of_House, s_to Lawn, w_to gate, | |
| u_to "Impossible. Dogs weren't made for climbing."; | |
| Near_Object -> "lawn" with name 'lawn'; | |
| Object -> bush_hole "hole in the bush" | |
| with | |
| name 'tight' 'hole' 'in' 'the' 'bush' 'bushes' 'hollow', | |
| description [; | |
| if (glass_fibre has general) | |
| "The hole is blocked with a sheet of glass-fibre. You can't see much | |
| beyond."; | |
| if (cat in Limbo && cat hasnt general) | |
| "Within the hollow, the cat cowers, quite frightened."; | |
| "You see nothing special about the hole in the bush."; | |
| ], | |
| before [; | |
| Smell, Taste: <<Smell bushes>>; | |
| Enter: <<Go e_obj>>; | |
| Open, Close: "You would have to regrow the whole bush to do that."; | |
| Block: | |
| if (second==glass_fibre) { | |
| give second general; | |
| move second to parent(self); | |
| "You neatly block the hole with the sheet of glass-fibre."; | |
| } | |
| print_ret (The) second, " is too small to cover the hole."; | |
| Receive: | |
| if (receive_action~=##PutOn) { | |
| if (noun==glass_fibre) | |
| "The sheet of glass-fibre is too large to fit into the hole."; | |
| print_ret (The) noun, " is too small to block the hole."; | |
| } | |
| ], | |
| has scenery; | |
| Object -> tree_object "tall tree" | |
| with | |
| name 'tall' 'tree' 'low' 'lowest' 'branch' 'branches' 'twig' 'twigs', | |
| description [; | |
| print "The tree looms high above you, even its lowest branches far | |
| out of your reach"; | |
| if (cat in limbo && cat has general) | |
| ". Within the tree top, the cat sulks with barely-hidden anguish."; | |
| "."; | |
| ], | |
| before [; | |
| Eat, Drink: "You seem to be getting delirious."; | |
| JumpOver: "You float through the air, getting closer and closer to the | |
| top. Then, just barely brushing the fine twigs, somersaulting, you | |
| manage to cross the tree, landing softly on the ground. (No, not | |
| really.)"; | |
| Listen: "The twigs rustle in the wind."; | |
| Smell: | |
| if (tree has general) "Freshly marked."; | |
| "Wait a second... this smells like a tree!"; | |
| Taste, Kiss: "Yecch!"; | |
| Pee: | |
| give tree general; | |
| "...Done. Any stray dogs will know now whose tree this is."; | |
| ], | |
| has scenery; | |
| Object -> gate "gate" | |
| with | |
| name 'gate', | |
| found_in Tree Garden, | |
| description "The gate, set tightly into the fence, has been here since | |
| winter, to prevent you from digging holes in the herb garden.", | |
| describe [; | |
| if (self has open) "^The gate is wide open."; | |
| rtrue; | |
| ], | |
| before [; | |
| Close, Open, Turn, Pull, Push: "It won't budge."; | |
| JumpOver: "It's just a few inches too high."; | |
| ThrowOver: <<ThrowOver fence second>>; | |
| ], | |
| door_to [; | |
| if (location==Tree) return Garden; | |
| return Tree; | |
| ], | |
| door_dir [; | |
| if (location==Tree) return w_to; | |
| return e_to; | |
| ], | |
| has static door; | |
| Object -> ball2 "squash ball" | |
| with | |
| name 'orange' 'squash' 'ball', | |
| initial "An orange squash ball is lodged between the branches.", | |
| description "When they feel like it, the humans sometimes throw it away | |
| and expect you to bring it back.", | |
| before [; | |
| Examine, Listen, Scratch, Wag: ; | |
| default: "You can't reach the squash ball from here."; | |
| ]; | |
| Object ball "squash ball" | |
| with | |
| name 'orange' 'squash' 'ball', | |
| description "When they feel like it, the humans sometimes throw it away | |
| and expect you to bring it back.", | |
| before [; | |
| Take: | |
| if (self in Christopher_Robin) | |
| "Giggling, Christopher Robin holds onto the ball a little tighter."; | |
| ]; | |
| ! --------------------------------------------------------------------------- | |
| Message "Room: Lawn [2] (with sub objects)."; | |
| Room Lawn2 "Lawn" | |
| with | |
| description [; | |
| print "The southern part of the lawn looks much like the northern part"; | |
| if ((Lawn.holes~=0 && Lawn2.holes==0) || | |
| (Lawn.holes==0 && Lawn2.holes~=0)) { print ", despite the holes"; } | |
| ". Apart from the latter, you could visit an ancient shed to the east, | |
| or stroll along the house to the northeast."; | |
| ], | |
| e_to Ruined_Shed, n_to Lawn, ne_to Front_Of_House; | |
| Near_Object -> "shed" with name 'ancient' 'shed' 'house'; | |
| Object -> cat "cat" | |
| with | |
| name 'neighbor^s' 'neighbors' 'neighbour^s' 'neighbours' 'red' 'and' | |
| 'white' 'red-and-white' 'cat' 'annoying' 'tail' 'cat^s' 'cats', | |
| description "Red-and-white, the usual sly look on his face.", | |
| initial "The neighbour's annoying cat is here.", | |
| before [; | |
| Examine, LookUnder, Scratch, Wag: ; | |
| Listen, Smell: "He doesn't make any extraordinary noises, but the smell | |
| of fear is imminent, even from the distance."; | |
| default: | |
| if (location==Lawn2) { | |
| move self to Lawn; | |
| "As soon as you approach him, the cat flees to the northern part | |
| of the lawn."; | |
| } | |
| if (location==Lawn) { | |
| move self to Tree; | |
| "As soon as you approach him, the cat flees northward to the tree."; | |
| } | |
| move self to Limbo; ! He must be at the tree now. | |
| move cat2 to Tree; | |
| if (glass_fibre hasnt general) { | |
| StartTimer(cat,random(3)+3); | |
| "As soon as you approach him, the cat crawls hurriedly through the | |
| hole into the bush."; | |
| } | |
| give self general; | |
| move ball2 to limbo; move ball to Tree; | |
| Achieved(0); | |
| "As soon as you approach him, the cat tries to crawl into the bush, | |
| but is held back by the blocking sheet of glass-fibre. Savagely | |
| panicking, he jumps at the tree and climbs the whole length of | |
| its stump within seconds.^ | |
| The squash ball quivers with the branches, then falls to the | |
| ground."; | |
| ], | |
| react_before [; | |
| Growl: | |
| print "You step toward the cat, producing a fierce noise.^"; | |
| <<Attack self>>; | |
| Wag: "Apparently, the cat doesn't know what to make of your furious | |
| wagging."; | |
| ], | |
| react_after [; | |
| Bark: | |
| print "You step toward the cat, producing a fierce noise.^"; | |
| <<Attack self>>; | |
| Howl: "The cat looks at you, slightly puzzled."; | |
| ], | |
| time_left 0, | |
| time_out [; | |
| move self to Tree; | |
| move cat2 to Limbo; | |
| if (player in Tree) { | |
| if (glass_fibre has general) { | |
| give glass_fibre ~general; | |
| "Something thumps against the sheet of glass-fibre. As is topples | |
| over, the cat emerges from the bush and stretches his legs."; | |
| } | |
| "^The cat crawls back from the bush, stretching his stiffened | |
| muscles."; | |
| } | |
| give glass_fibre ~general; | |
| ], | |
| each_turn [; | |
| if (random(10) <5) | |
| print_ret (string) random( | |
| "^With bulging eyes, the cat glances in your direction.", | |
| "^The cat looks nervously around.", | |
| "^The cat shifts his legs.", | |
| "^The cat's red tail thumps lightly on the ground." | |
| ); | |
| ], | |
| has animate; | |
| Object cat2 "hidden cat" | |
| with | |
| name 'neighbor^s' 'neighbors' 'neighbour^s' 'neighbors' 'red' 'and' | |
| 'white' 'red-and-white' 'cat' 'annoying' 'eyes' 'tail' 'cat^s' 'cats' | |
| 'hidden', | |
| description "You can't make out any details within the green.", | |
| before [; | |
| Examine, LookUnder, Scratch, Wag: ; | |
| Listen: "He tries hard not to make any noise."; | |
| default: "The cat is well out of reach."; | |
| ], | |
| has scenery; | |
| ! --------------------------------------------------------------------------- | |
| Message "Room: Ruined Shed (with sub objects)."; | |
| Room Ruined_Shed "Ruined Shed" | |
| with | |
| description "You are standing amidst what was once a tool shed. Now, | |
| however, everything has fallen apart. The lawn is west and northwest, | |
| and the house front lies to the north.", | |
| w_to Lawn2, nw_to Lawn, n_to Front_Of_House, | |
| ne_to "The house is in the way."; | |
| Near_Object -> "lawn" with name 'lawn' 'house' 'front'; | |
| Object -> glass_fibre "sheet of glass-fibre" | |
| with | |
| name 'sheet' 'of' 'glass' 'fibre' 'glass-fibre' 'leftover' 'roof' | |
| 'piece' 'fiber' 'glass-fiber', | |
| description "It seems to be a leftover roof piece.", | |
| describe [; | |
| if (self has general) | |
| "^A sheet of glass-fibre is leaning against the hole."; | |
| "^You can see a sheet of glass-fibre here."; | |
| ], | |
| before [; | |
| Attack: "It would be fun, but less than wise."; | |
| Insert: | |
| if (second==bush_hole) "The sheet of glass-fibre is too large to | |
| fit into the hole."; | |
| PushDir: AllowPushDir(); rtrue; | |
| ], | |
| after [; | |
| Take: | |
| give self ~general; | |
| "It's hard to get a good grip, but finally you manage it."; | |
| ]; | |
| ! --------------------------------------------------------------------------- | |
| Message "Room: Herb Garden (with sub objects)."; | |
| Room Garden "Herb Garden" | |
| with | |
| description [; | |
| Achieved(1); | |
| "The garden. Rows of neatly tended plants rest in perfectly geometrical | |
| beds, built from the humans' sweat and blood over a period of years."; | |
| ], | |
| e_to gate, cant_go "The only sensible exit is east through the gate."; | |
| Object -> plants "rows of plants" | |
| with | |
| name 'rows' 'row' 'of' 'plants' 'plant' 'neat' 'neatly' 'tended' | |
| 'garden' 'vegetable' 'vegetables' 'herb' 'herbs', | |
| description "To you, all these things look alike.", | |
| article "some", | |
| before [; | |
| Attack: "They taste terrible, so you give up soon."; | |
| Eat, Smell, Taste: "Absolutely horrible. Plants."; | |
| Kiss: "No princess."; | |
| Pull, Take: "Better not. The humans did some unnerving things to you | |
| the last time you tried that."; | |
| ], | |
| has scenery; | |
| Object -> beds "plant beds" | |
| with | |
| name 'plant' 'beds' 'bed' 'of' 'perfectly' 'geometrical', | |
| article "some", | |
| before [; | |
| Smell: "An earthy smell, not unlike a freshly dug hole."; | |
| ], | |
| has scenery; | |
| ! --------------------------------------------------------------------------- | |
| Message "Room: Limbo."; | |
| Object Limbo "In the Cellar"; ! Storage space for unused objects | |
| ! Player is moved here in one of the bad endings. | |
| Message "Objects that are not initially available."; | |
| Object -> pipe "long-stemmed reading pipe" | |
| with | |
| name 'long' 'stemmed' 'stem' 'head' 'reading' 'pipe' 'long-stemmed' | |
| 'something' 'thing', | |
| description "You've seen this thing in action. It's oddly fascinating, | |
| but disgusting all the same.", | |
| before [; | |
| Attack: "Just as you want to crack it apart, you have a horrid vision | |
| of the pale-faced humans, mumbling, ~The dog, kill the dog.~ You | |
| wisely decide to leave it intact."; | |
| Eat, Smell, Kiss, Taste: "Blecch!"; | |
| Listen: "There's no sign of life about it."; | |
| Pee: "You are smarter than that."; | |
| ]; | |
| Object ground_hole "hole in the ground" | |
| with | |
| name 'hole' 'in' 'the' 'ground' 'floor', | |
| found_in [; if (location.holes==1) rtrue; ], | |
| before [; | |
| Close: "Too late for that."; | |
| Open: "It's already ~open,~ so to say."; | |
| Receive: "That's how you lost the bone; you don't want to repeat that | |
| mistake."; | |
| Enter: "Either it's too small, or you're too big: your decision."; | |
| JumpOver: "You actually manage to jump over the hole."; | |
| LookUnder: "That won't work. Maybe if you dig further..?"; | |
| Smell, Taste: "You love it. There's nothing like fresh earth."; | |
| Pee: "OK."; | |
| ], | |
| has scenery; | |
| Object ground_holes "any of the holes in the ground" | |
| with | |
| name 'holes' 'hole' 'in' 'the' 'ground' 'floor', | |
| found_in [; if (location.holes >1) rtrue; ], | |
| before [; | |
| Close: "Too late for that."; | |
| Open: "They're already ~open,~ so to say."; | |
| Receive: "That's how you lost the bone; you don't want to repeat that | |
| mistake."; | |
| Enter: "Either they're all too small, or you're too big: your | |
| decision."; | |
| JumpOver: "You actually manage to jump over a hole."; | |
| LookUnder: "That won't work. Maybe if you dig further..?"; | |
| Smell, Taste: "You love it. There's nothing like fresh earth."; | |
| Pee: "OK."; | |
| ], | |
| has proper scenery pluralname; | |
| Object Ralph "Ralph" | |
| with | |
| name 'ralph' 'dog' 'doggie', | |
| number, | |
| description "Nose wet: check. Fur clean: check. Tail up: check. Sexy.", | |
| capacity 1, | |
| add_to_scope body_parts, | |
| before [; | |
| Scratch: <<Scratch body_parts>>; | |
| Wag: <<Wag body_parts>>; | |
| Take: "You could hurt yourself in the attempt!"; | |
| ], | |
| orders [; | |
| if (actor~=self) rfalse; | |
| Ask, Answer, Tell: "Dogs don't talk!"; | |
| Blow: "Have you ever tried to purse your lips? See what I mean?"; | |
| Burn: "You're afraid of fire. It's genetical."; | |
| Climb: "There is exactly one reason why you're envious of cats: you | |
| can't climb."; | |
| Cut: "You don't have the means to do so."; | |
| Think: "Rather not."; | |
| ThrowAt: "Your aim isn't good enough."; | |
| Buy, Consult, Disrobe, Fill, Lock, Set, SetTo, Squeeze, Swing, | |
| SwitchOff, SwitchOn, Tie, Unlock, Wave, WaveHands, Wear: "That is an | |
| action far too complicated for you."; | |
| Touch: "Since you have no hands, that is not one of your options."; | |
| ], | |
| has proper animate concealed; | |
| Object body_parts "your body parts" | |
| with | |
| name 'tail' 'fur' 'leg' 'legs' 'paw' 'paws' 'tooth' 'teeth' 'tongue' | |
| 'nose' 'snout' 'skin' 'my' 'your' 'ralph^s' 'ralphs' 'body' 'parts' | |
| 'ear' 'ears' 'eye' 'eyes', | |
| before [; | |
| Scratch: "You vigorously scratch yourself."; | |
| Wag: "You happily wag your tail."; | |
| Take, Drop: "Your body parts are securely attached to yourself."; | |
| ], | |
| has proper; | |
| ! --------------------------------------------------------------------------- | |
| ! General routines. | |
| ! --------------------------------------------------------------------------- | |
| Message "General routines."; | |
| [ Initialise i; | |
| #ifdef NO_WINDOWS; | |
| print (f_style) | |
| "^^ ~The Word 'dignity' is not | |
| ^ in a dog's vocabulary.~ | |
| ^^ -- Garfield"; | |
| #ifnot; | |
| print "^^^^^^^^^^[Press any key to start.]^"; | |
| box | |
| "~The word 'dignity' is not" | |
| "in a dog's vocabulary.~" | |
| "" | |
| " -- Garfield"; | |
| #ifdef TARGET_ZCODE; | |
| @read_char 1 -> i; ! i is discarded afterwards but needs to be given. | |
| #ifnot; ! Glulx | |
| KeyCharPrimitive(); | |
| #endif; | |
| #endif; ! NO_WINDOWS | |
| player = Ralph; | |
| location = Your_Hut; | |
| print "^^^Dozing lazily in the morning sun in your little hut, something | |
| suddenly makes your ears go stiff. You scan the air, trying to figure | |
| out what it was. You stretch your paws, reluctantly wag your tail, and | |
| get up.^ | |
| Vigorously shaking the dust off of your fur, you have a sudden insight: | |
| the perfect shape of a bone forms in your mind. Yeah, that's it! | |
| Somewhere, somehow, there must still be a bone left from last fall. If | |
| only you could remember where it was...^^ | |
| (Read the help menu. Read the help menu. Read the help menu.)^^"; | |
| #ifdef NO_WINDOWS; | |
| print (b_style) "Special version for dumb terminals and limited | |
| interpreters.^^"; | |
| #endif; | |
| ]; | |
| [ ChooseObjects obj code; | |
| if (code<2) { | |
| if (obj has scenery || obj has door) return 2; | |
| rfalse; | |
| } | |
| if (obj==bush_hole or ground_hole) return 1; | |
| return 2; | |
| ]; | |
| [ DeathMessage; print "Your quest has found a sudden end."; ]; | |
| [ LookRoutine; | |
| if (location.holes==1) "^Someone has dug a hole here."; | |
| if (location.holes>1) { | |
| "^Someone has dug ", (EnglishNumber) location.holes, " holes here."; | |
| } | |
| ]; | |
| [ PrintRank; | |
| print ", which makes you "; | |
| switch (score) { | |
| 0 to 9: "-- Ralph, at your service."; | |
| 10 to 19: "a smart dog."; | |
| 20 to 29: "a tricky dog."; | |
| default: "a real lad of a dog."; | |
| } | |
| ]; | |
| [ PrintTaskName task_num; | |
| switch (task_num) { | |
| 0: "barking up the right tree"; | |
| 1: "confusing a small human"; | |
| 2: "tricking a large human"; | |
| } | |
| ]; | |
| ! --------------------------------------------------------------------------- | |
| ! Printing rules | |
| ! --------------------------------------------------------------------------- | |
| [ b_style text; style bold; print (string) text; style roman; ]; | |
| [ u_style text; style underline; print (string) text; style roman; ]; | |
| [ f_style text; style fixed; print (string) text; style roman; ]; | |
| #ifdef NO_WINDOWS; | |
| [ b_name obj; style bold; print (name) obj; style roman; ]; | |
| #endif; | |
| ! --------------------------------------------------------------------------- | |
| ! Verbs | |
| ! --------------------------------------------------------------------------- | |
| Message "Verb routines."; | |
| [ Anything w; while (w~=-1) w=NextWordStopped(); return 0; ]; | |
| [ CantDoSub; "That's not a verb I recognise."; ]; | |
| [ BarkSub o; | |
| if (location~=Your_Hut) BarkCount++; ! You're allowed to bark there. | |
| if (children(Ralph) >0) { ! Can be one object at most | |
| o=child(Ralph); | |
| print "(Causing ", (the) o, " to fall down.)^"; | |
| keep_silent=1; ! No "dropped" message | |
| <drop o>; | |
| keep_silent=0; | |
| } | |
| if (AfterRoutines()==1) rtrue; | |
| print "Ruff! Ruff!^"; | |
| if (BarkCount >9) { | |
| print "A strained voice from inside "; | |
| if (location==Front_of_House) print "shouts ~Stop that noise!~^"; | |
| else print "the house shouts something.^"; | |
| } | |
| if (BarkCount >13) { | |
| location=Your_Hut; | |
| DrawStatusLine(); | |
| deadflag=3; | |
| "Shortly thereafter, one of the humans approaches you, his face | |
| distorted with anger. ~Didn't I tell you? I told you!~ he snarls.^ | |
| You spend the rest of the day in your hut, its exit barred from | |
| outside."; | |
| } | |
| ]; | |
| [ BlockSub; print_ret "You can't sensibly block ", (the) noun, "."; ]; | |
| [ DiagnoseSub; | |
| "You feel great, somehow as if you'd just been taught new tricks."; | |
| ]; | |
| [ GrowlSub; | |
| print "You emit a low, dangerous growl.^"; | |
| if (AfterRoutines()==1) rtrue; | |
| ]; | |
| [ HowlSub; | |
| print "You howl in deep sorrow.^"; | |
| if (AfterRoutines()==1) rtrue; | |
| ]; | |
| [ MeowSub; "You'd never!"; ]; | |
| [ DigSub; | |
| if (location == Your_Hut) "You shouldn't dig here."; | |
| if (location.holes >0 && location.holes <4) { | |
| location.holes++; | |
| move ground_holes to parent(player); | |
| move ground_hole to limbo; | |
| "You dig another hole."; | |
| } | |
| if (location.holes >3 && location.holes <7) { | |
| location.holes++; | |
| "It's hard to find ground, but you manage to dig yet another hole."; | |
| } | |
| if (location.holes >6) { | |
| "The whole area is hardly recognizable already. That should be enough."; | |
| } | |
| location.holes = 1; | |
| move ground_hole to parent(player); | |
| "You burrow your paws into the ground and start digging a neat hole. What | |
| a pleasant surprise it will be for the humans when they see it!"; | |
| ]; | |
| [ MyKissSub; | |
| print_ret "You slobber on ", (the) noun, ", but nothing further happens."; | |
| ]; | |
| [ PeeSub; | |
| "After all, this ", (u_style) "is", " your property. You don't need to."; | |
| ]; | |
| [ PlaySub; | |
| "You play for a few seconds, but then remember the bone again."; | |
| ]; | |
| [ ScratchSub; | |
| if (noun~=0) "You can't scratch that."; | |
| <<Scratch Ralph>>; | |
| ]; | |
| [ SitSub; "Rest later, now find bone!"; ]; | |
| [ SlobberSub; "You slobber mindlessly.^"; ]; | |
| [ ThrowOverSub; "That wouldn't be helpful."; ]; | |
| [ WagSub; | |
| if (noun~=0) "I don't understand that."; | |
| <<Wag Ralph>>; | |
| ]; | |
| [ XyzzySub; | |
| print "Are you Eileen Mullin or anybody else connected to XYZZYnews | |
| magazine? "; | |
| if (YesOrNo()~=0) "^See? See? It's recognised."; | |
| "^That's not a verb I recognise."; | |
| ]; | |
| [ ZorkSub; "Don't you zork me, pal!"; ]; | |
| Message "Including Grammar."; | |
| Include "Grammar"; | |
| Message "Further grammar definitions and extensions."; | |
| Extend 'rub' replace | |
| * Anything -> CantDo; | |
| Extend 'dig' replace | |
| * -> Dig | |
| * Anything -> Dig; | |
| Extend 'put' last | |
| * held 'before'/'against' noun -> Block reverse | |
| * held 'in' 'front' 'of' noun -> Block reverse | |
| * held 'over' noun -> ThrowOver reverse; | |
| Extend 'drop' last | |
| * held 'before'/'against' noun -> Block reverse | |
| * held 'in' 'front' 'of' noun -> Block reverse | |
| * held 'over' noun -> ThrowOver reverse; | |
| Extend 'kiss' | |
| * noun -> MyKiss; | |
| Extend only 'sit' 'lie' replace | |
| * 'on'/'onto' noun -> Sit; | |
| Extend only 'cover' last | |
| * noun 'with' noun -> Block; | |
| Extend 'smell' last | |
| * 'at' noun -> Smell; | |
| Verb 'wag' | |
| * -> Wag | |
| * noun -> Wag; | |
| Verb 'pee' 'piss' 'urinate' 'piddle' 'mark' | |
| * -> Pee | |
| * noun -> Pee | |
| * 'at'/'on'/'onto'/'in'/'into' noun -> Pee; | |
| Verb 'bark' 'wuff' 'ruff' 'yell' | |
| * -> Bark; | |
| Verb 'growl' | |
| * -> Growl; | |
| Verb 'scratch' | |
| * -> Scratch | |
| * noun -> Scratch | |
| * 'at' noun -> Scratch; | |
| Verb 'play' | |
| * -> Play | |
| * noun -> Play | |
| * 'with' noun -> Play; | |
| Verb 'block' 'jam' 'bar' | |
| * noun 'with' noun -> Block; | |
| Verb 'lean' | |
| * noun 'on'/'onto'/'against'/'at' noun -> Block reverse; | |
| Verb 'yowl' 'feep' 'fweep' 'weep' 'howl' 'cry' | |
| * -> Howl; | |
| Verb 'xyzzy' 'plugh' 'plover' | |
| * -> Xyzzy; | |
| Verb 'zork' | |
| * -> Zork; | |
| Verb 'diagnose' 'health' | |
| * -> Diagnose; | |
| Verb 'slobber' | |
| * -> Slobber | |
| * noun -> Kiss; | |
| Verb 'meow' 'miaow' 'purr' | |
| * -> Meow; | |
| Verb 'snuffle' = 'smell'; | |
| Verb 'lick' = 'kiss'; | |
| Verb 'bite' 'chase' = 'attack'; | |
| Verb 'whistle' = 'blow'; | |
| Verb 'retrieve' 'fetch' = 'take'; | |
| Verb 'dream' = 'sleep'; | |
| ! --------------------------------------------------------------------------- | |
| ! The help menu | |
| ! --------------------------------------------------------------------------- | |
| Message "Help menu."; | |
| #ifdef NO_WINDOWS; | |
| [ HelpSub; | |
| switch (noun) { | |
| 1: print (b_name) menu_about, "^^"; menu_about.description(); | |
| 2: print (b_name) menu_commands, "^^"; menu_commands.description(); | |
| 3: print (b_name) menu_version, "^^"; menu_version.description(); | |
| 4: print (b_name) menu_author, "^^"; menu_author.description(); | |
| 5: print (b_name) menu_thanks, "^^"; menu_thanks.description(); | |
| 6: print (b_name) menu_walkthrough, "^^"; menu_walkthrough.description(); | |
| 7: print (b_name) menu_trivia, "^^"; menu_trivia.description(); | |
| default: | |
| print "The following topics are available:^^", | |
| "Game Manual", | |
| (f_style) "^ 1 ", "About This Game", | |
| (f_style) "^ 2 ", "Special Commands", | |
| (f_style) "^ 3 ", "Version Information", | |
| (f_style) "^ 4 ", "About the Author", | |
| (f_style) "^ 5 ", "Acknowledgements", | |
| "^^Inside Information and Hints", | |
| (f_style) "^ 6 ", "Walkthrough", | |
| (f_style) "^ 7 ", "Trivia", | |
| "^^Please type ~help <number>~ to select the appropriate topic.^"; | |
| } | |
| ]; | |
| #ifnot; | |
| [ HelpSub; ShowMenu(menu_main); ]; | |
| #endif; | |
| Verb meta 'help' 'hint' 'menu' 'instr' 'instructions' 'credits' 'about' | |
| 'info' 'hints' | |
| * -> Help | |
| * number -> Help; | |
| Menu menu_main "Game Menu"; | |
| Menu -> "Game Manual"; | |
| Object -> -> menu_about "About This Game" | |
| with description [; | |
| print_ret "As you may have guessed from the introduction, in this short | |
| excourse you play a dog. It doesn't matter what race, though it's | |
| probably a male dog (hence the name ~Ralph~). What matters is | |
| that you know you have buried a bone last year, which you now have to | |
| reacquire. The problem is, being a rather old dog, about eight to | |
| nine years old, your memory isn't what it used to be. The same goes | |
| for your nose, so you can't smell the bone through the earth.^ | |
| It seems you're on your very own.^^ | |
| RALPH was written for Inform, which is copyright by Graham Nelson | |
| (including large parts of the parser and the representation of the | |
| world). The latest version of Inform is always available at ", | |
| (f_style) "http://www.ifarchive.org/", ".^ | |
| RALPH is distributed as free software: you are allowed to do with it | |
| whatever you like, provided that you don't change it in any way, | |
| nor try to make money with it."; | |
| ]; | |
| Object -> -> menu_commands "Special Commands" | |
| with description [; | |
| print_ret "Well, just try out dog-specific vocabulary. Most of the | |
| standard verbs generally provided with Inform are still valid, only | |
| their behaviour might seem a bit different.^ | |
| Some examples for dog commands are these: sniff, wag, bark, | |
| scratch.^^", | |
| (b_style) "Special commands:", | |
| "^ SAVE, RESTORE, RESTART, QUIT - Control over the state of the game. | |
| ^ SCRIPT, UNSCRIPT - Controls the output to a file or printer. | |
| ^ BRIEF, SUPERBRIEF, VERBOSE - Changes the way locations are | |
| described when entering them. | |
| ^ OBJECTS, PLACES - Lists handled objects and visited places. | |
| ^ SCORE, FULL SCORE - Shows how you are getting along. | |
| ^ OOPS - Replaces a mistyped word from the last input. | |
| ^ UNDO - Takes back one move. | |
| ^ AGAIN - Repeats the last input.^^ | |
| Keep in mind that, while physically a dog, an extraordinary mind is | |
| still expected from you."; | |
| ]; | |
| Object -> -> menu_version "Version Information" | |
| with description [; | |
| print (b_style) "History:", | |
| "^ Release 1: Beta stage releases (there were six): not for the | |
| public. | |
| ^ Release 2: Interactive Fiction Competition 1996 release. RALPH made | |
| 12th place there (out of 27) and won a book, ~Computer Adventures: The | |
| Secret Art,~ by Gil Williamson. | |
| ^ Releases 3 - 5: Fix several bugs, add some details. Not publically | |
| released (but claiming to be final versions). | |
| ^ Release 6: Optimised the code a bit; bug fixes, yet additional | |
| details. Meant as final release (I issued a call for comments but | |
| received only one answer). | |
| ^ Release 7: Some tiny new details; typos fixed; more optimising; more | |
| consistent British vs. American style. Cleaned up the code to a more | |
| modern, Inform 6.14-ish form in order to release the source code. Help | |
| menu extended (especially the Acknowledgements section). | |
| ^ Release 8: Internal changes to clean up the source code. Nothing | |
| that is noticable in the game. | |
| ^ Release 9: A couple of slight, minor rephrasings; a little further | |
| optimising. Added one comment to ~trivia~ section of the help menu, and | |
| erased my physical address from the menu (since addresses tend to change | |
| too often). Support for dumb terminals (also great for playing on mobile | |
| phones and the like) in source code -- but has to be specially compiled | |
| (look for a comment at the start of the game to check if you're playing | |
| such a variant). Also added clear credits section.^^", | |
| (b_style) "About the version you're currently playing:^^"; | |
| <<Version>>; | |
| ]; | |
| Object -> -> menu_author "About the Author" | |
| with description [; | |
| print_ret "In 1996, when this game was written, Miron Schmidt was | |
| studying electrical engineering at the Technische Fachhochschule Berlin | |
| (or so he hopes, since he hasn't been able to find anyone with a | |
| satisfying translation of ~Nachrichtentechnik~). He has been enjoying | |
| interactive fiction for quite some years now, and started writing his | |
| own about five years ago, using ADL. Unfortunately, none of these have | |
| ever been finished, except for a game that he has written for a friend | |
| as a birthday present, designed together with another close friend.^ | |
| He likes weird music (the movie soundtrack of Koyaanisqatsi is just | |
| floating through the room while he sits writing this), good comic | |
| books (he advises everybody to check out Alan Moore once this game is | |
| finished), and bad movies (for which ~The Magic Crystal~ may stand as | |
| an explicit example).^", | |
| (f_style) "^ email: miron@@64mironseigenedomain.de"; | |
| ]; | |
| Object -> -> menu_thanks "Acknowledgements" | |
| with description [; | |
| print_ret "Acknowledgements go to my dog Zeppo for giving me the | |
| opportunity to study him.^^ | |
| Of course, every Inform game author has to thank Graham ~robot mouse~ | |
| Nelson, and so do I. A muffled hooray to Kevin ~Whizzard~ Wilson for | |
| bringing up the IF competition again.^ | |
| General thanks to: Anthony Phillips, Anne Clark, and Emerson Lake & | |
| Palmer for music that fits the atmosphere of a good adventure game. | |
| Crimpshrine, Sticky Filth, and The Dickies for music that doesn't. | |
| Steven Eric Meretzky for any reason.^^ | |
| Garfield is Copyright (C) Jim Davis. Quotation used without permission, | |
| hopefully under the ~Fair Use~ clause.^^ | |
| Credits: Inform was written by Graham Nelson, the Z-Machine was devised | |
| at Infocom, inc., the Glulx VM was developed by Andrew Plotkin, and the | |
| menuing system used right here was programmed by | |
| Khelwood@@64hotmail.com.^^ | |
| Creation stage playtesters: Andreas ~Kwarc~ Willett, Jacob ~Ugh~ | |
| Wieland, Felix Vogel, Norbert ~Grail~ Pustan, Manuel Scholz, Volkmar | |
| ~Vortex~ Mai.^ | |
| Beta testers: ~Alfe~ Alexander Fetke, Hajo ~Slarti~ Cappius, Kai | |
| Hesse, Paul David Doherty.^ | |
| Helpful comments after initial release: Martin Braun, Branko Collin.^ | |
| Additional bug fixing and basic spell checking: C.E. Forman.^ | |
| Design help and beta testing: ~RU Sirius~.^^ | |
| Telling me they played the game and basically had fun: Gecko Daly, | |
| mamster, neil ~d~ deMause, Adam Cadre -- Yeah, that's all, folks!^ | |
| Scoring me one extra point for the ~annoying kid~: Andrew Plotkin."; | |
| ]; | |
| Menu -> "Inside Information and Hints"; | |
| Object -> -> menu_walkthrough "Walkthrough" | |
| with description [ char; | |
| print "This walkthrough provides you with a step-by-step solution to the | |
| whole of the game. It may seem very short, but I hope that people | |
| spend a bit more time on trying to figure it out.^ | |
| Of course, there are several ways to solve the game, but the one given | |
| here is one of the shortest.^ | |
| If you've changed your mind about getting a detailed solution, press | |
| 'Q' now. Any other key to continue.^"; | |
| #ifdef TARGET_ZCODE; | |
| @read_char 1 -> char; | |
| #ifnot; ! Glulx | |
| char = KeyCharPrimitive(); | |
| #endif; | |
| if (char=='q' or 'Q') return 2; | |
| print_ret "^ E. SE. TAKE SHEET OF GLASS-FIBRE. | |
| ^ W. ATTACK CAT. | |
| ^ N. ATTACK CAT. | |
| ^ N. BLOCK HOLE WITH SHEET OF GLASS-FIBRE. | |
| ^ BARK. | |
| ^ TAKE SQUASH BALL. | |
| ^ S. GIVE BALL TO CHRISTOPHER ROBIN. | |
| ^ N. TAKE BALL. | |
| ^ THROW BALL OVER FENCE. | |
| ^ WAIT. WAIT. WAIT. WAIT. | |
| ^ W. DIG HOLE. | |
| ^ E. SE. SCRATCH AT ENTRANCE DOOR. | |
| ^ GET PIPE. | |
| ^ W. DROP PIPE. | |
| ^ E. SCRATCH AT ENTRANCE DOOR. | |
| ^^Well done, you have solved Ralph's quest!"; | |
| ]; | |
| Object -> -> menu_trivia "Trivia" | |
| with description [ char; | |
| print "(This section gives away some details that could spoil part of the | |
| fun of playing the game. If you've changed your mind about reading it, | |
| press 'Q' now. Any other key to go on.)^"; | |
| #ifdef TARGET_ZCODE; | |
| @read_char 1 -> char; | |
| #ifnot; ! Glulx | |
| char = KeyCharPrimitive(); | |
| #endif; | |
| if (char=='q' or 'Q') return 2; | |
| print_ret "^ - Christopher Robin is the name of Winnie the Pooh's human | |
| friend. At first, I wanted to call him Ron Jeremy, a name vaguely | |
| familiar to me, but then I remembered who exactly Ron Jeremy is, so | |
| I dropped that idea. (If you don't know the name, don't ask me. You may | |
| stumble about it when you read magazines or watch movies you aren't | |
| supposed to.) | |
| ^^ - Although Christopher is severely dull-witted, his code takes up | |
| almost fifteen percent of the whole. The player may decide if this is | |
| a good sign for the boy, or a bad sign for the whole. | |
| ^^ - Blamant the Teddy is an utter red herring. Originally, I used it | |
| for testing, but I decided to leave it in, slightly reworked. | |
| ^^ - Ralph refers to the cat as ~he,~ the same way he refers to | |
| himself as ~he.~ Only humans would be arrogant enough to call animals | |
| by an indefinite sex. | |
| ^^ - Christopher Robin was a runner-up in the ~Best Individual NPC~ | |
| category of the 1996 XYZZY Awards. That was cool. | |
| ^^ - I put in a very witty response to the ~XYZZY~ command because | |
| XYZZYnews magazine had a list of responses for all the Competition | |
| 1995 games. They also had a list for all the Competition 1997 games | |
| -- but guess which Competition was left out?^^", | |
| (b_style) "Have you ever tried...", | |
| "^ ...looking under the beam of sunlight? | |
| ^ ...digging many holes in one location? | |
| ^ ...barking many times? | |
| ^ ...jumping over the tree? | |
| ^ ...peeing on several things? On Christopher Robin? | |
| ^ ...barking while carrying something? | |
| ^ ...breaking the reading pipe?^ | |
| There are countless other details: just try virtually everything!"; | |
| ]; | |
| ! --------------------------------------------------------------------------- | |
| ! Closing stuff. | |
| ! --------------------------------------------------------------------------- | |
| Message "^Compilation finished."; | |
| end; | |
Xet Storage Details
- Size:
- 67.3 kB
- Xet hash:
- 8ad7fc0b62c884c136197d96f1cf45fb8b159b8e8dad9934450764453ed5d2e9
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.