??ANSWER TO EXERCISE 83

For good measure, we'll combine this with the previous rule about moved objects being in scope in the dark. The following can be inserted into the 'Shell' game:

Object coal "dull coal" Blank_Room
  with name "dull" "coal";

Object Dark_Room "Dark Room"
  with description "An empty room with a west exit.",
       each_turn
       [; if (self has general) self.each_turn=0;
          else "^You hear the breathing of a dwarf.";
       ],
       w_to Blank_Room;

Object -> light_switch "light switch"
  with name "light" "switch",
       initial "On one wall is the light switch.",
       after
       [; SwitchOn: give Dark_Room light;
          SwitchOff: give Dark_Room ~light;
       ],
  has  switchable static;

Object -> diamond "shiny diamond"
  with name "shiny" "diamond"
  has  scored;

Object -> dwarf "dwarf"
  with name "voice" "dwarf",
       life
       [; Order: if (action==##SwitchOn && noun==light_switch)
                 {   give Dark_Room light general;
                     give light_switch on; "~Right you are, squire.~";
                 }
       ],
  has  animate;     

[ InScope person i;
  if (parent(person)==Dark_Room)
  {   if (person==dwarf  Dark_Room has general)
          PlaceInScope(light_switch);
  }
  if (person==player && location==thedark)
      objectloop (i near player)
          if (i has moved  i==dwarf)
              PlaceInScope(i);
  rfalse;
];
Note that the routine puts the light switch in scope for the dwarf -- if it didn't, the dwarf would not be able to understand "dwarf, turn light on", and that was the whole point.} As mentioned in the definition above, each object has the ability to drag other objects into scope whenever it is in scope. This is especially useful for giving objects component parts: e.g., giving a washing-machine a temperature dial. (The dial can't be a child object because that would throw it in with the clothes: and it ought to be attached to the machine in case the machine is moved from place to place.) For this purpose, the property add_to_scope may contain a list of objects to add.

Back to the exercise in section 28
Mechanically translated to HTML from third edition as revised 16 May 1997. Copyright © Graham Nelson 1993, 1994, 1995, 1996, 1997: all rights reserved.