tfe-1.0/area/
tfe-1.0/files/
tfe-1.0/logs/
tfe-1.0/logs/immortal/
tfe-1.0/logs/mob/
tfe-1.0/logs/object/
tfe-1.0/logs/player/
tfe-1.0/logs/room/
tfe-1.0/notes/clans/
tfe-1.0/player/
tfe-1.0/prev/
tfe-1.0/prev/area/
tfe-1.0/prev/player/
tfe-1.0/prev/rooms/
tfe-1.0/rooms/
tfe-1.0/src-gc/
tfe-1.0/src-msvc/
tfe-1.0/src-unix/
tfe-1.0/www/
tfe-1.0/www/html/
extern player_array   player_list;
extern mob_array      mob_list;


/*
 *   CREATURE CLASS AND DERIVED SUB-CLASSES
 */


class Char_Data : public Thing_Data
{
 public: 
  char_data*     next_on_obj;
  char_data*       next_list;
  char_data*           mount;
  char_data*           rider;
  char_data*           reply;
  char_data*        fighting;
  descr_data*          descr;
  species_data*      species;

  event_data          active;
  command_queue    cmd_queue;

  char_data*          leader;
  char_array       followers;  
  char_array         seen_by;
  char_array        known_by;
  char_array      aggressive;
  exit_array      seen_exits;
  affect_array    leech_list;
  affect_array      affected;
  content_array      wearing;

  cast_data*            cast;
  reset_data*          reset;
  link_data*            link;
  pc_data*            pcdata;
  share_data*         shdata;
  enemy_data*          enemy;
  shop_data*           pShop;
  cast_data*         prepare;
  obj_data*          pos_obj;
  char*             pet_name;
  int                 played;
  int                  timer;

  room_data*     was_in_room;
  room_data*         in_room;

  time_t               logon;
  time_t           save_time; 

  int                    hit;
  int               base_hit;
  int                   mana;
  int              base_mana;
  int                   move;
  int              base_move;

  int                mod_hit;
  int               mod_move;
  int               mod_mana;
  int                max_hit;
  int               max_move;
  int               max_mana;

  int                mod_str;
  int                mod_int;
  int                mod_wis;
  int                mod_dex;
  int                mod_con;

  int              mod_resist  [ MAX_RESIST ];
  int               mod_armor;
  int             affected_by  [ AFFECT_INTS ];
  int                  status;
  int                     exp;
  int                 hitroll;
  int                 damroll;
  int              move_regen;
  int              mana_regen;
  int               hit_regen;
  int           room_position;
  int                     sex;

  Char_Data( );
  virtual ~Char_Data( );

  /* BASE */

  int   Type     ( )  { return CHAR_DATA; }
  void  Extract  ( );  

  /* NAME/KEYWORDS */

  const char*   Keywords        ( char_data* );
  const char*   Name            ( char_data* = NULL, int = 1, bool = FALSE );
  const char*   Seen_Name       ( char_data*, int = 1, bool = FALSE );
  const char*   Long_Name       ( char_data*, int = 1 );
  const char*   Show            ( char_data*, int = 1 );
  const char*   real_name       ( );  
  const char*   Location        ( content_array* = NULL );
  void          Look_At         ( char_data* );

  const char*   Him_Her         ( char_data* = NULL );
  const char*   His_Her         ( char_data* = NULL );
  const char*   He_She          ( char_data* = NULL );

  /* PROPERTIES */

  bool Can_See    ( bool = FALSE );
  bool Seen       ( char_data* );

  bool look_same  ( thing_data*, thing_data* );
  bool look_same  ( obj_data*, obj_data* );
  bool look_same  ( char_data*, char_data* );

  bool         Is_Valid        ( )  { return valid == CHAR_DATA; }
  bool         In_Game         ( );
  void         To              ( content_array* );
  void         To              ( thing_data* );
  thing_data*  From            ( int = 1 );

  virtual int  Size             ( )  = 0;
          int  Weight           ( int = -1 );
          int  Empty_Weight     ( int = -1 );
          int  Capacity         ( );
          int  Empty_Capacity   ( );

  /* AFFECTS */

  bool Sees_Invis    ( );
  bool Sees_Hidden   ( );
  bool detects_good  ( );
  bool detects_evil  ( );

  /* STATS */

  int            Strength        ( );
  int            Intelligence    ( );
  int            Wisdom          ( );
  int            Dexterity       ( );
  int            Constitution    ( );

  float          Hitroll         ( obj_data* );
  float          Damroll         ( obj_data* );
  int            Hit_Regen       ( );
  int            Move_Regen      ( );
  int            Mana_Regen      ( );

  virtual float  Mean_Hp         ( )  = 0;
  virtual float  Mean_Mana       ( )  = 0; 
  virtual float  Mean_Move       ( )  = 0;

  /* OTHER */

  bool           can_float              ( );
  bool           can_swim               ( );
  bool           can_breath_underwater  ( );
  bool           can_fly                ( );

  bool           Can_Move               ( exit_data* );
  bool           can_buy                ( obj_data*, char_data* );
  bool           can_edit               ( obj_clss_data* );
  bool           can_edit               ( species_data* );
  bool           check_skill            ( int );
  bool           save_vs_poison         ( int ); 

          bool           Recognizes      ( char_data* );
          bool           Befriended      ( char_data* ); 
          bool           Befriended      ( pfile_data* ); 
          bool           Ignoring        ( char_data* );
          bool           Filtering       ( char_data* );
  virtual bool           Accept_Msg      ( char_data* )  = 0;

