Author:   Joyce Haslam <[email protected]>
Date:     1998/11/27
Forum:    rec.arts.int-fiction

I've been sitting selfishly on this letter from Graham Nelson
for a year:

> I need a class of rooms that are dimly lit so that "take all" does
> not work. I can suppress "you can see" and "exits are", but I don't
> know how to get at the parser. I don't mind the player being able
> to "take all" in brightly lit rooms, and "the dark" is fine, but in
> the class of rooms with the attribute "has dimness" I want
> something like
> "take book"
> "OK"
> "take all"
> "What, even the snakes and spiders?"

Here's a little game which has just the code you need.  I've
put a few comments in, but for further explanation, see section
29 of the Designer's Manual.  Note that there are two things to
do -- (1) to make sure that "take all" takes nothing in dim
rooms, and (2) to print a good error message when this rule has
been applied.

You should be able to compile this as is: then try "take all"
in both rooms.  ("Drop all", and other uses of "all", should be
unaffected.)

   Graham Nelson

---------------

Constant DEBUG;

Constant Story "Faintly Lit";
Constant Headline "^An Interactive Answer^";

Include "Parser";
Include "VerbLib";

Class FLRoom
 has  light;

Object Bright_Room "Bright Room"
 with e_to Faintly_Lit_Room,
      description
         "The Bright Room. A corridor runs east.",
 has  light;

Object -> green_ball "green ball"
 with name "green" "ball";

Object -> red_disc "red disc"
 with name "red" "disc";

FLRoom Faintly_Lit_Room "Faintly-Lit Room"
 with w_to Bright_Room,
      description
         "The Faintly-Lit Room. A corridor runs west.";

Object -> marble "marble"
 with name "marble";

Object -> feather "feather"
 with name "feather";

Object -> basket "basket"
 with name "basket";

[ Initialise;
 location = Bright_Room;

"^^^^^Welcome to the...^";
];

[ ChooseObjects obj code;
 if (code == 1)
 {   ! That is: if the parser wants to include this object in
     ! an "all"

     if (action_to_be == ##Take or ##Remove
         && location ofclass FLRoom)
     {   ! Force the object to be excluded.  The net result is that
         ! the parser will be unable to have anything in a "take all"
         ! occurring in a faintly-lit room.

         return 2;
     }
 }
 return 0;  ! Carry on, applying normal parser rules
];

[ ParserError error_code;
 if (error_code == NOTHING_PE)
 {   ! The error message printed if an "all" turned out empty

     if (action_to_be == ##Take or ##Remove
         && location ofclass FLRoom)

        "In this faint light, it's not so easy.";
 }

 return 0;  ! Print standard parser error message
];

Include "Grammar";

--
Graham Nelson | [email protected] | Oxford, United Kingdom

--
Joyce Haslam
http://www.argonet.co.uk/users/dljhaslam/ for Gateway to Karos [INFORM]
Powerbase is for RiscOs only