atd/area/
atd/build/
atd/clans/
atd/log/
atd/player/store/
atd/site/
atd/src/bin/
/* Hmm. An attempt..
     At a godwars battle arena
     Da dun dun dun da..
*/
/***************************************************************************
 *  God Wars Mud originally written by KaVir aka Richard Woolcock.         *
 *  Changes done to the code done by Sage aka Walter Howard, this mud is   *
 *  for the public, however if you run this code it means you agree        *
 *  to the license.low, license.gw, and license.merc have fun. :)          *
***************************************************************************/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
#include "arena.h"
#include "leader.h"
#include "commands.h"

void  clean_arena	args( ( CHAR_DATA *loser, CHAR_DATA *winner ) );
void  do_ainfo		args( ( CHAR_DATA *ch, char *argument ) );

bool is_inarena( CHAR_DATA *ch, CHAR_DATA *vch )
{
  bool arena = FALSE;
   
  if( ch->in_room->vnum >= 50 && ch->in_room->vnum <= 68 )
	arena = TRUE;
  else if( vch->in_room->vnum >= 50 && vch->in_room->vnum <= 68 )
	arena = TRUE;
  
  if( arena )
  {
      if( ch == vch )
	stc( "Not while in the arena!\n\r", ch );
      else    
	ch_printf( ch, "Not while %s is in the arena!\n\r", vch->name );
  }

  return arena;
}

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_ainfo(ch,buf);
  arena = FIGHT_CLEAR;
  undo_arena(ch);
  return;
}

void do_ainfo( CHAR_DATA *ch, char *argument )
{
    DESCRIPTOR_DATA *d;

    if ( argument[0] == '\0' )
    {
        return;
    }

    if (!IS_NPC(ch) && IS_IMMORTAL(ch) && IS_SET(ch->act,PLR_WIZINVIS))
        return;

    for ( d = descriptor_list; d != NULL; d = d->next )
    {
        if ( d->connected == CON_PLAYING &&
                !IS_SET(d->character->deaf, CHANNEL_INFO) )
        {
            send_to_char( "{C@{D[{yxxx{D]{w({W>>>{BArena{W>>{r>{R>{W ",d->character );
            send_to_char( argument, d->character );
            send_to_char( "\n\r",   d->character );
        }
    }

    return;
}

void do_sinfo( CHAR_DATA *ch, char *argument )
{
    DESCRIPTOR_DATA *d;

    if ( argument[0] == '\0' )
    {
        return;
    }
    
    if (!IS_NPC(ch) && IS_IMMORTAL(ch) && IS_SET(ch->act,PLR_WIZINVIS))
        return;
  
    for ( d = descriptor_list; d != NULL; d = d->next )
    {
        if ( d->connected == CON_PLAYING &&
                !IS_SET(d->character->deaf, CHANNEL_INFO) )
        {  
            send_to_char( "{r-{R={w+{W*{D({w Status Challenge {D){W*{w+{R={r-{W ",d->character );
            send_to_char( argument, d->character );
            send_to_char( "\n\r",   d->character );
        }
    }
    
    return;
}    

