! 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;