eod/
eod/changes/
eod/log/
eod/player/
eod/player/backup/
eod/player/store/
#include <arpa/telnet.h>
#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
#include <netdb.h>
#include <netinet/in.h>
#include <pthread.h>
#include <signal.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/resource.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>
#include <sys/wait.h>
#include <crypt.h>
#include <assert.h>
#include "class.h"
#include "merc.h"
#include "arena.h"


void do_challenge( CHAR_DATA *ch, char *argument )
{
  CHAR_DATA *victim;
  char arg[MAX_INPUT_LENGTH];
  char buf[MAX_STRING_LENGTH];
  char buf2[MAX_STRING_LENGTH];
 
  argument = one_argument( argument, arg );

  if ( IS_NPC(ch) ) return;

  if ( arena != FIGHT_CLEAR )
  {
    stc("The arena is not ready for a fight at the moment.\n\r",ch);
    return;
  }

  if ( arg[0] == '\0' )
  {
    stc("Who do you want to challenge?\n\r",ch);
    return;
  }

  if ( ( victim = get_char_world( ch, arg ) ) == NULL )
  {
    stc("They aren't even on the mud.\n\r",ch);
    return;
  }                         

  if ( IS_NPC(victim) )
  {
    stc("Challenge a mobile? You're pathetic.\n\r",ch);
    return;
  }
 
  if ( victim == ch )
  {
    stc("Oh, kill yourself. Fun.\n\r",ch);
    return;
  }

  if ( ch->hit < ch->max_hit )
  {
    stc("You must be fully healed to use the arena.\n\r",ch);
    return;
  }

  if ( victim->hit < victim->max_hit )
  {
    stc("Your victim isn't fully healed.\n\r",ch);
    return;
  }

  if ( victim->level < 3 || ch->level < 3 )
  {
    stc("Only avatars may use the Arena.\n\r",ch);
    return;
  }

  if ( IS_SET(ch->flag2, AFF2_CHALLENGED)
       || IS_SET(ch->flag2, AFF2_CHALLENGER) )
  {
    stc("Uh.  You're already involved in an arena fight.\n\r",ch);
    return;
  }

  if ( IS_SET(victim->flag2, AFF2_CHALLENGED)
       || IS_SET(victim->flag2, AFF2_CHALLENGER) )
  {
    stc("They are already involved in an arena fight.\n\r",ch);
    return;
  }

  ch->challenged = victim;
  victim->challenged = ch;
  ch->arena_timer = 30;
  victim->arena_timer = 300;
  sprintf(buf,"%s has challenged %s to a death match.\n",ch->name,victim->name);
  do_info(ch,buf);
  sprintf( buf2,"#y%s #rhas challenged you.Type #yChalaccept #rto fight, or #yDecline #rto wuss out.\n", ch->name);
  stc(buf2,victim);
  SET_BIT(ch->flag2, AFF2_CHALLENGER);
  SET_BIT(victim->flag2, AFF2_CHALLENGED);
  arena = FIGHT_PRE;
  return;
}


