/
vortex/area/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#include <sys/time.h>
#endif
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <time.h>
#include "merc.h"
bool status_kill( CHAR_DATA *ch, CHAR_DATA *victim);
bool valid_clan_challenge( CHAR_DATA *ch, CHAR_DATA *victim);

int	arena;
int     arena_type;
bool valid_clan_challenge( CHAR_DATA *ch, CHAR_DATA *victim)
{
  int class1 = ch->class;
  int class2 = victim->class;
  if( class1 != class2)
  return FALSE;
  if( str_cmp( ch->clan, victim->clan))
  return FALSE;
  else 
  return FALSE;
}
bool status_kill( CHAR_DATA *ch, CHAR_DATA *victim)
{
  if( (ch->race > victim->race) && ((ch->race - victim->race) <= 10))
  return TRUE;
  if( ch->race < victim->race)
  return TRUE;
  else
  return FALSE;
}
/*=======================================================================*
 * function: do_challenge                                                *
 * purpose: sends initial arena match query                              *
 * written by: Doug Araya (whiplash@tft.nacs.net) 6-10-96                *
 *=======================================================================*/
void do_challenge(CHAR_DATA *ch, char *argument)
{
	CHAR_DATA *victim; 
        char arg1[MAX_STRING_LENGTH];
        char arg2[MAX_STRING_LENGTH];
	char buf[MAX_STRING_LENGTH]; 
	char buf1[MAX_STRING_LENGTH]; 
	char buf2[MAX_STRING_LENGTH]; 
	char buf3[MAX_STRING_LENGTH]; 
	/*DESCRIPTOR_DATA *d;*/
        argument = one_argument( argument, arg1);
        argument = one_argument( argument, arg2);
/* == First make all invalid checks == */

	if(IS_NPC(ch))
		return; 
	if( deathmatch )
	{
		stc("Not while in Deathmatch mode!\n\r", ch);
		return;
	}
	else if ( arena == FIGHT_START )
	{
		send_to_char("Sorry, some one else has already started a challenge, please try later.\n\r",ch);
		return;
	}

	else if ( arena == FIGHT_BUSY )
	{
		send_to_char("Sorry, there is a fight in progress, please wait a few moments.\n\r",ch);
		return; 
	}
	else if ( arena == FIGHT_LOCK )
	{
		send_to_char("Sorry, the arena is currently locked from use.\n\r",ch);
		return;
	}
	else if (IS_SET(ch->act,PLR_CHALLENGED))
	{
		send_to_char("You have already been challenged, either AGREE or DECLINE first.\n\r",ch);
		return; 
	}
	else if  (IS_SET(ch->act, PLR_CHALLENGER))
	{
		send_to_char("You have already challenged someone else\n\r", ch);
		return;
	}
	else if (ch->level < 3)
	{
		send_to_char("You must be an avatar to challenge for the arena.\n\r",ch);
		return;
	}
	else if (ch->hit < ch->max_hit)
	{
		send_to_char("You must be fully healed to fight in the arena.\n\r",ch);
		return;
	}
	else if  (ch->max_hit < 10000)
	{
		send_to_char("You require at least 10k hp before you can challenge.\n\r", ch);
		return;
	}
	else if (IS_IMMORTAL(ch))
	{
		send_to_char("You may not do that.\n\r", ch);
		return;
	}
	else if (arg1[0] == '\0')
	{
		send_to_char("You must specify whom you wish to challenge.\n\r",ch);
		return;
	}
	else if ((victim = get_char_world(ch,arg1)) == NULL)
	{
		send_to_char("They are not playing.\n\r",ch);
		return;
	}
	else if (IS_NPC(victim))
	{
		send_to_char("You cannot challenge NPC's.\n\r",ch);
		return;
	}
	else if  (victim == ch )
	{
		send_to_char("You cannot do that.\n\r", ch);
	}
	else if(IS_IMMORTAL(victim))
	{
		send_to_char("You really are not the smartest cookie are you?\n\r", ch);
		return;
	}
	else if (IS_SET(victim->act,PLR_CHALLENGER))
	{
		send_to_char("They have already challenged someone else.\n\r",ch);
		return;
	}
	else if  (IS_SET(victim->act, PLR_CHALLENGED))
	{
		send_to_char("They are already challenging someone else.\n\r", ch);
		return;
	}
	else if (victim->fighting != NULL )
	{
		send_to_char("That person is engaged in battle right now.\n\r",ch); 
		return; 
	}
	else if( victim->fight_timer > 0 )
	{
	 stc("You can't arena somebody who was recently fighting!\n\r",ch);
	 return;
	}
	else if (victim->hit < victim->max_hit)
	{
		send_to_char("That player is not healthy enough to fight right now.\n\r",ch);
		return;
	}
	else if  (victim->max_hit < 10000)
	{
		send_to_char("Your opponent requires more than 10k hp before they are viable.\n\r", ch);
		return;
	}
	else if  ( victim->level < 3)
	{
		send_to_char("You may not challenge a mortal to a fight.\n\r", ch);
		return;
	}
	else if  ( victim->desc == NULL )
	{
		send_to_char("That player is linkdead at the moment, try them later.\n\r",ch);
		return;
	}
        else
	{
/* == Now for the challenge == */
	ch->challenged = victim;
	SET_BIT(ch->act,PLR_CHALLENGER);
	victim->challenger = ch;
	SET_BIT(victim->act,PLR_CHALLENGED);
	arena = FIGHT_START;
	send_to_char("Challenge has been sent\n\r",ch);
        act("$n has challenged you to a death match.",ch,NULL,victim,TO_VICT);
	sprintf(buf1, "To meet the challenge type : AGREE %s\n\r", ch->pcdata->switchname);
	send_to_char(buf1, victim);
	sprintf(buf2, "To meet the challenge type : DECLINE %s\n\r", ch->pcdata->switchname);
	send_to_char(buf2, victim);
	sprintf(buf3, "To withdraw the challenge type : WITHDRAW %s\n\r", victim->pcdata->switchname);
	send_to_char(buf3, ch);
	sprintf(buf,"[ARENA] %s has been challenged by %s.",victim->pcdata->switchname,ch->pcdata->switchname);
	do_info(ch,buf);
	return;
        }
  return;
} 





