! --------------------------------------------------------------------------- ! 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: <>; ], has scenery; Object -> hut_hole "rectangular hole" with name 'somewhat' 'rectangular' 'hole' 'in' 'eastern' 'wall' 'east' 'e//', description "It leads outside.", before [; Enter: <>; 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!"; <>; 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.^"; <>; } "~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; <>; } 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); <>; 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: <>; } } 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; <>; 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: <>; ], 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: <>; Enter: <>; 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: <>; ], 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.^"; <>; 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.^"; <>; 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: <>; Wag: <>; 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 ; 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."; <>; ]; [ 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."; <>; ]; [ 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 ~ 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:^^"; <>; ]; 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;