void undo_arena( CHAR_DATA *ch )
{
  CHAR_DATA *victim;
  char name[MAX_STRING_LENGTH]; 
 
  if ( ch->challenged != NULL )
  {
    victim = ch->challenged;
    sprintf(name, "%s", victim->name);
    if ( ( victim = get_char_world( ch, name ) ) == NULL )
    {
      REMOVE_BIT(ch->flag2, AFF2_CHALLENGED);
      REMOVE_BIT(ch->flag2, AFF2_CHALLENGER);
      REMOVE_BIT(ch->flag2, AFF2_INARENA);
      ch->challenged = NULL;
    }
    else
    {
      REMOVE_BIT(ch->flag2, AFF2_CHALLENGED);
      REMOVE_BIT(ch->flag2, AFF2_CHALLENGER);
      REMOVE_BIT(ch->flag2, AFF2_INARENA);
      ch->challenged = NULL;    
      REMOVE_BIT(victim->flag2, AFF2_CHALLENGED);
      REMOVE_BIT(victim->flag2, AFF2_CHALLENGER);
      REMOVE_BIT(victim->flag2, AFF2_INARENA);
      if ( victim->in_room->vnum == 7 || victim->in_room->vnum == 8 )
  	  clean_arena( ch, victim );
      victim->challenged = NULL;
    }
  }
  else
  {
    if ( IS_SET(ch->flag2, AFF2_CHALLENGED) )
      REMOVE_BIT(ch->flag2, AFF2_CHALLENGED);
    if ( IS_SET(ch->flag2, AFF2_CHALLENGER) )
      REMOVE_BIT(ch->flag2, AFF2_CHALLENGER);

    if ( IS_SET(ch->flag2, AFF2_INARENA) )
      REMOVE_BIT(ch->flag2, AFF2_INARENA);
  }


  if ( ch->in_room->vnum == 7 || ch->in_room->vnum == 8 )
  {
    char_from_room(ch);
    char_to_room(ch, get_room_index(ROOM_VNUM_TEMPLE));
  }


  return;
}

void do_cleararena( CHAR_DATA *ch )
{
//  CHAR_DATA *victim;
  DESCRIPTOR_DATA *d; 
//  char name[MAX_STRING_LENGTH]; 
 
for (d = descriptor_list;  d != NULL; d = d->next)
 {
    ch = d->character;
    if (ch == NULL || IS_NPC(ch)) continue;

      REMOVE_BIT(ch->flag2, AFF2_CHALLENGED);
      REMOVE_BIT(ch->flag2, AFF2_CHALLENGER);
      REMOVE_BIT(ch->flag2, AFF2_INARENA);
      REMOVE_BIT(ch->flag2, AFF2_CHALLENGED);
      REMOVE_BIT(ch->flag2, AFF2_CHALLENGER);
      REMOVE_BIT(ch->flag2, AFF2_INARENA);
//      REMOVE_BIT(victim->flag2, AFF2_CHALLENGED);  not needed cause of the
//      REMOVE_BIT(victim->flag2, AFF2_CHALLENGER);  descriptor cycle
//                                                   (clears everyone)
      REMOVE_BIT(ch->flag2, AFF2_INARENA);
      REMOVE_BIT(ch->flag2, AFF2_CHALLENGED);
      REMOVE_BIT(ch->flag2, AFF2_CHALLENGER);

      REMOVE_BIT(ch->flag2, AFF2_INARENA);
  return;
}
}

void clean_arena( CHAR_DATA *loser, CHAR_DATA *winner )
{
  char buf[MAX_STRING_LENGTH];
  REMOVE_BIT(loser->flag2, AFF2_CHALLENGED);
  REMOVE_BIT(loser->flag2, AFF2_CHALLENGER);
  REMOVE_BIT(loser->flag2, AFF2_INARENA   );
  loser->challenged = NULL;
  loser->hit = loser->max_hit;
  loser->move = loser->max_move;
  loser->mana = loser->max_mana;
  loser->fight_timer = 0;
  char_from_room(loser);
  char_to_room(loser, get_room_index(ROOM_VNUM_ALOSER));
  
  REMOVE_BIT(winner->flag2, AFF2_CHALLENGED);
  REMOVE_BIT(winner->flag2, AFF2_CHALLENGER);
  REMOVE_BIT(winner->flag2, AFF2_INARENA   );
  winner->challenged = NULL;
  winner->hit = winner->max_hit;
  winner->mana = winner->max_mana;
  winner->move = winner->max_move;
  winner->fight_timer = 0;

  char_from_room(winner);
  char_to_room(winner, get_room_index(ROOM_VNUM_AWINNER));

  stop_fighting(winner,TRUE);
  do_call(winner,"all");
  do_call(loser,"all");
  do_restore(winner,"self");
  do_restore(loser,"self");  
  do_look(winner,"");
  do_look(loser,"");

  sprintf(buf,"%s has defeated %s!",winner->name, loser->name);
  do_info(NULL,buf);
  winner->pcdata->awins++;
  loser->pcdata->alosses++;
  arena = FIGHT_CLEAR;
  return;
}