/*=======================================================================*

 * function: do_accept                                                   *

 * purpose: to accept the arena match, and move the players to the arena *

 * written by: Doug Araya (whiplash@tft.nacs.net) 6-10-96                *

 *=======================================================================*/

void do_agree(CHAR_DATA *ch, char *argument)
{
	/*DESCRIPTOR_DATA *d;*/
	CHAR_DATA *victim; 
	char buf1[MAX_STRING_LENGTH]; 
	char buf2[MAX_STRING_LENGTH];
	int char_room; 
	int vict_room; 
/*== the room VNUM's for our arena.are ==*/
/* we use 1051 thru 1066 for a 4x4 arena */
	char_room = 50;
	vict_room = 68;
/* == first make all invalid checks == */
	victim = ch->challenger;
	if(IS_NPC(ch))
		return;
	if( !IS_SET(ch->act,PLR_CHALLENGED) )
	{
		send_to_char("You have not been challenged.\n\r",ch);
		return;
	}
	if( arena == FIGHT_BUSY )
	{
		send_to_char("Sorry, there is a fight in progress, please wait a few moments.\n\r",ch);
		return;
	}
	if( arena == FIGHT_LOCK )
	{
		send_to_char("Sorry, the arena is currently locked from use.\n\r",ch);
		return;
	}
/*	if(argument[0]=='\0')
	{
		send_to_char("You must specify whose challenge you wish to accept.\n\r",ch);
		return;
	}
	if((victim = get_char_world(ch,argument)) == NULL)
	{
		send_to_char("They aren't logged in!\n\r",ch);
		return;
	}
*/	if(victim == ch)
	{
		send_to_char("You haven't challenged yourself!\n\r",ch);
		return;
	}
/*	if(!IS_SET(victim->act,PLR_CHALLENGER) || victim != ch->challenger )
	{
		send_to_char("That player hasn't challenged you!\n\r",ch); 
		return; 
	}
*/
/* == now get to business == */
	send_to_char("You have accepted the challenge!\n\r",ch);
	act("$n accepts your challenge!",ch,NULL,victim,TO_VICT);
/* == announce the upcoming event == */
	sprintf(buf1, "[ARENA] %s (%d wins) (%d losses)", victim->name,victim->pcdata->awins,victim->pcdata->alosses );
	sprintf(buf2,"[ARENA] %s (%d wins) (%d losses)", ch->name,ch->pcdata->awins,ch->pcdata->alosses );
	do_info(ch,buf1);
	do_info(ch,buf2);
/*	strcpy(buf3,"[Arena] To wager on the fight, type: bet (amount) (player name)\n\r");
	for ( d = descriptor_list; d; d = d->next )
	{
		if( d->connected == CON_PLAYING)
		{
			ADD_COLOUR(ch,buf1,L_RED);
			ADD_COLOUR(ch,buf2,L_RED);
			ADD_COLOUR(ch,buf3,L_RED);
			send_to_char( buf1, d->character );
			send_to_char( buf2, d->character );
			send_to_char( buf3, d->character );
			d->character->gladiator = NULL;
		}
	}*/

/* == now move them both to an arena for the fun == */
        victim->pcdata->c_chal++;
	send_to_char("You make your way into the arena.\n\r",ch);
	char_from_room(ch); 
	char_to_room(ch,get_room_index(char_room));
	do_look(ch, "auto");
	send_to_char("You make your way to the arena.\n\r",victim); 
	char_from_room(victim); 
	char_to_room(victim,get_room_index(vict_room)); 
	do_look(victim, "auto");
        ch->pcdata->held = str_dup( "");
        ch->pcdata->held_by = str_dup( "");
        victim->pcdata->held = str_dup( "");
        victim->pcdata->held_by = str_dup("");
	arena = FIGHT_BUSY; 
	return; 
}