  obj_data*      Wearing         ( int, int = -1 );

  int            Save_Magic      ( );
  int            Save_Fire       ( );
  int            Save_Cold       ( );
  int            Save_Mind       ( );
  int            Save_Shock      ( );
  int            Save_Acid       ( );
  int            Save_Poison     ( );

  int            can_carry_n     ( );
  int            can_carry_w     ( );
  int            get_burden      ( );
  int            get_skill       ( int );
  time_t         time_played     ( );

  void          improve_skill   ( int );
};


/*
 *   PLAYER DATA
 */


class Reput_Data
{
 public:
  int      nation  [ MAX_NATION ];  
  int   alignment  [ MAX_ALIGNMENT ]; 
  int       blood;
  int        gold; 
  int       magic; 

  Reput_Data( ) {
    blood = 0;
    gold  = 0;
    magic = 0;

    vzero( nation,    MAX_NATION );
    vzero( alignment, MAX_ALIGNMENT ); 
    }
};

 
class Player_Data : public Char_Data
{
 public:
  char_data*     switched;
  char_data*     familiar;
  int            base_age;
  int                bank;
  int              prayer;
  int          gossip_pts;
  int             whistle;
  int            timezone;
  int            wizinvis;
  int           noteboard;
  note_data*    note_edit;
  int               iflag  [ 2 ];

  alias_array       alias;
  content_array    locker;
  content_array    junked;
  obj_array     save_list;
  reput_data   reputation;

  tell_data*        chant;
  tell_data*          say;
  tell_data*         yell;
  tell_data*        shout;
  tell_data*         tell;
  tell_data*        gtell;
  tell_data*         chat;
  tell_data*       gossip;
  tell_data*        ctell;
  tell_data*      whisper;
  tell_data*        atalk;
  tell_data*           to;

  Player_Data( char* );
  virtual ~Player_Data( );

  int           Type            ( )  { return PLAYER_DATA; }
  bool          Is_Valid        ( )  { return valid == PLAYER_DATA; }

  int           Age             ( );
  const char*   Location        ( content_array* = NULL );
  int           Size            ( ); 
  int           Light           ( int ); 

  float          Mean_Hp         ( );
  float          Mean_Mana       ( ); 
  float          Mean_Move       ( );

  bool           Accept_Msg      ( char_data* );
};


/*
 *   WIZARD CLASS
 */


class Wizard_Data : public player_data
{
 public:
  action_data*     action_edit;
  player_data*     player_edit;
  exit_data*         exit_edit;
  extra_data*       adata_edit;
  extra_data*      mpdata_edit;
  extra_data*      opdata_edit;
  extra_data*      oextra_edit;
  extra_data*        room_edit;
  mprog_data*       mprog_edit;
  obj_clss_data*      obj_edit;
  oprog_data*       oprog_edit;
  quest_data*       quest_edit;
  species_data*       mob_edit;
  int              custom_edit;
  int              rtable_edit;
  int                list_edit;
  int               table_edit  [ 2 ];

  int               permission  [ 2 ];
  int                   office;

  char*                 bamfin;
  char*                bamfout;
  char*            level_title;

  tell_data*        build_chan;
  tell_data*          imm_talk;
  tell_data*          god_talk;
  tell_data*            avatar;

  Wizard_Data( char* );
  virtual ~Wizard_Data( );

  virtual int   Type            ( )  { return WIZARD_DATA; }
  bool          Is_Valid        ( )  { return valid == WIZARD_DATA; }

  bool          See_Account     ( pfile_data* );
};


/*
 *   MOB CLASS
 */


class Mob_Data : public Char_Data
{
 public:
  mob_data*          prev;
  trainer_data*  pTrainer;

  Mob_Data( ) {
    record_new( sizeof( Mob_Data ), MEM_MOBS );
    pTrainer  = NULL;
    valid     = MOB_DATA;
    mob_list += this;
    }

  ~Mob_Data( ) {
    record_delete( sizeof( Mob_Data ), MEM_MOBS );
    mob_list -= this;
    }

  int    Type          ( )  { return MOB_DATA; }
  bool   Is_Valid      ( )  { return valid == MOB_DATA; }
  int    Size          ( );
  int    Light         ( int ); 

  float          Mean_Hp         ( );
  float          Mean_Mana       ( ); 
  float          Mean_Move       ( );

  bool           Accept_Msg      ( char_data* );
};


/*
 *   DESCRIPTION DATA
 */


class Descr_Data
{
 public:
  char*           name;
  char*       keywords;
  char*       singular;
  char*         long_s;
  char*          adj_s;
  char*       prefix_s;
  char*         plural;
  char*         long_p;
  char*          adj_p;
  char*       prefix_p;
  char*       complete;

  Descr_Data( );
  ~Descr_Data( );
};


/*
 *   SHARE_DATA
 */


class Share_Data
{
 public:
  int       strength;
  int   intelligence;
  int         wisdom;
  int      dexterity;
  int   constitution;
  int          level;
  int      alignment;
  int           race;
  int          kills;
  int         deaths;
  int           fame;
  int         resist  [ MAX_RESIST ];
  int          skill  [ MAX_SKILL ];

  Share_Data( );
  ~Share_Data( );
}; 


/*
 *   SUPPORT FUNCTIONS
 */


inline time_t char_data :: time_played( )
{
  return current_time-logon+played;
};