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/
#include "define.h"
#include "struct.h"


/*
 *   ENEMY_DATA CLASS
 */


class Enemy_Data
{
 public:
  enemy_data*   next;
  pfile_data*   pfile;
  int           damage;
  bool          attacker;

  Enemy_Data( );
  ~Enemy_Data( );
}; 


Enemy_Data :: Enemy_Data( )
{
  record_new( sizeof( enemy_data ), MEM_ENEMY );

  damage = 0;

  return;
};


Enemy_Data :: ~Enemy_Data( )
{
  record_delete( sizeof( enemy_data ), MEM_ENEMY );

  return;
};


/*
 *   GENERIC ROUTINES
 */


bool is_enemy( char_data* ch, char_data* victim )
{
  enemy_data* enemy;

  for( enemy = ch->enemy; enemy != NULL; enemy = enemy->next )
    if( enemy->pfile == victim->pcdata->pfile )
      return TRUE;

  return FALSE;
}


int damage_done( char_data* ch, char_data* victim )
{
  enemy_data* enemy;

  for( enemy = victim->enemy; enemy != NULL; enemy = enemy->next )
    if( enemy->pfile == ch->pcdata->pfile )
      return enemy->damage;
  
  return -1;
}


/*  
 *   DELETION ROUTINES
 */


void clear_enemies( char_data* victim )
{
  mob_data*       ch;
  enemy_data*  enemy;

  if( victim->pcdata == NULL )
    return;

  for( int i = 0; i < mob_list; i++ ) {
    ch = mob_list[i];
    for( enemy = ch->enemy; enemy != NULL; enemy = enemy->next ) 
      if( enemy->pfile == victim->pcdata->pfile ) {
        remove( ch->enemy, enemy );
        break;
        }
    }

  return;
}


void extract( enemy_data*& list )
{
  enemy_data* enemy;

  for( ; list != NULL; ) {
    enemy = list;
    list  = list->next;

    delete enemy;
    }

  return;
}


/*
 *   CREATION ROUTINES
 */


void add_enemy( char_data* ch, char_data* victim )
{
  enemy_data* enemy;

  if( victim->species == NULL || ch->pcdata == NULL )
    return;

  for( enemy = victim->enemy; enemy != NULL; enemy = enemy->next )
    if( enemy->pfile == ch->pcdata->pfile )
      return;

  enemy          = new enemy_data;
  enemy->pfile   = ch->pcdata->pfile;
  enemy->next    = victim->enemy;
  victim->enemy  = enemy;

  return;
}  


void share_enemies( char_data* ch1, char_data* ch2 )
{
  enemy_data*  e1;
  enemy_data*  e2;

  if( !is_set( &ch2->species->act_flags, ACT_ASSIST_GROUP ) )
    return; 

  for( e1 = ch1->enemy; e1 != NULL; e1 = e1->next ) {
    for( e2 = ch2->enemy; ; e2 = e2->next ) {
      if( e2 == NULL ) {
        e2          = new enemy_data;
        e2->pfile   = e1->pfile;
        e2->next    = ch2->enemy;
        ch2->enemy  = e2;
        break;
        }
      if( e2->pfile == e1->pfile )
        break;
      } 
    }

  return;
}


void record_damage( char_data* victim, char_data* ch, int damage )
{
  enemy_data* enemy;

  if( victim->species == NULL || ch == NULL
    || ch->pcdata == NULL )
    return;
 
  for( enemy = victim->enemy; enemy != NULL; enemy = enemy->next )
    if( enemy->pfile == ch->pcdata->pfile ) {
      enemy->damage += damage;
      return;
      } 

  enemy          = new enemy_data;
  enemy->pfile   = ch->pcdata->pfile;
  enemy->damage  = damage;
  enemy->next    = victim->enemy;
  victim->enemy  = enemy;

  return;
}