void do_decline( CHAR_DATA *ch, char *argument )
{
  CHAR_DATA *victim;
  char buf[MAX_STRING_LENGTH];

  if ( IS_NPC(ch) ) return;

  if ( ch->challenged == NULL )
  {
    stc("You have not been challenged.\n\r",ch);
    return;
  }

  if ( !IS_SET(ch->flag2, AFF2_CHALLENGED) )
  {
    stc("You have not been challenged.\n\r",ch);
    return;
  }

  victim = ch->challenged;
  sprintf(buf,"%s has declined %s's challenge.",ch->name, victim->name);
  do_info(NULL,buf);
  arena = FIGHT_CLEAR;
  undo_arena(ch);
  return;
}

void do_chalaccept( CHAR_DATA *ch, char *argument )
{
  CHAR_DATA *victim;
  ROOM_INDEX_DATA *chroom;
  ROOM_INDEX_DATA *victimroom;
  char arg[MAX_INPUT_LENGTH];
  char buf[MAX_STRING_LENGTH];
//  char buf2[MAX_STRING_LENGTH];
//  char buf3[MAX_STRING_LENGTH];
//   OBJ_DATA *obj;

  

  argument = one_argument( argument, arg );

  if ( IS_NPC(ch) ) return;

/*
  if (arg[0] = '\0')
{
send_to_char("Type chalaccept and the name of the person that challenged you\n\r",ch);
return;
}
*/
//  if ( ( victim = get_char_world( ch, arg ) ) == NULL ) return;

  if ( !IS_SET(ch->flag2, AFF2_CHALLENGED) )
  {
    stc("You have not been challenged.\n\r",ch);
    return;
  }

  if (ch->fight_timer > 0)
  {
   stc("Wait for your fight timer to run out.\n\r",ch);
    return;
  }

  if (IS_SET(ch->in_room->room_flags, ROOM_ARENA))
  {
   stc("Not while in the arena.\n\r",ch);
   return;
  }

  if (ch->challenged->fight_timer > 0)
  {
   stc("Your opponent has a fight timer now.\n\r",ch);
   return;
  }
  
  if (IS_SET(ch->challenged->in_room->room_flags, ROOM_ARENA))
  {
   stc("Your opponent is in the arena.\n\r",ch);
   return;
  }

  if ( ch->challenged == NULL )
  {
    stc("Oddly enough, You have been challenged by someone, yet.. You haven't.\n\r",ch);
    REMOVE_BIT(ch->flag2, AFF2_CHALLENGED);
    arena = FIGHT_CLEAR;
    sprintf(buf,"The Arena has been reset.\n");
    do_info(NULL,buf);
  }
  
 
  victim = ch->challenged;
  sprintf(buf,"%s has accepted %s's challenge.",ch->name, victim->name);
  arena = FIGHT_START;
  SET_BIT(ch->flag2, AFF2_INARENA);
  SET_BIT(victim->flag2, AFF2_INARENA);
  char_from_room(ch);
  char_from_room(victim);
  victim->arena_timer = 1000;
  ch->arena_timer = 1000;
  chroom = get_room_index(number_range(7,8));
  if (chroom == get_room_index(7)) 
  victimroom = get_room_index(8); 
  else if (chroom == get_room_index(8)) victimroom = get_room_index(7);
  char_to_room(ch, chroom);
  char_to_room(victim, victimroom);
  stc("The fight has begun! Good luck!\n\r",ch);
  stc("The fight has begun! Good luck!\n\r",victim);
  do_look(ch,"");
  do_look(victim,"");
  do_info(NULL,buf);
  return;
}