!==============================================================================!
! SMARTCANTGO.H
! David Wagner
! Version 3
! 8-Nov-1995
! Revisited for Inform 6 by Roger Firth
! Version 5
! 3-Feb-1999
! All rights given away.
!
! Defines a routine that can be used for the cant_go property of rooms to
! helpfully list the exits, instead of saying just "You can't go that way."
! Store the code in a file "smartcantgo.h" and include it into games with the
! following line (placed anywhere after the standard Include "Parser";):
!
! Include "smartcantgo";
!
! Once the routine has been Included, the following code:
!
! Object Crystal_Cave "Crystal Cave"
! with s_to Narrow_Passage,
! cant_go [; SmartCantGo(); ]
! ...;
!
! will produce the message "You can go only south." if the player goes
! the wrong way.
!
! Rather than explicitly add the cant_go routine to each room, you can
! add it to a Room class from which your actual rooms are derived:
!
! Class Room
! with cant_go [; SmartCantGo(); ],
! has light;
!
! In theory, you can instead change the default behaviour of the cant_go
! routine by adding the following line to your Initialise routine, but in
! practise there's a library bug/feature which prevents this working properly:
!
! ChangeDefault(cant_go, SmartCantGo);
!
!==============================================================================!
! NOTES
!
! 1. If the room is dark, it prints just "You can't go that way."
! How could the player know where the exits are?
!
! 2. This routine ignores direction properties which point to concealed
! doors or are strings. Therefore this code won't work quite as intended
! in the following room:
!
! Object Library "Library"
! with description
! "A small wood-panelled library. An open window to the west
! affords a stunning view of the Tuscan coastline.",
! w_to
! "Ouch! You discover that the ~window~ is really
! an incredibly lifelike mural painted on the wall.",
! ...;
!
! 3. This routine does include direction properties that are routines
! on the assumption that the routine will return something sensible.
! If your routine returns a concealed door, you will have to do
! something different.
!
! 4. This routine is adequate for the rare occasions when the player types
! the wrong direction. One might be tempted to use this routine to
! simplify room descriptions, as in:
!
! Object Boring_Room "Boring Room"
! with description [;
! print "A small room with white walls. ";
! SmartCantGo();
! ],
! ...;
!
! Don't do this! Part of the interest of a room is a good description
! of the exits.
!
!==============================================================================!
[ SmartCantGo room i dest desttype ndir;
if (location == thedark) "You can't go that way.";
! Find what room the player is in.
room = location;
while (parent(room)) room = parent(room);
! Count the number of exits -- if a direction property is a string or
! a concealed door, don't count it; if it is a routine, count it.
ndir = 0;
objectloop (i in compass) {
dest = room.(i.door_dir);
if (dest) {
desttype = ZRegion(dest);
if ((desttype ~= 3) &&
(desttype == 2 || dest hasnt door || dest hasnt concealed))
ndir++;
}
}
if (ndir == 0) "There are no exits.";
! Print the exits.
print "You can go only ";
objectloop (i in compass) {
dest = room.(i.door_dir);
if (dest) {
desttype = ZRegion(dest);
if ((desttype ~= 3) &&
(desttype == 2 || dest hasnt door || dest hasnt concealed)) {
PrintDirectionName(i);
switch (--ndir) {
0: ".";
1: print " or ";
default: print ", ";
}
}
}
}
];