/*=======================================================================*
 * function: do_decline                                                  *
 * purpose: to chicken out from a sent arena challenge                   *
 * written by: Doug Araya (whiplash@tft.nacs.net) 6-10-96                *
 *=======================================================================*/

void do_decline(CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *victim; 
	char buf[MAX_STRING_LENGTH];
	/*DESCRIPTOR_DATA *d;*/
        victim = ch->challenger;
/*== make all invalid checks == */
	if(IS_NPC(ch))
		return;
	if( !IS_SET(ch->act,PLR_CHALLENGED) )
	{
		send_to_char("You have not been challenged.\n\r",ch);
		return;
	}
/*	if(argument[0]=='\0')
	{
		send_to_char("You must specify whose challenge you wish to decline.\n\r",ch);
		return;
	}
	if((victim = get_char_world(ch,argument)) == NULL)
	{
		send_to_char("They aren't logged in!\n\r",ch);
		return;
	}
	if(!IS_SET(victim->act,PLR_CHALLENGER) || victim != ch->challenger )
	{
		send_to_char("That player hasn't challenged you.\n\r",ch);
		return;
	}
*/	if(victim == ch)
		return;
	if(victim == NULL)
		return;

	if ( arena == FIGHT_BUSY )
	{
//		send_to_char("Your fight has started.\n\r", ch);
		return;
	}
        if( (ch->pcdata->c_chal = 5) && (arena_type == ARENA_CLAN))
        {
         send_to_char("Your clan leadership is forfeit.\n\r", ch);
         return;
        }	
/*== now actually decline == */
        if( arena_type == ARENA_CLAN)
         ch->pcdata->c_chal++;
	victim->challenged = NULL;
	REMOVE_BIT(victim->act,PLR_CHALLENGER); 
	ch->challenger = NULL;
	REMOVE_BIT(ch->act,PLR_CHALLENGED);
	arena = FIGHT_OPEN;
	send_to_char("Challenge declined!\n\r",ch);
	act("$n has declined your challenge.",ch,NULL,victim,TO_VICT);
	sprintf(buf,"[ARENA] %s has declined %s's challenge.", ch->name, victim->name);
/*	for ( d = descriptor_list; d; d = d->next )
	{
		if( d->connected == CON_PLAYING)
		{
			ADD_COLOUR(ch,buf,L_RED);
			send_to_char( buf, d->character );
		}
	}*/
	do_info(ch,buf);

	return;
}