void do_challenge( CHAR_DATA *ch, char *argument )
{
  CHAR_DATA *victim;
  char arg[MAX_INPUT_LENGTH];
  char buf[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->in_room->vnum != 3054)
  {
    send_to_char("You are not in the Temple Altar.\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 = 120;
victim->arena_timer = 120;
   //victim->arena_timer = 20;
  sprintf(buf,"%s has challenged %s to a death match.\n",ch->name,victim->name);
  do_ainfo(ch,buf);
  SET_BIT(ch->flag2, AFF2_CHALLENGER);
  SET_BIT(victim->flag2, AFF2_CHALLENGED);
  arena = FIGHT_PRE;
  return;
}

void do_arenaagree( CHAR_DATA *ch, char *argument )
{
  CHAR_DATA *victim;
  ROOM_INDEX_DATA *chroom;
  ROOM_INDEX_DATA *victroom;
  char buf[MAX_STRING_LENGTH];
   OBJ_DATA *obj;
  if ( IS_NPC(ch) ) return;

  if ( !IS_SET(ch->flag2, AFF2_CHALLENGED) )
  {
    stc("You weren't even challenged.\n\r",ch);
    return;
  }

  if (ch->in_room->vnum != 3054)
  {
    send_to_char("You are not in the Temple Altar.\n\r", ch);
    return;
  }

for ( obj = ch->carrying; obj != NULL; obj = obj->next_content )
    {
        if ( obj->chobj != NULL )
        {
	    send_to_char("You cannot enter the arena carrying living objects.\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 is Clear.\n");
    do_ainfo(ch,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 = 0;
  //ch->arena_timer = 0;
  chroom = get_room_index(number_range(50,68));
  victroom = get_room_index(number_range(50,68));
  if ( victroom == chroom )
   chroom = get_room_index(number_range(50,68));
  char_to_room(ch, chroom);
  char_to_room(victim, victroom);
  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_ainfo(ch,buf);
  sprintf(buf,"{c __________________________________{x");
  do_ainfo(ch,buf);  
  sprintf(buf,"{c|{w#u            Arena Stats           #n{c|{x");
  do_ainfo(ch,buf);  
  sprintf(buf,"{c|{W Name             Wins     Losses {c|{x");
  do_ainfo(ch,buf);  
  sprintf(buf,"{c|{w----------------{c+{w--------{c+{w--------{c|{x");
  do_ainfo(ch,buf);  
  sprintf(buf,"{c|{W %14s {c|{w %-6d {c|{w %-6d {c|{x",ch->name,ch->awins,ch->alosses);
  do_ainfo(ch,buf);  
  sprintf(buf,"{c|{W %14s {c|{w %-6d {c|{w %-6d {c|{x",victim->name,victim->awins,victim->alosses);
  do_ainfo(ch,buf);  
  sprintf(buf,"{c|__________________________________|{x");
  do_ainfo(ch,buf);  
  return;
}


void clean_arena( CHAR_DATA *loser, CHAR_DATA *winner )
{
  char buf[MAX_STRING_LENGTH];
  int ratio;

  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   );

  if (( IS_SET(winner->flag2, AFF2_SARENA) 
      && IS_SET(loser->flag2, AFF2_SARENA))
   || IS_SET( sysdata.world, WORLD_STATUSARENA) )
  {
  	winner->race += 1;
        winner->pkill += 1;
        loser->race -= 1;
        loser->pdeath += 1; 
	REMOVE_BIT( loser->flag2, AFF2_SARENA );
	REMOVE_BIT( winner->flag2, AFF2_SARENA );
	REMOVE_BIT( sysdata.world, WORLD_STATUSARENA );
  }

  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));
  
  do_look(winner,"");
  do_look(loser,"");

  sprintf(buf,"%s has defeated %s!",winner->name, loser->name);
  do_ainfo(winner,buf);
  winner->awins++;
  loser->alosses++;
  loser->fight_timer = 0;
  winner->fight_timer = 0;
  arena = FIGHT_CLEAR;
  ratio = (int)((float)winner->awins/(float)(winner->awins + winner->alosses)*100);
  adjust_hiscore( "arena", winner, ratio );
  ratio = (int)((float)loser->awins/(float)(loser->awins + loser->alosses)*100);  
  adjust_hiscore( "arena", loser, ratio );
  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;    
      victim->fight_timer = 0;
      ch->fight_timer = 0;
      REMOVE_BIT(victim->flag2, AFF2_CHALLENGED);
      REMOVE_BIT(victim->flag2, AFF2_CHALLENGER);
      REMOVE_BIT(victim->flag2, AFF2_INARENA);
      if ( victim->in_room->vnum >= 50 && victim->in_room->vnum <= 68 )
  	  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 >= 50 && ch->in_room->vnum <= 68 )
  {
    char_from_room(ch);
    char_to_room(ch, get_room_index(ROOM_VNUM_TEMPLE));
  }

  REMOVE_BIT( sysdata.world, WORLD_STATUSARENA );
  return;
}

void do_schallenge( CHAR_DATA *ch, char *argument )
{
  CHAR_DATA *victim;
  char arg[MAX_INPUT_LENGTH];
  char buf[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 status 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("Status Challenge a mobile? You're pathetic.\n\r",ch);
    return;
  }
   
  if ( victim == ch )
  {
    stc("Oh, kill yourself. Fun.\n\r",ch);
    return;
  }
   
  if (victim->race == 0) { stc("Status challenge someone with 0 status? I think not.\n\r",ch); return; }
  if (ch->race == 0) { stc("You need to have at least 1 status to do this.\n\r",ch); return; }

  if (ch->in_room->vnum != 3054)
  {
    send_to_char("You are not in the Temple Altar.\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 = 120;
  victim->arena_timer = 120;
   //victim->arena_timer = 20;
  sprintf(buf,"%s has challenged %s to a status death match.\n",ch->name,victim->name);
  do_sinfo(ch,buf);
  SET_BIT(ch->flag2, AFF2_CHALLENGER);
  SET_BIT(victim->flag2, AFF2_CHALLENGED);
  arena = FIGHT_PRE;
  return;
}

void do_sagree( CHAR_DATA *ch, char *argument )
{   
  CHAR_DATA *victim;
  ROOM_INDEX_DATA *chroom;
  ROOM_INDEX_DATA *victroom;
  char buf[MAX_STRING_LENGTH];
   OBJ_DATA *obj;
  if ( IS_NPC(ch) ) return;
    
  if ( !IS_SET(ch->flag2, AFF2_CHALLENGED) )
  {
    stc("You weren't even challenged.\n\r",ch);
    return;
  }
  
  if (ch->in_room->vnum != 3054)
  {
    send_to_char("You are not in the Temple Altar.\n\r", ch);
    return;
  }
 
for ( obj = ch->carrying; obj != NULL; obj = obj->next_content )
    {
        if ( obj->chobj != NULL )
        {
            send_to_char("You cannot enter the arena carrying living objects.\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 is Clear.\n");
    do_ainfo(ch,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);
  SET_BIT(ch->flag2, AFF2_SARENA);
  SET_BIT(victim->flag2, AFF2_SARENA);
  SET_BIT( sysdata.world, WORLD_STATUSARENA );
  char_from_room(ch);
  char_from_room(victim);

  chroom = get_room_index(number_range(50,68));
  victroom = get_room_index(number_range(50,68));
  if ( victroom == chroom )
   chroom = get_room_index(number_range(50,68));

  char_to_room(ch, chroom);
  char_to_room(victim, victroom);

  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_sinfo(ch,buf);  

  sprintf(buf,"{c __________________________________{x");
  do_sinfo(ch,buf);
  sprintf(buf,"{c|{w#u            Arena Stats           #n{c|{x");
  do_sinfo(ch,buf);
  sprintf(buf,"{c|{W Name             Wins     Losses {c|{x");
  do_sinfo(ch,buf);
  sprintf(buf,"{c|{w----------------{c+{w--------{c+{w--------{c|{x");
  do_sinfo(ch,buf);
  sprintf(buf,"{c|{W %14s {c|{w %-6d {c|{w %-6d {c|{x",ch->name,ch->awins,ch->alosses);
  do_sinfo(ch,buf);
  sprintf(buf,"{c|{W %14s {c|{w %-6d {c|{w %-6d {c|{x",victim->name,victim->awins,victim->alosses);
  do_sinfo(ch,buf);
  sprintf(buf,"{c|__________________________________|{x");
  do_sinfo(ch,buf);
  return;
}