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


void    disarm          ( char_data*, char_data* );


/*
 *   FIGHT SUB_ROUTINES
 */


void check_killer( char_data* ch, char_data* victim )
{
  if( ch->species != NULL || !is_enemy( victim, ch ) ) 
    return;
    
  add_enemy( victim, ch );
}


bool is_entangled( char_data* ch, const char* verb )
{
  if( !is_set( ch->affected_by, AFF_ENTANGLED ) )
    return FALSE;

  send( ch, "You are too entangled to %s anything.\n\r", verb );

  return TRUE;
}


/*
 *   SUPPORT SUBROUTINES
 */


char_data* get_victim( char_data* ch, char* argument, char* msg )
{
  char_data*    victim;
  char_data*  opponent;

  opponent = ch->fighting;

  if( *argument == '\0' ) {
    if( opponent == NULL ) {
      if( msg != empty_string )
        send( msg, ch );
      return NULL;
      }
    return opponent;
    }

  if( ( victim = one_character( ch, argument, empty_string, ch->array ) ) == NULL ) {
    if( msg != empty_string )
      send( ch, "They aren't here.\n\r" );
    return NULL;
    }

  if( opponent != NULL && opponent != victim ) {
    send( ch, "You are already fighting someone else.\n\r" );
    return NULL;
    }

  return victim;
}


/*
 *   DO_KILL FUNCTION
 */
    

void do_kill( char_data* ch, char* argument )
{
  char_data*    victim;
//  char_data*  opponent;

  if( ( victim = one_character( ch, argument, "kill",
    ch->array ) ) == NULL )
    return;

  if( victim == ch ) {
    send( ch, "Typing quit is easier.\n\r" );
    return;
    }

  if( ch->mount != NULL && ch->Wearing( WEAR_HELD_R ) == NULL ) {
    send( ch, "You can't attack without a weapon while mounted.\n\r" );
    return;
    }

  if( ch->fighting == victim ) {
    send( ch, "You are already attacking %s!\n\r", victim );
    return;
    }

  if( !can_kill( ch, victim ) )
    return;

  check_killer( ch, victim );
  ch->fighting = victim;
  react_attack( ch, victim );

  remove_bit( &ch->status, STAT_WIMPY );

  fight_round( ch );
}


/*
 *   DISARM
 */


void do_disarm( char_data* ch, char* )
{
  char_data*    victim;
  obj_data*        obj;
//  int          percent;

  if( is_confused_pet( ch ) )
    return;

  if( ch->pcdata != NULL 
    && ch->shdata->skill[ SKILL_DISARM ] == UNLEARNT ) {
    send( ch, "You don't know how to disarm opponents.\n\r" );
    return;
    }

  if( ch->Wearing( WEAR_HELD_R ) == NULL ) {
    send( ch, "You must wield a weapon to disarm.\n\r" );
    return;
    }

  if( ( victim = ch->fighting ) == NULL ) {
    send( "You aren't fighting anyone.\n\r", ch );
    return;
    }

  if( ( obj = victim->Wearing( WEAR_HELD_R ) ) == NULL ) {
    send( "Your opponent is not wielding a weapon.\n\r", ch );
    return;
    }

  send( ch, "Command disabled.\n\r" );

  return;
}


void disarm( char_data* ch, char_data* victim )
{
  /*
  obj_data* obj;

  if( ( obj = victim->Wearing( WEAR_HELD_R ) ) == NULL )
    return;

  if( is_set( obj->pIndexData->extra_flags, OFLAG_NO_DISARM ) ) { 
    send( ch, "The weapon %s is wielding is impossible to disarm.\n\r",
      victim->Name( ch ) );
    return;
    }

  percent = number_range( 0, 100 )+victim->shdata->level-ch->shdata->level;
  if( IS_NPC(ch) || percent < ch->shdata->skill[ SKILL_DISARM ]*2/3 )
    disarm( ch, victim );
  else
    send( ch, "You failed.\n\r" );
 
  if( get_eq_char( ch, WEAR_HELD_R ) == NULL && number_range( 0, 1 ) == 0 )
    return;


  send( victim, "+++ %s disarms you! +++\n\r", ch );
  send( ch, "You disarm %s!\n\r", victim );
  send( *victim->array, "%s disarms %s!\n\r", ch, victim );

  obj = obj_from_char( obj, 1 );

  if( victim->species != NULL ) {
    obj_to_char( obj, victim );
    }
  else {
    obj_to_room( obj, victim->in_room );
    }
*/

  return;
}


/*
 *   KICK, PUNCH, BITE ROUTINES
 */


