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


/*
 *   ANIMATE DEAD SPELLS
 */


bool can_animate( char_data* ch, species_data* species,
  species_data* undead )
{
  if( species->shdata->race == RACE_UNDEAD ) {
    send( ch, "That corpse has died twice already - it is too destroyed to\
 be animated\n\ragain.\n\r" );
    return FALSE;
    }

  if( undead == NULL ) {   
    send( ch, "You fail to animate the corpse as it does not seem to be from\
 a species that\n\ryou can resurrect.\n\r" );
    return FALSE;
    }
  
  if( undead->shdata->level > ch->shdata->level/2 ) {
    send( ch, "You are not powerful enough to control the spirit of that\
 creature.\n\r" );
    return FALSE;
    }

  if( undead->shdata->level + pet_levels( ch ) > 
      ch->shdata->level ) {
    send( ch, "Controlling that spirit in conjunction with the undead you\
 have already\n\rraised is beyond your abilities.\n\r" );
    return FALSE;
    }

  return TRUE;
}


bool spell_animate_dead( char_data* ch, char_data*, void* vo,
  int level, int )
{
  species_data*    zombie;
  species_data*   species;
  char_data*      remains;
  obj_data*        corpse  = (obj_data*) vo;

  if(  null_caster( ch,     SPELL_ANIMATE_DEAD )
    || null_corpse( corpse, SPELL_ANIMATE_DEAD ) )
    return TRUE;

  if( ( species = get_species( corpse->value[1] ) ) == NULL ) {
    bug( "Animate Dead: illegal corpse species." );
    return TRUE;
    }

  if( !can_animate( ch, species, zombie = get_species( species->zombie ) ) )
    return TRUE;

  remains = create_mobile( zombie );
  corpse->Extract( 1 );

  set_bit( &remains->status, STAT_PET );
  set_bit( &remains->status, STAT_TAMED );
  remains->To( ch->array );
  add_follower( remains, ch, FALSE );

  send( ch, "%s slowly stands up and starts to follow you.\n\r", remains );
  fsend_seen( remains, "%s slowly stands up and starts to follow %s.",
    remains, ch );

  return TRUE;
}


bool spell_greater_animation( char_data* ch, char_data*, void* vo,
  int level, int )
{
  species_data*    species;
  species_data*   skeleton; 
  char_data*       remains;
  obj_data*         corpse  = (obj_data*) vo;

  if(  null_caster( ch,     SPELL_GREATER_ANIMATION )
    || null_corpse( corpse, SPELL_GREATER_ANIMATION ) )
    return TRUE;

  if( ( species = get_species( corpse->value[1] ) ) == NULL ) {
    bug( "Greater Animation: Corpse of unknown species." );
    return TRUE;
    }

  if( !is_set( &species->act_flags, ACT_HAS_SKELETON ) ) {
    fsend( ch, "%s did not contain a skeleton and so trying to animate it\
 was doomed to failure.  All that remains on the ground is a few ashes.",
      corpse );
    return TRUE;
    }

  if( !can_animate( ch, species,
    skeleton = get_species( species->skeleton ) ) )
    return TRUE;

  if( skeleton->shdata->level > ch->shdata->level-pet_levels( ch ) ) {
    send( ch, "You can not control that many pets.\n\r" );
    return TRUE;
  }

  remains = create_mobile( skeleton );
  corpse->Extract( 1 );

  set_bit( &remains->status, STAT_PET );
  set_bit( &remains->status, STAT_TAMED );
  remains->To( ch->array );
  add_follower( remains, ch );

  fsend( ch, "The skeleton of %s slowly rises from the ground and starts\
 to follow you.", species->descr->name );
  fsend_seen( remains, "The skeleton of %s slowly rises from the ground\
 and starts to follow %s.", species->descr->name, ch );

  return TRUE;
}


/*
 *   BANISHMENT SPELLS 
 */


bool spell_turn_undead( char_data* ch, char_data* victim, void*,
  int level, int )
{
  if( victim->shdata->race != RACE_UNDEAD ) 
    return TRUE;
  
  damage_physical( victim, ch, spell_damage( SPELL_TURN_UNDEAD, level ),
    "*the enchantment" );

  return TRUE;
}


bool spell_banishment( char_data* ch, char_data* victim, void*,
  int level, int )
{
  if( victim->shdata->race != RACE_UNDEAD ) 
    return TRUE;
  
  damage_physical( victim, ch, spell_damage( SPELL_BANISHMENT, level ),
    "*the enchantment" );

  return TRUE;
}