!--------------------------------------------------------------------------
! A drinks machine: see p. 54 in the Designer's Manual.
!
! Two fine points - the button rejects a plain word like "coffee" to refer
! to the coffee button if the player is currently holding a cup of coffee:
! this prevents "drink coffee" being misinterpreted.
!
! Also, the "itobj" is reset so that "it" refers to the just-served cup.
!
! Graham A Nelson, 26/10/94
!--------------------------------------------------------------------------

Constant Story "INFORMA COLA";
Constant Headline "^An Additive-Free Interactive Example^by Graham Nelson^";

Include "parser";
Include "verblib";
Include "grammar";

[ Initialise;
   location = Cafe;
   print "^^^^^Enjoy...^^";
];

Object  Cafe "Cafe Inform"
has    light
with   description "A highly fashionable but desperately ill-equipped \
           cafe, locked up after closing time.",
       cant_go "The Cafe is closed up.";

Nearby  drinksmat "drinks machine",
has    static
with   initial "The drinks machine here has three buttons: Cola, Coffee, \
           Tea.",
       name "drinks" "machine";

Nearby  thebutton "drinks machine button"
has    scenery
with   parse_name [ i flag w type;
           for (: flag == 0: i++) {
               flag = 1;
               w = NextWord();
               if (w == 'button' or 'for') flag = 0;
               if (w == 'coffee' && type == 0) { flag = 0; type = 1; }
               if (w == 'tea' && type == 0)    { flag = 0; type = 2; }
               if (w == 'cola' && type == 0)   { flag = 0; type = 3; }
           }
           i--;
           if (type==drink.number && i==1 && type~=0 && drink in player)
               return 0;
           self.number=type;
           return i;
       ],
       number 0,
       before [;
        Push, SwitchOn:
           if (self.number == 0)
               "You'll have to say which button to press.";
           if (parent(drink) ~= 0) "The machine's broken down.";
           drink.number = self.number;
           move drink to player;
           itobj = drink;
           print_ret "Whirr!  The machine puts ", (a) drink, " into your \
               glad hands.";
        Attack:
           "The machine shudders and squirts cola at you.";
        Drink:
           "You can't drink until you've worked the machine.";
       ];

Object  drink "drink"
 with  parse_name [ i flag w type;
           for (: flag == 0: i++) {
               flag = 1;
               w = NextWord();
               if (w == 'drink' or 'cup' or 'of') flag = 0;
               if (w == 'coffee' && type == 0)  { flag = 0; type = 1; }
               if (w == 'tea' && type == 0)     { flag = 0; type = 2; }
               if (w == 'cola' && type == 0)    { flag = 0; type = 3; }
           }
           i --;
           if (i == 0 || (type ~= 0 && type ~= self.number)) return 0;
           return i;
       ],
       short_name [;
           switch (self.number) {
            1: print "cup of coffee";
            2: print "cup of tea";
            3: print "cup of cola";
           }
           rtrue;
       ],
       number 0,
       before [;
        Drink:
           remove self;
           "Ugh, that was awful.  You crumple the cup and responsibly \
           dispose of it.";
       ];

End;