! EasyDoors.h (Easy handling of doors)
! copyright (c) 2000-2001 Andrew MacKinnon
! May be distributed freely, proprietary incorporation allowed
! May be embedded in any game file created with Inform
! Credit for use is appreciated but not required
!
! Version 3.0 -- 26 May 2001
!
! Example:
!
! Room Bedroom "Bedroom"
! with description "This is a bedroom.",
! n_to bedroom_door;
!
! Room Hall "Hall"
! with description "This is a hall.",
! s_to bedroom_door;
!
! Doorway bedroom_door "bedroom door"
! with name 'door',
! side1_to Bedroom, ! Room on side 1
! side1_dir s_to, ! Direction to get there (s_to, not s_obj)
! side2_to Hall, ! ditto for side 2
! side2_dir n_to, ! direction
! found_in Bedroom Hall, ! required to show which two rooms the door is in
! ! OPTIONAL BELOW
! isconcealed {0 | 1}, ! 0-as a seperate paragraph in room desc
! ! 1-must add to room desc
! ! (default 1)
! autoopen {0 | 1} ! 0-must open explicitly
! ! 1-automaticaly opens when go through when not locked
! ! (default 1)
! opendesc "open", ! open description (default "open")
! closeddesc "closed"; ! closed description (default "closed")
! ! METHODS
!
! statedesc() ! prints state (open or closed) for use in room descriptions,
! ! recommended in room description bodies
! ! REMEMBER to set lookmode=2 in Initialise() or this
! ! is a bad idea
!
!
! Note that the class Room is created, this just gives the room light by default;
! I find it tons easier with such a class distinguishing rooms and objects.
!
! DISACTIVATE THIS BY DEFINING "NO_ROOM_CLASS"
#IFNDEF NO_ROOM_CLASS;
Class Room
has light;
#ENDIF;
Class Doorway
with door_to
[; if (location==self.side1_to) return self.side2_to; return self.side1_to;
],
door_dir
[; if (location==self.side1_to) return self.side2_dir; return self.side1_dir;
],
side1_to 0,
side2_to 0,
side1_dir 0,
side2_dir 0,
opendesc "open",
closeddesc "closed",
statedesc [; if (self has open) print (string) self.opendesc;
if (self hasnt open) print (string) self.closeddesc; ],
isconcealed 1, ! concealed by default
describe
[; if (self.isconcealed==1) rtrue;
print "^";
print (The) self, " is "; self.statedesc(); ".";
],
autoopen 1, ! automaticaly open by default
before
[; Enter: self.automat();
],
react_before
[; Go: if (noun notin compass) rfalse;
if ((noun.door_dir==self.side1_dir && location==self.side2_to)
|| (noun.door_dir==self.side2_dir && location==self.side1_to)
|| (location.(noun.door_dir)==self))
self.automat();
],
automat
[; if (self.autoopen==0) return;
if (self has locked) return; ! can't open if locked
if (self has open) return; ! nothing to do if open
if (self hasnt open && self hasnt locked)
{print "(opening ", (the) self, ")^"; give self open;}
],
has door static openable;