void do_withdraw(CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *victim; 
	char buf[MAX_STRING_LENGTH];
	/*DESCRIPTOR_DATA *d;*/
        victim = ch->challenged;
/*== make all invalid checks == */
	if(IS_NPC(ch))
		return;
	if( !IS_SET(ch->act,PLR_CHALLENGER) )
	{
		send_to_char("You have not been challenged.\n\r",ch);
		return;
	}
/*	if(argument[0]=='\0')
	{
		send_to_char("You must specify the challenge you wish to withdraw.\n\r",ch);
		return;
	}
	if((victim = get_char_world(ch,argument)) == NULL)
	{
		send_to_char("They aren't logged in!\n\r",ch);
		return;
	}
	if(!IS_SET(victim->act,PLR_CHALLENGED) || victim != ch->challenged )
	{
		send_to_char("That player hasn't been challenged by you.\n\r",ch);
		return;
	}
*/	if(victim == ch)
		return; 

        if( victim == NULL)
        return;
	if ( arena == FIGHT_BUSY )

	{

//		send_to_char("Your fight has started.\n\r", ch);

		return;

	}
/*== now actually decline == */
        if( arena_type == ARENA_CLAN)
         ch->pcdata->c_chal--;
	victim->challenger = NULL;
	REMOVE_BIT(victim->act,PLR_CHALLENGED); 
	ch->challenged = NULL;
	REMOVE_BIT(ch->act,PLR_CHALLENGER);
	arena = FIGHT_OPEN;
	send_to_char("Challenge withdrawn!\n\r",ch);
	act("$n has withdrawn their challenge.",ch,NULL,victim,TO_VICT);
	sprintf(buf,"[ARENA] %s has withdrawn their challenge on %s.",ch->pcdata->switchname, victim->pcdata->switchname);
	do_info(ch,buf);
/*	for ( d = descriptor_list; d; d = d->next )
	{
		if( d->connected == CON_PLAYING)
		{
			ADD_COLOUR(ch,buf,L_RED);
			send_to_char( buf, d->character );
		}
	}*/
	return;
}
void do_arena( CHAR_DATA *ch, char *argument )
{
    char buf2[MAX_STRING_LENGTH];
	char bufrogue[MAX_STRING_LENGTH];
	char bufultimate[MAX_STRING_LENGTH];
	char bufsupreme[MAX_STRING_LENGTH];
	char bufgreater[MAX_STRING_LENGTH];
	char buflesser[MAX_STRING_LENGTH];
	char bufdemi[MAX_STRING_LENGTH];
	char bufgodling[MAX_STRING_LENGTH];
	char bufimmortal[MAX_STRING_LENGTH];
	char bufavatar[MAX_STRING_LENGTH];
    char kav[MAX_STRING_LENGTH];
    /*char rep[MAX_STRING_LENGTH];*/
    char openb[5];
    char closeb[5];
    DESCRIPTOR_DATA *d;
    int iLevelLower;
    int iLevelUpper;
    int nNumber;
    int nMatch;
	/*float  totalpk;*/
    bool fClassRestrict;
    bool fImmortalOnly;
	CHAR_DATA *wch;
    if (IS_NPC(ch)) return;
    /* Set default arguments. */
    iLevelLower    = 0;
    iLevelUpper    = MAX_LEVEL;
    fClassRestrict = FALSE;
    fImmortalOnly  = FALSE;
    /* Parse arguments. */
    nNumber = 0;
    for ( ;; )
    {
		char arg[MAX_STRING_LENGTH];
		argument = one_argument( argument, arg );
		if ( arg[0] == '\0' )
			break;
		if ( is_number( arg ) )
		{
			return;
		}
		else
		{
	    /* Look for classes to turn on. */
			arg[3]    = '\0';
			if (   !str_cmp( arg, "imm" ) || !str_cmp( arg, "immortal" ) || !str_cmp( arg, "ava" ) || !str_cmp( arg, "avatar"   ) )
			{
				fClassRestrict = TRUE;
			}
			else if ( !str_cmp( arg, "god" ) || !str_cmp( arg, "imp" ) )
			{
				fImmortalOnly = TRUE;
			}
			else
			{
				send_to_char("Enter 'Avatar' for level 3's, or 'God' for level 4's and 5's.\n\r",ch);
				return;
			}
		}
    }

    /*  Now show matching chars. */
    nMatch = 0;
	buf2[0] = '\0';
	bufrogue[0] = '\0';
	bufultimate[0] = '\0';
	bufsupreme[0] = '\0';
	bufgreater[0] = '\0';
	buflesser[0] = '\0';
	bufdemi[0] = '\0';
	bufgodling[0] = '\0';
	bufimmortal[0] = '\0';
	bufavatar[0] = '\0';

    for ( d = descriptor_list; d != NULL; d = d->next )
    {
		
		char const *class;
	/*
	 * Check for match against restrictions.
	 * Don't use trust as that exposes trusted mortals.
	 */
		if ( (d->connected != CON_PLAYING && d->connected != CON_EDITING) || (!can_see( ch, d->character ) && (!IS_SET(ch->act, PLR_WATCHER)) )  )
			continue;
		wch   = ( d->original != NULL ) ? d->original : d->character;
		if ( wch->level < iLevelLower ||   wch->level > iLevelUpper || ( fImmortalOnly  && wch->level <  LEVEL_IMMORTAL ) || ( fClassRestrict && wch->level != LEVEL_HERO     ) )
			continue;
		if ( (wch->max_hit < 10000) || (wch->level < 3) || (wch->level > 6) )
			continue;
		if ((IS_HEAD(wch,LOST_HEAD) || IS_EXTRA(wch,EXTRA_OSWITCH)) && wch->pcdata->chobj != NULL)
			continue;
		nMatch++;

	/*
	 * Figure out what to print for class.
	 */
		class = " ";
		if ((IS_HEAD(wch,LOST_HEAD) || IS_EXTRA(wch,EXTRA_OSWITCH)) && wch->pcdata->chobj != NULL)
		{
			if (wch->pcdata->chobj->pIndexData->vnum == 12)
	    		class = "A Head       ";
			else if (wch->pcdata->chobj->pIndexData->vnum == 30005)
	    		class = "A Brain      ";
			else
	    		class = "An Object    ";
		}
		else if (!str_cmp(wch->pcdata->switchname, "Sage"))
			class = "#3LoW Founder     ";

		else
			switch ( wch->level )
			{
				default:
					if (wch->race <= 0 )
						class = "#1Avatar#n       ";
					else if (wch->race <= 4 )
						class = "#3Immortal#n     ";
					else if (wch->race <= 9 )
						class = "#4Godling#n      ";
					else if (wch->race <= 14)
						class = "#6DemiGod#n      ";
					else if (wch->race <= 19)
						class = "#0Lesser God#n   ";
					else if (wch->race <= 24)
						class = "#1Greater God#n  ";
					else if (wch->race <= 29)
						class = "#5Supreme God#n  ";
					else if (wch->race <= 34)
						class = "#7Ultimate God#n ";
					else if (wch->race <= 60)
						class = "#6Master   #n    ";
					break;
			}
	/* Format it up. */
			strcpy( openb, "[" );
			strcpy( closeb, "]" ); 
				sprintf( kav, " %sNONE%s",openb,closeb );
		if ((wch->level < 7) && (wch->level > 2) && (wch->race >= 35))
			sprintf( bufrogue + strlen(bufrogue), "%-13s#n %-10s%-20s #2%-6d wins     %-6d losses\n\r", class, kav, wch->pcdata->switchname, wch->pcdata->awins, wch->pcdata->alosses);
		if ((wch->level < 7) && (wch->level > 2) && (wch->race < 35) && (wch->race >=30))
			sprintf( bufultimate + strlen(bufultimate), "%-13s#n %-10s%-20s#2 %-6d wins     %-6d losses\n\r", class, kav, wch->pcdata->switchname, wch->pcdata->awins, wch->pcdata->alosses);
		if ((wch->level < 7) && (wch->level > 2) && (wch->race < 30) && (wch->race >= 25))
			sprintf( bufsupreme + strlen(bufsupreme), "%-13s#n %-10s%-20s#2 %-6d wins     %-6d losses\n\r", class, kav, wch->pcdata->switchname, wch->pcdata->awins, wch->pcdata->alosses);
		if ((wch->level < 7) && (wch->level > 2) && (wch->race < 25) && (wch->race >= 20))
			sprintf( bufgreater + strlen(bufgreater), "%-13s#n %-10s%-20s#2 %-6d wins     %-6d losses\n\r", class, kav, wch->pcdata->switchname, wch->pcdata->awins, wch->pcdata->alosses);
		if ((wch->level < 7) && (wch->level > 2) && (wch->race < 20) && (wch->race >= 15))
			sprintf( buflesser + strlen(buflesser), "%-13s#n %-10s%-20s#2 %-6d wins     %-6d losses\n\r", class, kav, wch->pcdata->switchname, wch->pcdata->awins, wch->pcdata->alosses);
		if ((wch->level < 7) && (wch->level > 2) && (wch->race < 15) && (wch->race >= 10))
			sprintf( bufdemi + strlen(bufdemi),     "%-13s#n %-10s%-20s#2 %-6d wins     %-6d losses\n\r", class, kav, wch->pcdata->switchname, wch->pcdata->awins, wch->pcdata->alosses);
		if ((wch->level < 7) && (wch->level > 2) && (wch->race < 10) && (wch->race >= 5))
			sprintf( bufgodling + strlen(bufgodling), "%-13s#n %-10s%-20s#2 %-6d wins     %-6d losses\n\r", class, kav, wch->pcdata->switchname, wch->pcdata->awins, wch->pcdata->alosses);
		if ((wch->level < 7) && (wch->level > 2) && (wch->race < 5) && (wch->race >= 1))
			sprintf( bufimmortal + strlen(bufimmortal), "%-13s#n %-10s%-20s#2 %-6d wins     %-6d losses\n\r", class, kav, wch->pcdata->switchname, wch->pcdata->awins, wch->pcdata->alosses);
		if ((wch->level < 7) && (wch->level > 2) && (wch->race < 1))
			sprintf( bufavatar + strlen(bufavatar), "%-13s#n %-10s%-20s#2 %-6d wins     %-6d losses\n\r", class, kav, wch->pcdata->switchname, wch->pcdata->awins, wch->pcdata->alosses);
	}
    sprintf(buf2,"The Vortex");
	banner_to_char(buf2,ch);
	send_to_char("Arena Status : ",ch);
	if (arena == FIGHT_OPEN)
		send_to_char("OPEN FOR CHALLENGES\n\r", ch);
	if (arena == FIGHT_START)
		send_to_char("CHALLENGE IN PROGRESS\n\r", ch);
	if (arena == FIGHT_BUSY)
		send_to_char("FIGHT IN PROGRESS\n\r", ch);
	if (arena == FIGHT_LOCK)
		send_to_char("ARENA IS CLOSED\n\r", ch);
	send_to_char( bufrogue,ch );
	send_to_char( bufultimate,ch );
	send_to_char( bufsupreme,ch );
	send_to_char( bufgreater,ch );
	send_to_char( buflesser,ch );
	send_to_char( bufdemi,ch );
	send_to_char( bufgodling,ch );
	send_to_char( bufimmortal,ch );
	send_to_char( bufavatar,ch );
	sprintf(buf2,"Players Challengeable: %d",nMatch);
    banner_to_char(buf2,ch);
    return;
}