/
ScryMUD/mud/
ScryMUD/mud/grrmud/Boards/
ScryMUD/mud/grrmud/Help/
ScryMUD/mud/grrmud/Pfiles/
ScryMUD/mud/grrmud/PlayerSacks/
ScryMUD/mud/grrmud/PlayerShops/
ScryMUD/mud/grrmud/help_filter/
ScryMUD/mud/hegemon/
ScryMUD/mud/hegemon/data/
ScryMUD/mud/hegemon/data/help/battle/
ScryMUD/mud/hegemon/data/help/client/
ScryMUD/mud/hegemon/data/help/communications/
ScryMUD/mud/hegemon/data/help/skills/
ScryMUD/mud/hegemon/data/help/spells/
ScryMUD/mud/include/
ScryMUD/mud/lib/
ScryMUD/mud/lib/bitfield/
ScryMUD/mud/lib/log/
ScryMUD/mud/lib/string2/
// $Id: door.h,v 1.7.2.5 2000/05/03 01:32:07 justin Exp $
// $Revision: 1.7.2.5 $  $Author: justin $ $Date: 2000/05/03 01:32:07 $

//
//ScryMUD Server Code
//Copyright (C) 1998  Ben Greear
//
//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU General Public License
//as published by the Free Software Foundation; either version 2
//of the License, or (at your option) any later version.
//
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//GNU General Public License for more details.
//
//You should have received a copy of the GNU General Public License
//along with this program; if not, write to the Free Software
//Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
//
// To contact the Author, Ben Greear:  greear@cyberhighway.net, (preferred)
//                                     greearb@agcs.com
//

 
///**************************  door data   ********************///

#ifndef GRRMUD_DOOR_INCLUDE_H
#define GRRMUD_DOOR_INCLUDE_H


#include <bitfield.h>
#include <list2.h>
#include <string2.h>
#include "classes.h"
#include "room.h"

class room;

class door_data {
protected:
   static int _cnt;

public:
   List<String*> names; //the direction e, w... will be first 
   String long_desc;

   int vis_bit;
   int door_num; // the vnum of the door
   int token_num;
   int key_num;
   int in_zone; //owner zone

   // When modifying this, modify DOOR_DATA_FLAGS_NAMES in const.cc
   bitfield door_data_flags;
              // 0 open exit, basically no door
              // 1 is_mag_lockable, 2 is_closed, 3 is_locked, 4 is_pckabl,
              // 5 is_lockable, 6 mag_locked (spell only can open it)
              // 7 is_destructable, 8 is_closeable, 9 is_flippable
              // 10 in_use, 11 is_unopenable (by players, auto only)
              // 12 is_vehicle_exit, 13 is_secret, 14 is_blocked,
              // 15 !complete 16 secret_when_open_too, 17 consume_key
              // 18 !passdoor

   int isOpen() const { return !(door_data_flags.get(2)); }
   int canClose() const { return canOpen(); }
   int isVehicleExit() const { return door_data_flags.get(12); }
   int canOpen() const { return (!door_data_flags.get(11) 
                                  && door_data_flags.get(8)); }
   int canLock() const { return door_data_flags.get(5); }

   int isClosed() const { return door_data_flags.get(2); }
   int isLocked() const { return door_data_flags.get(3); }
   int isMagLocked() const { return door_data_flags.get(6); }
   int isSecret() const { 
      return (door_data_flags.get(13) || door_data_flags.get(16)); }
   int isInUse() const { return door_data_flags.get(10); }
   int isInZone(int zn) { return zn == in_zone; }
   int isNotComplete() const { return door_data_flags.get(15); }
   int isSecretWhenOpen()  const { return door_data_flags.get(16); }
   int consumesKey() const { return door_data_flags.get(17); }
   int isNoPassdoor() const { return door_data_flags.get(18); }

   void setComplete() { door_data_flags.turn_off(15); }
   void setNotComplete() { door_data_flags.turn_on(15); }
   void setIdNum(int i) { door_num = i; }
   int getIdNum() const { return door_num; }

   int getZoneNum() const { return in_zone; }
   int getKeyNum() const { return key_num; }
   int getTokenNum() const { return token_num; }

   door_data (); //default constructor
   door_data(const door_data& source);  //copy constructor
   door_data& operator=(const door_data& source);
   ~door_data ();

   void close() { door_data_flags.turn_on(2); }
   void open() { door_data_flags.turn_off(2); }
   void lock() { close(); door_data_flags.turn_on(3); }
   void unlock() { door_data_flags.turn_off(3); }

   void Clear();
   void dbRead(int door_num);
   void fileRead(ifstream& da_file);
   void Write(ofstream& da_file);
   static int getInstanceCount() { return _cnt; }
}; //door_data

 
 
 
//*********************** door **************************//
 
class critter;
 
class door {
protected:
   static int _cnt;

public:
   door_data* dr_data;  
   int destination;
   short distance;
   List<stat_spell_cell*> affected_by;
   critter* crit_blocking;
   int ticks_till_disolve; //for temp doors
   int in_room;
   
   door();
   door(const door& source); //copy constructor
   door& operator= (const door& source);
   ~door();

   void Clear();
   void Write(ofstream& da_file);
   void Read(ifstream& da_file);

   int getVisBit() const { if (dr_data) return dr_data->vis_bit; return 0; }
   int isOpen() const { return (dr_data && dr_data->isOpen()); }
   int isSecret() const { return dr_data && dr_data->isSecret(); }
   int isClosed() const { return dr_data && dr_data->isClosed(); }
   int canOpen() const { return dr_data && dr_data->canOpen(); }
   int isLocked() const { return dr_data && dr_data->isLocked(); }
   int isMagLocked() const { return dr_data && dr_data->isMagLocked(); }
   int isVehicleExit() const { return dr_data && dr_data->isVehicleExit(); }
   int canClose() const { return canOpen(); }
   int isSecretWhenOpen() const { return dr_data && dr_data->isSecretWhenOpen(); }
   int consumesKey() const { return dr_data && dr_data->consumesKey(); }
   int isNoPassdoor() const { return (dr_data && dr_data->isNoPassdoor()); }
   int getIdNum() const { if (dr_data) return dr_data->getIdNum(); return 0; }

   void lock() { if (dr_data) dr_data->lock(); }
   void unlock() { if (dr_data) dr_data->unlock(); }
   void open() { if (dr_data) dr_data->open(); }
   void close() { if (dr_data) dr_data->close(); }

   int getKeyNum() const {
      if (dr_data) 
         return dr_data->getKeyNum();
      return 0;
   }

   int getTokenNum() const {
      if (dr_data) 
         return dr_data->getTokenNum();
      return 0;
   }

   stat_spell_cell* isAffectedBy(int spell_num);

   room* getDestRoom();
   String* getDirection();

   ///******************  Static Functions ***************************///
   static door* findDoor(const List<door*> &lst, const int i_th,
                         const String* name, const int see_bit,
                         const room& rm, int& count_sofar);

   static door* findDoor(const List<door*> &lst, const int i_th,
                         const String* name, const int see_bit,
                         const room& rm);

   static door* findDoor(const List<door*>& lst, const int i_th,
                         const String* name, const int see_bit,
                         const int rm_vis_bit);

   static door* findDoor(const List<door*>& lst, const int i_th,
                         const String* name, const int see_bit,
                         const int rm_vis_bit, int& count_sofar);

   static door* findDoorByDest(const List<door*>& lst, int dest_room);

   static int getInstanceCount() { return _cnt; }
};//struct door   

#endif