home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / GAMES / informosk.lha / dejavu.inf next >
Text File  |  1993-11-27  |  22KB  |  613 lines

  1. ! ----------------------------------------------------------------------------
  2. ! Deja Vu:  An Inform Demonstration
  3. !
  4. ! This second release corrects a quite major bug in the parser, whose cure
  5. ! (provided by Jon Drukman, whom I thank) turned out to be trivial.
  6. !
  7. ! It also incorporates an overhaul of the parser made between early and late
  8. ! testing versions of "Curses": in particular, implicit taking of objects, a
  9. ! slightly better understanding of darkness, better resolution of ambiguity,
  10. ! more context-sensitive "again", fixes for some rare bugs, understanding of
  11. ! "all of", replies like "both" and "either"
  12. !
  13. ! The parser itself lives in a file "Parser" which also sets up standard
  14. ! attributes, properties and pseudo-objects (directions, darkness, etc).
  15. ! This ought to make it easier to transplant the parser to other games,
  16. ! without needing to know how it works.
  17. !
  18. ! I have reformatted these files to 80 columns wide for the benefit of
  19. ! readers trapped with old monitors.
  20. !
  21. ! There is now a "help" verb, in order to demonstrate verbs whose noun may
  22. ! be any arbitrary word, recognised or not.
  23. !
  24. ! ----------------------------------------------------------------------------
  25.  
  26. Constant Story "DEJA VU";
  27. Constant Headline "^An Interactive Demonstration^\
  28.              Copyright (c) 1993 by Graham Nelson. All rights given away.^";
  29.  
  30. Release 2;
  31. Statusline score;
  32.  
  33. Constant MAX_CARRIED 5;
  34.  
  35. Constant MAX_SCORE 50;
  36. Constant NUMBER_TASKS 3;
  37. Constant OBJECT_SCORE 4;
  38. Constant ROOM_SCORE 5;
  39.  
  40. #include "Parser";
  41.  
  42. Global task_scores initial 3 7 4;
  43. #include "VerbLib";
  44.  
  45. ! ----------------------------------------------------------------------------
  46. ! One attribute of our own...
  47. ! ----------------------------------------------------------------------------
  48.  
  49. Attribute is_cube;
  50.  
  51. ! ----------------------------------------------------------------------------
  52. ! And now genuine objects... there is little distinction between rooms and
  53. ! objects.
  54. ! Note that: "name" of a room gives a list of words to which the game replies
  55. ! with "you don't need to refer to that in this game" - ie, names of irrelevant
  56. ! things.
  57. ! ----------------------------------------------------------------------------
  58.  
  59. Object cave "Y2 Rock Room" nothing
  60.   with longdesc "You are in a large room, veined with quartz, with a passage \
  61.                  to the south, \
  62.                  a passage to the west, and a wall of broken rock to the \
  63.                  east.  There is a large ~Y2~ on a rock in the room's centre.",
  64.        name "vein" "quartz",
  65.        w_to broken, s_to reservoir,
  66.        cantgo "The only paths through the rubble are west and south."
  67.   has  light;
  68. Object rubble "rubble" cave
  69.   with name "rubble" "wall" "broken" "rocks"
  70.   has  scenery;
  71. Object rock "Y2 rock" cave
  72.   with name "rock", article "the",
  73.        longdesc "The author of this demonstration has never, ever \
  74.            understood what the Y2 rock was \
  75.            for.  Was it a grid reference?  Or a question?"
  76.   has  scenery supporter;
  77. Object cube1 "featureless white cube" rock
  78.   with name "white" "cube",
  79.        preroutine Cube1Pre
  80.   has  is_cube scored;
  81. Object sword "Elvish-made sword" selfobj
  82.   with name "elven" "elvish" "sword", article "an";
  83. Object cube2 "featureless white cube" selfobj
  84.   with name "white" "cube"
  85.   has  is_cube;
  86. Object lamp "brass lantern" selfobj
  87.   with name "brass" "lamp" "lantern"
  88.   has  light;
  89. Object car "little red car" cave
  90.   with name "little" "red" "car",
  91.        longdesc "Large enough to sit inside.  Among the controls is a \
  92.                  prominent on/off switch.  The numberplate is KAR 1.",
  93.        initpos "The red car sits here, its engine still running.",
  94.        closedpos "A little red car is parked here.",
  95.        preroutine RedCarPre, postroutine RedCarPost
  96.   has  switchable enterable static container open;
  97. Object note "small note" car
  98.   with name "small" "note",
  99.        longdesc "  !!!! FROBOZZ MAGIC CAR COMPANY !!!!^\
  100.                  ^Hello, Driver!^\
  101.                  ^Instructions for use:^\
  102.                  ^Switch on the ignition and off you go!^\
  103.                  ^Warranty:^\
  104.                  ^This car is guaranteed against all defects for a period of \
  105.                   76 milliseconds from date of purchase or until used, \
  106.                   whichever comes first.^\
  107.                  ^Good Luck!";
  108.  
  109. Object view "Window" nothing
  110. with longdesc "You're at a low window overlooking a huge pit, which \
  111.        extends up out of sight.  A floor is indistinctly visible \
  112.        over 50 feet below.  Traces of white mist cover the floor \
  113.        of the pit, becoming thicker to the right.  Marks in the \
  114.        dust around the window would seem to indicate that \
  115.        someone has been here recently.^^Directly across the pit \
  116.        from you and 25 feet away there is a similar window \
  117.        looking into a lighted room.  A shadowy figure can \
  118.        be seen there peering back at you.^^A narrow crack in the \
  119.        rocks leads back down.",
  120.      d_to broken, preroutine ViewPre
  121. has  light;
  122. Object key "iron key" view
  123.   with name "iron" "key", article "an";
  124.  
  125.  
  126. Object broken "Broken Passage" nothing
  127.   with longdesc "You are in a dirty broken passage.  To the east is a \
  128.            crawl.  To the south is a large passage.  Above you is another \
  129.            passage.",
  130.   e_to cave, n_to door, s_to yriver, u_to view;
  131. Object door "iron door" broken
  132.   with name "iron" "door",
  133.        initpos "In the north wall is an open iron door.",
  134.        closedpos "In the north wall is a shut iron door.",
  135.        portalto ledge,
  136.        dirprop n_to,
  137.        with_key key
  138.   has  portal static openable lockable locked;
  139. Object ledge "Canyon Ledge" nothing
  140.   with longdesc "The door opened out onto a tiny ledge at the top of the \
  141.            Great Canyon on its west wall. From here there \
  142.            is a marvelous view of the canyon and parts of the Frigid River \
  143.            upstream.  Across the canyon, the walls of the White Cliffs join \
  144.            the mighty ramparts of the Flathead Mountains to the east. \
  145.            Following the Canyon upstream to the north, Aragain \
  146.            Falls may be seen, complete with rainbow.  The mighty Frigid River \
  147.            flows out from a \
  148.            great dark cavern.  To the west and south can be seen an immense \
  149.            forest, stretching for miles around.  It is absolutely impossible \
  150.            to climb down into the canyon from here.",
  151.        s_to broken;
  152.  
  153.  
  154. Object yriver "Yellow River Rock" nothing
  155.   with longdesc "You are in a splendid chamber thirty feet high.  The walls \
  156.            are frozen rivers of orange stone.  An awkward canyon and a \
  157.            good passage exit from north and south sides of the chamber.",
  158.        n_to broken, s_to debris;
  159. Object sack "brown paper sack" yriver
  160.   with name "brown" "paper" "sack",
  161.        initpos "Hanging mysteriously in mid-air, at about the height of a \
  162.                 kitchen table, is an elongated brown sack, smelling of hot \
  163.                 peppers.", preroutine SackPre, capacity 3
  164.   has  container interior openable;
  165. Object cube3 "featureless white cube" sack
  166.   with name "white" "cube"
  167.   has  is_cube scored;
  168. Object clove "clove of garlic" sack
  169.   with name "clove" "of" "garlic", preroutine ClovePre
  170.   has  edible;
  171. Object sandwich "pepper sandwich" sack
  172.   with name "pepper" "sandwich", preroutine SandwichPre
  173.   has  edible;
  174.  
  175.  
  176. Object debris "Debris" nothing
  177.   with longdesc
  178.           "You are in a debris room filled with stuff washed in from the \
  179.            surface.  A low wide passage with cobbles becomes plugged \
  180.            with mud and debris here, so that you could only just squeeze \
  181.            by northeast, but an awkward canyon leads \
  182.            north and steps lead up.  A note on the wall says:^\
  183.            ^    Magic Word ~XYZZY~",
  184.        n_to yriver, u_to mists, ne_to traproom;
  185. Object gun "ray gun" debris
  186.   with name "ray" "gun",
  187.        longdesc "Labelled Frobozz Magic Ray Gun Co., it works on \
  188.                  gerontological principles."
  189.   has  scored;
  190.  
  191.  
  192. Object mists "Hall of Mists" nothing
  193.   with longdesc "You are at one end of a vast hall stretching forward out of \
  194.            sight to the west.  There are bricked-up openings to either side. \
  195.            Nearby, a wide stone staircase leads downward.  The hall \
  196.            is filled with wisps of white mist swaying to and fro \
  197.            almost as if alive.  A cold wind blows up the staircase. \
  198.            There is a passage at the top of a dome behind you.",
  199.        d_to debris, w_to wend,
  200.        preroutine MistsPre;
  201. Object snake "sullen snake" mists
  202.   with name "sullen" "snake",
  203.        longdesc "Perhaps a boa constrictor.  Perhaps not.",
  204.        liferoutine SnakeLife
  205.   has  animate;
  206. Object oldsnake "aged, sullen snake" nothing
  207.   with name "sullen" "snake", article "an",
  208.        longdesc "A sad and decrepit echo of a once-great serpent."
  209.   has  animate;
  210.  
  211.  
  212. Object wend "West End of Hall of Mists" nothing
  213.   with longdesc "You are on the east bank of a fissure slicing clear across \
  214.            the hall.  The mist is quite thick here, and the fissure \
  215.            is too wide to jump.",
  216.        e_to mists
  217.   has  scored;
  218. Object grenade "hand grenade" wend
  219.   with name "hand" "grenade",
  220.        initpos "A nasty-looking hand grenade (there is no other kind) \
  221.                 rolls about on the floor here.",
  222.        timeleft 0,
  223.        preroutine GrenadePre;
  224.  
  225.  
  226. Object reservoir "Reservoir" nothing
  227.   with longdesc "You are at the edge of a large underground reservoir.  An \
  228.            opaque cloud of white mist fills the room and rises \
  229.            rapidly upward.  The lake is fed by a stream which tumbles \
  230.            out of a hole in the wall about 10 feet overhead and \
  231.            splashes noisily into the water somewhere within the mist. \
  232.            The only passages go north and east.",
  233.        n_to cave, e_to loud, preroutine ReservoirPre
  234.   has  scored;
  235. Object clover "two-leafed clover" reservoir
  236.   with name "two" "two-lea" "clover",
  237.        longdesc "Unlucky for some.",
  238.        initpos "Growing from a tuft of mould is a single two-leafed clover.",
  239.        postroutine CloverPost;
  240.  
  241.  
  242. Object loud "Loud Room" nothing
  243.   with longdesc "This is a large room with a ceiling which cannot be detected \
  244.            from the ground.  \
  245.            There is a narrow passage turning sharply from west to southwest.  \
  246.            The room is deafeningly loud with an undetermined rushing sound.  \
  247.            The sound seems to reverberate from all of the walls, making it \
  248.            difficult even to think.",
  249.        w_to reservoir, sw_to traproom,
  250.        preroutine LoudPre;
  251. Object bar "platinum bar" loud
  252.   with name "bar" "platinum",
  253.        longdesc "Exquisite."
  254.   has  scored;
  255.  
  256. Object traproom "@00" nothing
  257.   with longdesc "This is a medium-sized, quite unremarkable furnished sitting \
  258.            room, with skirting boards, floral wallpaper and a pine floor.  \
  259.            Unremarkable that is...^^...except for the huge red sign over the \
  260.            mantelpiece reading ~TRAP~, \
  261.            and the sage advice ~Leave by the lowest way~, which could be \
  262.            either of the northeast or southwest exits, for all you know.",
  263.        ne_to loud, sw_to debris, preroutine TraproomPre;
  264. Object mantelpiece "heavy mantelpiece" traproom
  265.   with name "mantel" "mantle"
  266.   has  scenery supporter;
  267. Object lantern "iron lantern" mantelpiece
  268.   with name "iron" "lantern" "lamp", article "an"
  269.   has  light;
  270. Object level "spirit level" traproom
  271.   with name "spirit" "level",
  272.        longdesc "A length of wood containing a flask of viscous green liquid, \
  273.            in which a bubble is trapped.", postroutine LevelPost;
  274. Object block "wooden block" traproom
  275.   with name "wooden" "block", capacity 2
  276.   has  supporter;
  277.  
  278. ! ----------------------------------------------------------------------------
  279. !  Game control code: put initialisation in Initialise(), which is called
  280. !  by Game() in the Parser.  (This happens before the banner is printed.)
  281. !  Initialise is expected to set "location" to the initial location.
  282. !
  283. !  The Parser keeps control, calling out to verb routines as needed.
  284. !  TimePasses is called after every turn of "real" time has passed (but not,
  285. !  for instance, after a "score" command).
  286. !
  287. !  The line about plurals declares a new dictionary word "cubes" which is
  288. !  to refer to all objects with the is_cube attribute (declared above).
  289. ! ----------------------------------------------------------------------------
  290.  
  291. [ Initialise;
  292.  
  293.   location=cave;
  294.  
  295.   plural_word1 = #n$cubes; plural_filter1 = is_cube;
  296.  
  297.   string 0 "Paranoia Room";
  298.  
  299.   print "^^^^^What a horrid dream, all about compiling something.  \
  300.          Thank heavens you've finally woken up, even if you seem to have been \
  301.          sleep-walking.  \
  302.          As you dizzily shake your head, you can't help feeling this place is \
  303.          somehow familiar...^^";
  304.  
  305. ];
  306.  
  307. [ TimePasses i;
  308.  
  309.   if random(4)==1
  310.   {   i=random(60);
  311.     if i==1 { print "^Far away, you hear the hammering of dwarven anvils.^"; }
  312.     if i==2 { print "^A shadowy figure glides by in the corner of view.^"; }
  313.     if i==3 { print "^Bats flutter through the cave, startling you.^"; }
  314.     if i==4 { print "^A hoarse voice whispers, ~PLUGH~.^"; }
  315.     if i==5 { print "^The floor shakes in a sudden earth tremor!^"; }
  316.     if i==6
  317.     {   print "^You hear a door creak open, somewhere in the distance.^"; }
  318.   }
  319.  
  320.   if TimeUp(grenade)==1
  321.   {   print "^There is suddenly an immense explosion!  This is unlikely to \
  322.               teach you not to meddle with things you don't understand...  \
  323.               On the other hand you'll never do so again.^"; deadflag=1;
  324.   }
  325. ];
  326.  
  327. [ PrintRank;
  328.   print ", earning you the rank of ";
  329.  
  330.   if score >= 35 { print_ret "navigator."; }
  331.   if score >= 20 { print_ret "adventurer."; }
  332.   if score >= 5 { print_ret "explorer."; }
  333.   if score >= 1 { print_ret "tourist."; }
  334.   print_ret "somnambulist.";
  335. ];
  336.  
  337. [ PrintTaskName ach;
  338.   if ach==0 { print_ret "driving the car"; }
  339.   if ach==1 { print_ret "zapping the snake"; }
  340.   if ach==2 { print_ret "drinking some water"; }
  341.   print_ret "(something else)";
  342. ];
  343.  
  344. [ DarkToDark;
  345.   deadflag=1;
  346.   print_ret "As you step falteringly through the darkness, \
  347.              cowardly but evil creatures devour you whole!";
  348. ];
  349.  
  350. [ DeathMessage;
  351.   if deadflag==3 { print "You have drowned"; }
  352. ];
  353.  
  354. [ LookRoutine;
  355.   clear_attr sword light;
  356.   if location==parent(snake)
  357.   {   if player==parent(sword)
  358.       {   print "^Your sword gives off a bright greenish light!^";
  359.           set_attr sword light;
  360.       }
  361.   }
  362. ];
  363.  
  364. [ Amusing;
  365.   print_ret "Why not write an Inform game?";
  366. ];
  367.  
  368. [ GamePreRoutine;
  369.   rfalse;
  370. ];
  371.  
  372. [ NewRoom;
  373.   rfalse;
  374. ];
  375.  
  376. ! ----------------------------------------------------------------------------
  377. ! Verb action routines
  378. ! ----------------------------------------------------------------------------
  379.  
  380. [ MagicWordSub;
  381.   print_ret "For a moment you can almost hear a hoarse voice \
  382.              say something to you.  But it passes.";
  383. ];
  384.  
  385. [ EchoSub;
  386.   if location==loud
  387.   {   give loud general;
  388.       print_ret "The acoustics of the room subtly alter...";
  389.   }
  390.   print_ret "There isn't an echo here.";
  391. ];  
  392.  
  393. [ ShootSub;
  394.   if player~=parent(gun)
  395.   {   print_ret "You have nothing to shoot with.";
  396.   }
  397.   if inp1==gun { print_ret "It is unable to shoot itself."; }
  398.   if inp1==selfobj
  399.   {  deadflag=1;
  400.      print_ret "Your hands suddenly look rather white and skeletal, \
  401.          but then again the light is getting dimmer, and dear oh dear but \
  402.          it seems cold in here, and so sleepy..."; }
  403.   if inp1 has edible { remove inp1; print "Zap!  "; CDefArt(inp1);
  404.      print_ret " decays into a noisome mess and expires messily into dust."; }
  405.   if inp1==clover
  406.   {   remove clover; print_ret "Zap!  The clover shrivels into dust."; }
  407.   if inp1==snake
  408.   {   remove snake; move oldsnake to mists; itobj=oldsnake; Achieved(1);
  409.       print_ret "Zap!  The snake suddenly wrinkles and concertinas, sheds \
  410.           a layer of skin and lurches back upright, looking sadly decrepit."; }
  411.   if inp1==oldsnake { deadflag=1;
  412.       print_ret "Zap!  The old snake dodges your callous blast, leaps \
  413.           forward and sinks its aged fangs into your wrist.  Amazing how \
  414.           the venom is still effective even at that age, isn't it?"; }
  415.   print_ret "Zap!  There is no appreciable effect.";
  416. ];  
  417.  
  418. [ SnakeLife;
  419.   if reason_code==0
  420.   {   if action==#a$GoSub { print_ret "The snake wasn't born yesterday.  \
  421.           It is going nowhere."; }
  422.       rfalse;
  423.   }
  424.   if reason_code==#a$AttackSub
  425.   {   print_ret "Lazily, the snake dodges your attack.";
  426.   }
  427.   if reason_code==#a$KissSub
  428.   {   print_ret "What a repulsive idea.";
  429.   }
  430.   if reason_code==#a$ThrowAtSub
  431.   {   print "Effortlessly, the snake dodges "; DefArt(inp1);
  432.       print_ret ".";
  433.   }
  434.   if reason_code==#a$AnswerSub
  435.   {   print_ret "The snake disdains to comment.";
  436.   }
  437.   if reason_code==#a$AskSub
  438.   {   print_ret "~I'm only the obligatory monster.~";
  439.   }
  440.   if reason_code==#a$GiveSub
  441.   {   if inp1 has edible
  442.       {   remove_obj inp1;
  443.           print_ret "~Mmm!  Thanks!  I still hate you, though.~";
  444.       }
  445.       print_ret "~Bleurghh!  Are you trying to poison me?~";
  446.   }
  447.   rfalse;
  448. ];
  449.  
  450. [ ClovePre;
  451.   if action==#a$SmellSub { print_ret "That'll keep the vampires away."; }
  452.   rfalse;
  453. ];
  454.  
  455. [ SandwichPre;
  456.   if action==#a$SmellSub { print_ret "Peppers!  Excellent."; }
  457.   rfalse;
  458. ];
  459.  
  460. [ SackPre;
  461.   if action==#a$SmellSub { print_ret "A tantalising aroma."; }
  462.   rfalse;
  463. ];
  464.  
  465. [ RedCarPre;
  466.   if action==#a$PushDirSub { AllowPushDir(); rtrue; }
  467.   if action~=#a$GoSub { rfalse; }
  468.   if inp1==u_obj or d_obj { rfalse; }
  469.   if car has on { Achieved(0); print_ret "Brmm!  Brmm!"; }
  470.   print "(The ignition is off at the moment.)^";
  471.   rfalse;
  472. ];
  473.  
  474. [ RedCarPost;
  475.   if action==#a$PushDirSub
  476.   {   print_ret "The car rolls very slowly as you push it."; }
  477.   rfalse;
  478. ];
  479.  
  480. [ CloverPost;
  481.   if action~=#a$TakeSub { rfalse; }
  482.   if player~=parent(sword) { rfalse; }
  483.   print_ret "As you take the clover, your sword shines \
  484.       a sudden burst of light!";
  485. ];
  486.  
  487. [ ViewPre;
  488.   if action==#a$WaveHandsSub
  489.   {   print_ret "The shabby figure waves back at you."; }
  490.   rfalse;
  491. ];
  492.  
  493. [ ReservoirPre;
  494.   if action==#a$DrinkSub
  495.   { Achieved(2); print_ret "Unfluoridated and clear.  You feel better."; }
  496.   if action==#a$FillSub { print_ret "The water is too sacred."; }
  497.   if action==#a$SwimSub
  498.   {   deadflag=3;
  499.       print_ret "Your first reaction is, this is very cold water.  Your \
  500.       second reaction is that it is also very inhabited water.  What with \
  501.       the sea-serpent dragging you down to a rapid drowning (gurgling \
  502.       ~that's for the white crystal ball, you greedy swine~, \
  503.       perhaps mistaking you for someone else) there is no opportunity for \
  504.       a third opinion."; }
  505.   rfalse;
  506. ];
  507.  
  508. [ Cube1Pre;
  509.   if action~=#a$TakeSub { rfalse; }
  510.   print_ret "You flinch from touching the cube, which is white hot!";
  511. ];
  512.  
  513. [ LoudPre i;
  514.   if loud has general { rfalse; }
  515.   if action==#a$GoSub { rfalse; }
  516.   i=parse-->1;
  517.   print_addr i; print_char ' '; print_addr i;
  518.   print_char ' '; print_addr i; print "...^";
  519.   if action==#a$EchoSub { rfalse; }
  520.   rtrue;
  521. ];
  522.  
  523. [ MistsPre;
  524.   if action~=#a$GoSub { rfalse; }
  525.   if inp1~=w_obj { rfalse; }
  526.   if mists==parent(snake)
  527.   { print_ret "The snake, predictably, won't let you pass."; }
  528.   print "You dodge the sad old snake without difficulty.^";
  529.   rfalse;
  530. ];
  531.  
  532. [ GrenadePre;
  533.   if action~=#a$PullSub { rfalse; }
  534.   if grenade has general { rfalse; }
  535.   SetTimer(grenade, 5); give grenade general;
  536.   print_ret "You pull the pin out, an irrevocable act.";
  537. ];
  538.  
  539. Global trap_slope = 0;
  540. [ TraproomPre;
  541.   if action~=#a$GoSub { rfalse; }
  542.   if inp1==sw_obj or ne_obj
  543.   {   if level has general
  544.       {   if trap_slope==0 { jump WrongWay; }
  545.           if trap_slope==1 { if inp1==sw_obj { jump WrongWay; } }
  546.           if trap_slope==2 { if inp1==ne_obj { jump WrongWay; } }
  547.       }
  548.       if traproom hasnt general
  549.       {   string 0 "Trap Room";
  550.           give traproom general;
  551.           print_ret "A voice booms out, ~This is your only warning!~ and \
  552.               stops you in your tracks.";
  553.       }
  554.   }
  555.   rfalse;
  556.   .WrongWay; deadflag=1; print_ret "To the sound of maniacal laughter, \
  557.       a thousand tons of rubble falls upon your head.";
  558. ];
  559.  
  560. [ LevelPost;
  561.   if action~=#a$PutOnSub { rfalse; }
  562.   if inp2~=mantelpiece { rfalse; }
  563.   if level hasnt general { trap_slope=random(2); }
  564.   give level general;
  565.   print "You put the spirit level on the mantelpiece, and the bubble \
  566.          slowly drifts towards the ";
  567.   if trap_slope==1 { print_ret "northeast."; }
  568.   print_ret "southwest.";
  569. ];
  570.  
  571. [ SHelpSub;
  572.   print_ret "Try ~help credits~ or ~help instructions~.";
  573. ];
  574.  
  575. Dictionary h1_word "instru";
  576. Dictionary h2_word "credit";
  577.  
  578. [ HelpSub i;
  579.   i=special_word;
  580.   new_line;
  581.   if i==#w$instru
  582.   {   print_ret "This is Deja Vu, a demonstration game only.  \
  583.                  Do with it as you please.  This unhelpful message is \
  584.                  provided only so a help routine could been coded.";
  585.   }
  586.   if i==#w$credit
  587.   {   Banner();
  588.       print_ret "^Release 2 is the second edition posted to the \
  589.                   interactive-fiction archive.  It is substantially \
  590.                   rewritten.  Updated versions may possibly follow.^";
  591.   }
  592.   print_ret "There's no help on that, sorry.";
  593. ];
  594.  
  595. ! ----------------------------------------------------------------------------
  596. ! The grammar table consists of the standard one, plus some of our own:
  597. ! ----------------------------------------------------------------------------
  598.  
  599. #include "Grammar";
  600.  
  601. Verb "echo"
  602.                 *                                -> EchoSub;
  603. Verb "xyzzy" "plugh" "plover" "blorple"
  604.                 *                                -> MagicWordSub;
  605. Verb "shoot" "zap"
  606.                 * noun                           -> ShootSub;
  607. Verb "help"
  608.                 *                                -> SHelpSub
  609.                 * special                        -> HelpSub;
  610.  
  611. ! ----------------------------------------------------------------------------
  612. end;
  613.