void do_punch( char_data* ch, char* argument )
{
  char_data*     victim;

  if(  is_confused_pet( ch )
    || !is_humanoid( ch )
    || is_mounted( ch )
    || is_entangled( ch, "punch" ) ) 
    return;

  if( ( victim = get_victim( ch, argument, "Punch who?\n\r" ) ) == NULL )
    return;

  if( victim == ch ) {
    send( ch, "Punching yourself is pointless.\n\r" );
    return;
    }

  if( ch->pcdata != NULL && ch->shdata->skill[ SKILL_PUNCH ] == UNLEARNT ) {
    send( ch, "You are untrained in the art of punching.\n\r" );
    return;
    }

  if( !can_kill( ch, victim ) )
    return;

  check_killer( ch, victim );

  ch->improve_skill( SKILL_PUNCH );

  attack( ch, victim, "punch", NULL, roll_dice( 1,4 ), 0 );

  react_attack( ch, victim );
  add_queue( &ch->active, 20 );

  return;
}


void do_bite( char_data* ch, char* argument )
{
  char_data*     victim;

  if(  is_confused_pet( ch )
    || is_mounted( ch )
    || is_entangled( ch, "bite" ) ) 
    return;

  if( ( victim = get_victim( ch, argument, "Bite who?\n\r" ) ) == NULL )
    return;

  if( victim == ch ) {
    send( ch, "Biting yourself is pointless.\n\r" );
    return;
    }

  if(  ch->shdata->race != RACE_LIZARD
    && ch->shdata->race != RACE_TROLL
    && ch->shdata->race != RACE_GOBLIN ) {
    send( ch, "Your teeth are not long or sharp enough for biting to be an\
 effective\n\rattack.\n\r" );
    return;
    }

  if( !can_kill( ch, victim ) )
    return;

  check_killer( ch, victim );

  attack( ch, victim, "bite", NULL, roll_dice( 3,8 ), 0 );

  react_attack( ch, victim );
  add_queue( &ch->active, 20 );

  return;
}


/*
 *   SPIN KICK ROUTINE
 */



void do_spin_kick( char_data* ch, char* )
{
  char_data*       rch;
//  char_data*  rch_next;
  bool           found  = FALSE;

  send( "You don't crash the mud.\n\r", ch );
  return;
  
  if( is_confused_pet( ch ) || is_mounted( ch )
    || !is_humanoid( ch ) )
    return;

  if( ch->pcdata == NULL
    || ch->shdata->skill[SKILL_SPIN_KICK] == UNLEARNT ) {
    send( "You are untrained in that skill.\n\r", ch );
    return;
    }
  
  ch->improve_skill( SKILL_SPIN_KICK );

  for( int i = *ch->array-1; i >=0; i++ ) {
    if( ( rch = character( ch->array->list[i] ) ) != NULL
      && ( rch->fighting == ch || ch->fighting == rch ) ) {
      if( !found ) {
        found = TRUE;
        send( ch, "You leap in the air, spinning rapidly.\n\r" );
        send_seen( ch,
          "%s leaps into the air, becoming a deadly blur.", ch );
        }
      attack( ch, rch, "spin kick", NULL, 
        roll_dice( 5, 10+ch->shdata->skill[SKILL_SPIN_KICK] ), 0 );
      }
    }

  if( !found )
    send( "You are not fighting anyone!\n\r", ch );

  remove_bit( &ch->status, STAT_WIMPY );
  remove_bit( &ch->status, STAT_LEAPING );

  set_delay( ch, 25 );

  return;
}


void do_melee( char_data* ch, char* )
{
//  char_data*       rch;
//  char_data*  rch_next;
//  bool           found  = FALSE;
  /*
  if( is_confused_pet( ch ) || is_mounted( ch )
    || !is_humanoid( ch ) )
    return;

  if( ch->pcdata == NULL
    || ch->shdata->skill[SKILL_MELEE] == UNLEARNT ) {
    send( ch, "You are untrained in that skill.\n\r" );
    return;
    }
  
  ch->improve_skill( SKILL_MELEE );

  for( rch = ch->in_room->people; rch != NULL; rch = rch_next ) {
    rch_next = rch->next_in_room;
    if( rch->fighting == ch || ch->fighting == rch ) {
      if( !found ) {
        found = TRUE;
        send( ch, "You spin about, striking at all your foes!!\n\r" );
        send_seen( ch, "%s spins, striking out at all %s foes!!\n\r",  
          ch, ch->Him_Her( ) ); 
        }
      attack( ch, rch, "MELEE", NULL, 
        roll_dice( 5, 8+ch->shdata->skill[SKILL_MELEE] ), 0 );
      }
    }

  if( !found )
    send( "You are not fighting anyone!\n\r", ch );

  remove_bit( &ch->status, STAT_WIMPY );
  remove_bit( &ch->status, STAT_LEAPING );

  set_delay( ch, 30 );
  */
  return;
}