/
mudtem/
mudtem/area/scripts/
mudtem/bin/
mudtem/log/
mudtem/player/
mudtem/slang/autoconf/
mudtem/slang/doc/
mudtem/slang/doc/OLD/help/
mudtem/slang/doc/internal/
mudtem/slang/doc/text/
mudtem/slang/doc/tm/tools/
mudtem/slang/examples/
mudtem/slang/modules/
mudtem/slang/slsh/
mudtem/slang/slsh/lib/
mudtem/slang/slsh/scripts/
mudtem/slang/src/mkfiles/
mudtem/slang/src/util/
mudtem/src/CVS/
mudtem/src/include/
mudtem/src/include/CVS/
mudtem/src/var/CVS/
#include "include.h"
#include "plist.h"
#include "arena.h"
#include "tables.h"
#include "recycle.h"

#include <stdarg.h>

COMMAND(do_look)
COMMAND(do_retar)
COMMAND(do_aceptar)
COMMAND(do_rechazar)
COMMAND(do_apostar)
COMMAND(do_info)
COMMAND(do_arena_probar)

void arena_reset_char( CHAR_DATA *, int, int );

CHAR_DATA * retador( CHAR_DATA * );

#define ARENA_PERS_DEFAULT 0

struct arena_type arena_table [] =
{
	{	"chica",	2,	2,	3037,	3037,	ARENA_LIBRE,	ARENA_PERSONAL, NULL,	0	},
	{	"personal",	2,	2,	3370,	3373,	ARENA_LIBRE,	ARENA_PERSONAL, NULL,	0	},
	{	"multi",	2,	4,	3360,	3368,	ARENA_LIBRE,	ARENA_NONE,	NULL,	0	},
	{	"grande",	2,	20,	22000,	22048,	ARENA_LIBRE,	ARENA_ETERNA,	NULL,	0	},
	{	NULL,		0,	0,	0,	0,	ARENA_LIBRE,	ARENA_NONE,	NULL,	0	}
};

void inscribir_jugador( CHAR_DATA *ch, int temp )
{
	ALIST *al;

	al				= new_alist();
	al->ch				= ch;
	al->frags			= 0;
	al->apuestas			= 0;
	al->curhit			= ch->hit;
	al->curmana			= ch->mana;
	al->curmove			= ch->move;

	al->next			= arena_table[temp].jugadores;
	arena_table[temp].jugadores	= al;
}

void send_to_alist (int tmp, char * fmt, ...)
{
	char buf [MIL];
	ALIST * al;

	va_list args;
	va_start (args, fmt);
	vsprintf (buf, fmt, args);
	va_end (args);

	for ( al = arena_table[tmp].jugadores; al; al = al->next )
		send_to_char( buf, al->ch );
}

ALIST * en_alista( CHAR_DATA *ch, ALIST * al )
{
	for ( ; al; al = al->next )
		if ( al->ch == ch )
			return al;

	return NULL;
}

int	count_alista( ALIST * al )
{
	int cnt = 0;

	for ( ; al; al = al->next )
		cnt++;

	return cnt;
}

int arena_lookup ( const char * arg )
{
	int i;

	for ( i = 0; arena_table[i].name; i++ )
		if ( !str_prefix( arg, arena_table[i].name ) )
			return i;

	return -1;
}

int esta_inscrito( CHAR_DATA * ch )
{
	int i;

	for ( i = 0; arena_table[i].name; i++ )
		if ( en_alista( ch, arena_table[i].jugadores ) )
			return i;

	return -1;
}

char * alist_to_list( ALIST * al )
{
	static char buf[MIL];

	buf[0] = '\0';

	for ( ; al; al = al->next )
	{
		strcat( buf, al->ch->name );
		if ( al->next )
			strcat( buf, ", " );
		else
			strcat( buf, "." );
	}

	return buf;
}

void do_arenastatus( CHAR_DATA *ch, char *argument )
{
	int temp = 0;
	char buf[MIL];
	ALIST * al;

	if ( (temp = arena_room_lookup(ch->in_room->vnum)) == -1 )
	{
		if ( IS_NULLSTR(argument)
		||  (temp = arena_lookup(argument)) == -1 )
		{
			send_to_char( "Esa arena no existe.\n\r", ch );
			return;
		}
	}

	sprintf( buf,	"Numero minimo de jugadores : %d\n\r"
			"Numero actual de jugadores : %d\n\r"
			"Numero maximo de jugadores : %d\n\r"
			"Jugadores :\n\r", arena_table[temp].minjug,
					   count_alista(arena_table[temp].jugadores),
					   arena_table[temp].maxjug );
	send_to_char( buf, ch );

	sprintf( buf, "#UNombre     Nivel Clase Raza Frags#u\n\r" );
	send_to_char( buf, ch );

	for ( al = arena_table[temp].jugadores; al; al = al->next )
	{
		sprintf( buf, "%-10.10s %-5.5d %-5.5s %-4.4s %d\n\r",
			al->ch->name,
			getNivelPr(al->ch),
			class_table[getClasePr(al->ch)].name,
			race_table[al->ch->race].name,
			al->frags );
		send_to_char( buf, ch );
	}

	return;
}

void do_arenalist( CHAR_DATA *ch, char *argument )
{
	int i;
	char buf[MIL];

	sprintf( buf, "#U%-10.10s Min Max Act St %-51.51s#u\n\r", "Nombre", "Jugadores" );
	send_to_char( buf, ch );

	for ( i = 0; arena_table[i].name; i++ )
	{
		sprintf( buf, "%-10.10s %3d %3d %3d %c  %-51.51s\n\r",
			arena_table[i].name,
			arena_table[i].minjug,
			arena_table[i].maxjug,
			count_alista(arena_table[i].jugadores),
			arena_table[i].status == ARENA_LIBRE ? 'L' : 'O',
			alist_to_list(arena_table[i].jugadores) );
		send_to_char( buf, ch );
	}

	return;
}

void do_inscribir( CHAR_DATA *ch, char * argument )
{
	int temp;
	CHAR_DATA *victim;

	if ( IS_NULLSTR(argument) )
	{
		send_to_char( "Sintaxis : arena inscribir [arena]\n\r", ch );
		return;
	}

	if ( IS_IMMORTAL(ch) )
	{
		send_to_char( "Sabes que vas a ganar.\n\r", ch );
		return;
	}

	if ( getNivelPr(ch) < 5 )
	{
		send_to_char( "Eres de nivel demasiado bajo.\n\r", ch );
		return;
	}

	if ( esta_inscrito( ch ) != -1 )
	{
		send_to_char( "Ya estas inscrito.\n\r", ch );
		return;
	}

	if ( ch->pcdata->retando )
	{
		act( "Estas retando a $N. Espera su respuesta.", ch, NULL, chToEnt(ch->pcdata->retando), TO_CHAR );
		return;
	}

	if ( (victim = retador(ch)) )
	{
		act( "$N te reto. Acepta o rechaza.", ch, NULL, chToEnt(victim), TO_CHAR );
		return;
	}

	if ( (temp = arena_lookup( argument )) == -1 )
	{
		send_to_char( "Esa arena no existe.\n\r", ch );
		return;
	}
	
	if ( count_alista(arena_table[temp].jugadores) >= arena_table[temp].maxjug )
	{
		send_to_char( "Esa arena esta llena.\n\r", ch );
		return;
	}

	if ( arena_table[temp].status != ARENA_LIBRE
	&&  !IS_SET(arena_table[temp].flags, ARENA_ETERNA) )
	{
		send_to_char( "Esa arena esta ocupada.\n\r", ch );
		return;
	}

	send_to_alist( temp, "[#BARENA#b] #B%s#b se inscribe para la Arena.\n\r", ch->name );

	inscribir_jugador( ch, temp );

	send_to_char( "Ok. Ahora estas inscrito.\n\r", ch );
	act( "$n se inscribe para la arena $t.", ch, strToEnt(arena_table[temp].name,ch->in_room), NULL, TO_ROOM );

	if ( IS_SET(arena_table[temp].flags, ARENA_ETERNA)
	&&   arena_table[temp].status != ARENA_LIBRE )
		arena_reset_char(ch, number_range(arena_table[temp].desde, arena_table[temp].hasta), 0 );
}

void do_retirar( CHAR_DATA *ch, char *argument )
{
	ALIST * al;
	int temp;

	if ( (temp = esta_inscrito(ch)) == -1 )
	{
		send_to_char( "No estas inscrito.\n\r", ch );
		return;
	}

	if ( arena_table[temp].status != ARENA_LIBRE
	&&  !IS_SET(arena_table[temp].flags, ARENA_ETERNA) )
	{
		send_to_char( "Demasiado tarde.\n\r", ch );
		return;
	}

	if ( (al = en_alista(ch, arena_table[temp].jugadores )) == NULL )
	{
		send_to_char( "???\n\r", ch );
		bugf( "do_retirar : jugador %s no esta en lista, arena %d", ch->name, temp );
		return;
	}

	arena_table[temp].jugadores = extract_alist( al, arena_table[temp].jugadores );

	send_to_alist( temp, "[#BARENA#b] #B%s#b se retira de la Arena.\n\r", ch->name );

	send_to_char( "Ok.\n\r", ch );

	if ( IS_SET(arena_table[temp].flags, ARENA_ETERNA) )
		arena_reset_char( ch, ROOM_VNUM_ALTAR, 0 );

	if ( arena_table[temp].jugadores == NULL )
		arena_table[temp].status = ARENA_LIBRE;
}

ALIST * extract_alist( ALIST *al, ALIST *lista )
{
	if ( al == lista )
		lista = lista->next;
	else
	{
		ALIST * alt;

		for ( alt = lista; alt; alt = alt->next )
			if ( alt->next == al )
				break;

		if ( !alt )
		{
			bugf( "extract_alist : lista invalida, char %s", al->ch->name );
			return lista;
		}

		alt->next = al->next;
	}

	free_alist(al);

	return lista;
}

void arena_reset_char( CHAR_DATA *ch, int vnum, int reset )
{
	AFFECT_DATA *paf, *paf_next;
	int pos;
	const struct flag_type * flagt;
	int indice = esta_inscrito(ch);
	ALIST * al = indice != -1 ? en_alista(ch,arena_table[indice].jugadores) : NULL;

	if ( reset > 0 )
	{
		if ( reset == 2 )
			for ( paf = ch->affected; paf; paf = paf_next )
			{
				paf_next = paf->next;

				if ( paf->type == TO_AFFECTS
				||   paf->type == TO_AFFECTS2 )
				{
					flagt = (paf->type == TO_AFFECTS) ? affect_flags : affect2_flags;

					pos = flagtablepos( flagt, paf->bitvector );

					if ( pos != -1 && flagt[pos].settable == FALSE )
						continue;
				}

				affect_remove( ch, paf );
			}

		if (al)
		{
			ch->hit			= al->curhit;
			ch->mana		= al->curmana;
			ch->move		= al->curmove;
		}
		else
		{
			ch->hit		= ch->max_hit;
			ch->mana	= ch->max_mana;
			ch->move	= ch->max_move;
		}
	}

	if (ch->fighting)
		stop_fighting(ch, FALSE);

	update_pos(ch);

	if ( vnum )
	{
		char_from_room(ch);
		char_to_room(ch, get_room_index(vnum) );
		do_look(ch, "auto");
	}
}

void do_arena_listo( CHAR_DATA *ch, char *argument )
{
	ALIST * al;
	int temp;

	if ( (temp = esta_inscrito(ch)) == -1 )
	{
		send_to_char( "No estas inscrito.\n\r", ch );
		return;
	}

	if ( arena_table[temp].status != ARENA_LIBRE )
	{
		send_to_char( "Demasiado tarde.\n\r", ch );
		return;
	}

	if ( arena_table[temp].minjug > count_alista(arena_table[temp].jugadores) )
	{
		printf_to_char( ch, "Faltan %d jugadores para poder empezar la batalla.\n\r",
			arena_table[temp].minjug - count_alista(arena_table[temp].jugadores) );
		return;
	}

	if ( !can_recall(ch) )
	{
		send_to_char( "Debes poder hacer recall.\n\r", ch );
		return;
	}

	if ( !IS_SET(ch->in_room->room_flags, ROOM_SAFE) )
	{
		send_to_char( "Debes estar en un cuarto seguro.\n\r", ch );
		return;
	}

	send_to_alist( temp, "[#BARENA#b] #B%s#b empieza la batalla.\n\r", ch->name );

	for ( al = arena_table[temp].jugadores; al; al = al->next )
		arena_reset_char( al->ch, number_range(arena_table[temp].desde, arena_table[temp].hasta), 0 );

	arena_table[temp].status = ARENA_OCUPADA;
}

void do_arena( CHAR_DATA *ch, char * argument )
{
	char arg[MIL];

	if ( IS_NPC(ch) )
		return;

	argument = one_argument( argument, arg );

	if ( !str_cmp( arg, "jugar" ) )
	{
		do_arena_listo( ch, argument );
		return;
	}

	if ( !str_cmp( arg, "inscribir" ) )
	{
		do_inscribir( ch, argument );
		return;
	}

	if ( !str_cmp( arg, "retirar" ) )
	{
		do_retirar( ch, argument );
		return;
	}

	if ( !str_cmp( arg, "lista" ) )
	{
		do_arenalist( ch, argument );
		return;
	}

	if ( !str_cmp( arg, "status" ) )
	{
		do_arenastatus( ch, argument );
		return;
	}

	if ( !str_cmp( arg, "retar" ) )
	{
		do_retar( ch, argument );
		return;
	}

	if ( !str_cmp( arg, "aceptar" ) )
	{
		do_aceptar( ch, argument );
		return;
	}

	if ( !str_cmp( arg, "rechazar" ) )
	{
		do_rechazar( ch, argument );
		return;
	}

	if ( !str_cmp( arg, "apostar" ) )
	{
		do_apostar( ch, argument );
		return;
	}

	if ( !str_cmp( arg, "probar" ) )
	{
		do_arena_probar( ch, argument );
		return;
	}

	send_to_char( "Sintaxis : arena lista\n\r", ch );
	send_to_char( "           arena status\n\r", ch );
	send_to_char( "           arena inscribir [arena]\n\r", ch );
	send_to_char( "           arena retirar\n\r", ch );
	send_to_char( "           arena jugar\n\r", ch );
	send_to_char( "           arena retar [jugador]\n\r", ch );
	send_to_char( "           arena retar anular\n\r", ch );
	send_to_char( "           arena aceptar\n\r", ch );
	send_to_char( "           arena rechazar\n\r", ch );
	send_to_char( "           arena apostar [jugador] [cantidad]\n\r", ch );
	send_to_char( "           arena probar [nombre monstruo]\n\r", ch );

	return;
}

void arena_reset( int temp )
{
	ALIST * atmp, * atmpnext;

	for ( atmp = arena_table[temp].jugadores; atmp; atmp = atmpnext )
	{
		atmpnext = atmp->next;
		arena_table[temp].jugadores = extract_alist(atmp, arena_table[temp].jugadores);
	}

	arena_table[temp].status	= ARENA_LIBRE;
}

void arena_apuestas_check(int temp, CHAR_DATA *ganador, CHAR_DATA *perdedor, int apuestas)
{
	CHAR_DATA *ch;
	float porcentaje;
	int ganado;

	for ( ch = char_list; ch; ch = ch->next )
		if ( !IS_NPC(ch) && ch->pcdata->apostando )
		{
			if (ch->pcdata->apostando == ganador)
			{
				porcentaje = (float) ch->pcdata->apuesta / apuestas;
				ganado = arena_table[temp].pozo * porcentaje;

				printf_to_char( ch, "Ganas %d monedas de oro!\n\r", ganado );
				ch->gold += ganado;
				ch->pcdata->apostando = NULL;
				ch->pcdata->apuesta = 0;
			}
			else
			if (ch->pcdata->apostando == perdedor)
			{
				send_to_char( "Perdiste!\n\r", ch );
				ch->pcdata->apostando = NULL;
				ch->pcdata->apuesta = 0;
			}
		}
}

void check_arena( CHAR_DATA * ch, CHAR_DATA * victim )
{
	ALIST * al = NULL, *tmpal = NULL;
	int temp = esta_inscrito(ch);

	if (temp == -1)
	{
		temp = esta_inscrito(victim);

		if (temp == -1)
		{
			bugf("check_arena : ni ch %s ni vict %s estan inscritos",
				ch->name, victim->name );
			if (IS_NPC(victim))
				extract_char(victim,TRUE);
			return;
		}
	}

	send_to_alist( temp, "[#BARENA#b] #B%s#b ha muerto a manos de #B%s#b.\n\r", victim->name, ch->name );

	stop_fighting(ch, TRUE);
	stop_fighting(victim, TRUE);

	al = en_alista( ch, arena_table[temp].jugadores );
	tmpal = en_alista( victim, arena_table[temp].jugadores );

	if ( IS_SET(arena_table[temp].flags, ARENA_ETERNA) )
	{
		if (!IS_NPC(ch))
		{
			if (al)
				al->frags++;
			else
				bugf( "check_arena : al NULL, char %s, vict %s", ch->name, victim->name );
		}
		if (!IS_NPC(victim))
			arena_reset_char(victim, number_range(arena_table[temp].desde, arena_table[temp].hasta), 2 );
		else
			extract_char(victim,TRUE);
		return;
	}

	if ( IS_SET(arena_table[temp].flags, ARENA_PERSONAL) )
	{
		char buf[MIL];

		if ( !IS_NPC(ch) && !IS_NPC(victim) )
		{
			sprintf( buf, "[#BARENA#b] #B%s#b ha derrotado a #B%s#b!\n\r",
				ch->name, victim->name );
			do_info( NULL, buf );
		}

		if (!IS_NPC(ch))
			ch->pcdata->victorias++;
		if (!IS_NPC(victim))
			victim->pcdata->derrotas++;

		arena_apuestas_check(temp, ch, victim, al->apuestas);
		arena_reset(temp);
		if (IS_NPC(ch))
			extract_char(ch, TRUE);
		else
			arena_reset_char(ch, ROOM_VNUM_AWINNER, 1);
		if (IS_NPC(victim))
			extract_char(victim, TRUE);
		else
			arena_reset_char(victim, ROOM_VNUM_ALOSER, 1);
		return;
	}

	if (IS_NPC(victim))
		extract_char(victim,TRUE);
	else
		arena_reset_char(victim, ROOM_VNUM_ALTAR, 2);

	if (tmpal)
		arena_table[temp].jugadores = extract_alist( tmpal, arena_table[temp].jugadores );

	if ( count_alista(arena_table[temp].jugadores) == 1 )
	{
		send_to_char( "Eres el #B#FVENCEDOR#f#b!!!\n\r", ch );
		arena_reset_char(ch, ROOM_VNUM_ALTAR, 2);
		arena_table[temp].jugadores = extract_alist( arena_table[temp].jugadores, arena_table[temp].jugadores );
		arena_table[temp].status = ARENA_LIBRE;
		return;
	}

	return;
}

int arena_room_lookup( int vnum )
{
	int i;

	for ( i = 0; arena_table[i].name; i++ )
		if ( ENTRE_I(arena_table[i].desde, vnum, arena_table[i].hasta) )
			return i;

	return -1;
}

void arena_quit_handler( CHAR_DATA *ch, int temp )
{
	ALIST * al = en_alista(ch, arena_table[temp].jugadores);

	if ( !al )
	{
		bugf( "arena_quit_handler : al NULL, ch %s", ch->name );
		return;
	}

	arena_table[temp].jugadores = extract_alist( al, arena_table[temp].jugadores );

	if ( arena_table[temp].status != ARENA_LIBRE
	&&   count_alista(arena_table[temp].jugadores) == 1 )
	{
		send_to_char( "Ganaste por abandono.\n\r", arena_table[temp].jugadores->ch );
		arena_reset_char( arena_table[temp].jugadores->ch, ROOM_VNUM_ALTAR, 1 );
		arena_reset(temp);
	}
}

CHAR_DATA *retador( CHAR_DATA *ch )
{
	CHAR_DATA *temp;

	for ( temp = char_list; temp; temp = temp->next )
		if ( !IS_NPC(temp) && temp->pcdata->retando == ch )
			return temp;

	return NULL;
}

void do_arena_probar( CHAR_DATA *ch, char * argument )
{
	CHAR_DATA *victim;
	ALIST * al;

	if ( IS_NULLSTR(argument) )
	{
		send_to_char( "Sintaxis : #Barena probar [nombre monstruo]#n\n\r", ch );
		return;
	}

	if ( (victim = get_char_world(ch, argument)) == NULL )
	{
		send_to_char( "Ese monstruo no existe.\n\r", ch );
		return;
	}

	if ( !IS_NPC(victim) )
	{
		act( "$N es un jugador, no un monstruo.", ch, NULL, chToEnt(victim), TO_CHAR );
		return;
	}

	if ( IS_SET(victim->act, ACT_PROTOTIPO) )
	{
		act( "$N no puede pelear todavia.", ch, NULL, chToEnt(victim), TO_CHAR );
		return;
	}

	if ( DINERO(ch) < getNivelPr(victim)*1000 )
	{
		send_to_char( "No tienes suficiente dinero!\n\r", ch );
		return;
	}

	if ( arena_table[ARENA_PERS_DEFAULT].jugadores != NULL )
	{
		send_to_char( "Espera a que se desocupe la arena personal.\n\r", ch );
		return;
	}

	if ( !IS_SET(ch->in_room->room_flags, ROOM_SAFE) )
	{
		send_to_char( "Debes estar en cuarto seguro antes de entrar a pelear.\n\r", ch );
		return;
	}

	if ( !can_recall(ch) )
	{
		send_to_char( "Debes poder hacer recall.\n\r", ch );
		return;
	}

	if (ch->hit < ch->max_hit)
	{
		send_to_char( "Debes estar perfectamente sano para poder entrar a la arena.\n\r", ch );
		return;
	}

	deduct_cost(ch, getNivelPr(victim)*1000);

	victim = create_mobile(victim->pIndexData);
	char_to_room(victim, get_room_index(ROOM_VNUM_LIMBO));

	inscribir_jugador(ch, ARENA_PERS_DEFAULT);
	inscribir_jugador(victim, ARENA_PERS_DEFAULT);

	for ( al = arena_table[ARENA_PERS_DEFAULT].jugadores; al; al = al->next )
		arena_reset_char( al->ch, number_range(arena_table[ARENA_PERS_DEFAULT].desde, arena_table[ARENA_PERS_DEFAULT].hasta), 0 );

	arena_table[ARENA_PERS_DEFAULT].status = ARENA_OCUPADA;
	arena_table[ARENA_PERS_DEFAULT].pozo = 0;
}

void do_aceptar( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *victim;
	int temp;
	ALIST *al;
	char buf[MIL];

	if ( IS_NPC(ch) || !ch->desc )
		return;

	if ( (victim = retador(ch)) == NULL )
	{
		send_to_char( "No has sido retado por nadie.\n\r", ch );
		return;
	}

	if ( IS_NULLSTR(argument) )
		temp = ARENA_PERS_DEFAULT;
	else
		temp = arena_lookup( argument );

	if ( temp == -1 )
	{
		send_to_char( "Debes especificar una arena para poder pelear.\n\r", ch );
		return;
	}

	if ( !IS_SET(arena_table[temp].flags, ARENA_PERSONAL) )
	{
		send_to_char( "Esa arena no sirve.\n\r", ch );
		return;
	}

	if ( arena_table[temp].jugadores != NULL )
	{
		send_to_char( "Esa arena esta ocupada.\n\r", ch );
		return;
	}

	if ( !IS_SET(ch->in_room->room_flags, ROOM_SAFE)
	||   !IS_SET(victim->in_room->room_flags, ROOM_SAFE) )
	{
		send_to_char( "Ambos deben estar en cuartos seguros antes de entrar a pelear.\n\r", ch );
		return;
	}

	if ( !can_recall(ch) || !can_recall(victim) )
	{
		send_to_char( "Deben poder hacer recall.\n\r", ch );
		return;
	}

	if (ch->hit < ch->max_hit)
	{
		send_to_char( "Debes estar perfectamente sano para poder entrar a la arena.\n\r", ch );
		return;
	}

	if ( victim->hit < victim->max_hit )
	{
		send_to_char( "Tu retador no esta lo suficientemente sano para poder entrar a la arena.\n\r", ch );
		return;
	}

	do_info( NULL, "[#BARENA#b] Los siguientes jugadores han entrado a luchar en la arena:\n\r" );

	sprintf( buf, "[#BARENA#b] %s (nivel %d/%d victorias/%d derrotas)",
			ch->name, getNivelPr(ch), ch->pcdata->victorias,
			ch->pcdata->derrotas );
	do_info( NULL, buf );

	sprintf( buf, "[#BARENA#b] %s (nivel %d/%d victorias/%d derrotas)\n\r",
			victim->name, getNivelPr(victim), victim->pcdata->victorias,
			victim->pcdata->derrotas );
	do_info( NULL, buf );

	inscribir_jugador( ch, temp );
	inscribir_jugador( victim, temp );

	for ( al = arena_table[temp].jugadores; al; al = al->next )
		arena_reset_char( al->ch, number_range(arena_table[temp].desde, arena_table[temp].hasta), 0 );

	arena_table[temp].status = ARENA_OCUPADA;
	arena_table[temp].pozo = 0;

	victim->pcdata->retando = NULL;
}

void do_retar( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *victim;

	if ( IS_NPC(ch) || !ch->desc )
		return;

	if ( ch->pcdata->retando )
	{
		if ( !str_cmp(argument, "anular") )
		{
			act( "$N retira su reto.", ch->pcdata->retando, NULL, chToEnt(ch), TO_CHAR );
			send_to_char( "Retiras tu reto.\n\r", ch );
			ch->pcdata->retando = NULL;
			return;
		}

		printf_to_char( ch, "Estas retando a %s.\n\r", SELFPERS(ch->pcdata->retando) );
		return;
	}

	if ( (victim = retador(ch)) )
	{
		printf_to_char( ch, "%s te reto a una lucha. Acepta o rechaza.\n\r", SELFPERS(victim) );
		return;
	}

	if ( esta_inscrito(ch) != -1 )
	{
		send_to_char( "Estas inscrito en la arena. No puedes retar.\n\r", ch );
		return;
	}

	if ( (victim = get_char_world( ch, argument )) == NULL
	||    IS_NPC(victim)
	||    ch == victim)
	{
		send_to_char( "Esa persona no esta jugando.\n\r", ch );
		return;
	}

	if ( getNivelPr(victim) < 10 )
	{
		act( "$N es un$O novat$O.", ch, NULL, chToEnt(victim), TO_CHAR );
		return;
	}

	if ( victim->pcdata->retando )
	{
		printf_to_char( ch, "%s esta retando a otra persona.\n\r", SELFPERS(victim) );
		return;
	}

	if ( esta_inscrito(victim) != -1 )
	{
		printf_to_char( ch, "%s esta inscrito en la arena. No puedes retarlo.\n\r", SELFPERS(victim) );
		return;
	}

	if ( !ch->desc )
		return;

	if ( !victim->desc )
	{
		printf_to_char( ch, "%s no tiene link.\n\r", SELFPERS(victim) );
		return;
	}

	if ( !str_cmp(victim->desc->host, ch->desc->host)
	&&   !str_cmp(victim->desc->ident, ch->desc->ident) )
	{
		send_to_char( "Si, claro. Como no.\n\r", ch );
		return;
	}

	ch->pcdata->retando = victim;

	printf_to_char( ch, "Has retado a %s a una lucha mortal.\n\r", SELFPERS(victim) );
	printf_to_char( victim, "%s te ha retado a una lucha mortal.\n\r", SELFPERS(ch) );
	send_to_char( "Escribe : #Barena ACEPTAR#b para aceptar el reto.\n\r", victim );
	send_to_char( "          #Barena RECHAZAR#b si te acobardaste.\n\r", victim );
}

void do_rechazar( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *victim;

	if ( IS_NPC(ch) || !ch->desc )
		return;

	if ( (victim = retador(ch)) == NULL )
	{
		send_to_char( "Nadie te ha retado.\n\r", ch );
		return;
	}

	act( "$N ha rechazado tu reto.", victim, NULL, chToEnt(ch), TO_CHAR );
	act( "Rechazas cobardemente el reto de $N.", ch, NULL, chToEnt(victim), TO_CHAR );

	victim->pcdata->retando = NULL;
}

void do_apostar( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *victim;
	ALIST * al;
	int temp, valor;
	char arg[MIL];

	if ( IS_NPC(ch) || !ch->desc )
		return;

	argument = one_argument( argument, arg );

	if ( IS_NULLSTR(arg) || IS_NULLSTR(argument) )
	{
		send_to_char( "Sintaxis : arena apostar [jugador] [cantidad]\n\r", ch );
		return;
	}

	if ( ch->pcdata->apostando )
	{
		printf_to_char( ch, "Ya le estas apostando $%d a %s.\n\r",
			ch->pcdata->apuesta, SELFPERS(ch->pcdata->apostando) );
		return;
	}

	if ( (victim = get_char_world(ch, arg)) == NULL
	||   IS_NPC(victim) )
	{
		send_to_char( "No esta jugando.\n\r", ch );
		return;
	}

	if ( (temp = esta_inscrito(victim)) == -1 )
	{
		send_to_char( "No esta inscrito.\n\r", ch );
		return;
	}

	if ( !IS_SET(arena_table[temp].flags, ARENA_PERSONAL) )
	{
		send_to_char( "No puedes apostar en esa pelea.\n\r", ch );
		return;
	}

	valor = atoi(argument);

	if ( valor < 1 || valor > 1000 )
	{
		send_to_char( "Cantidad es entre 1 y 1000.\n\r", ch );
		return;
	}

	if ( ch->gold < valor )
	{
		send_to_char( "No tienes esa cantidad de monedas de oro!\n\r", ch );
		return;
	}

	al = en_alista( victim, arena_table[temp].jugadores );

	if ( !al )
	{
		send_to_char( "Hay un error.\n\r", ch );
		bugf( "do_apostar : jugador %s no esta en arena %d!",
			victim->name, temp );
		return;
	}

	ch->gold -= valor;
	ch->pcdata->apostando = victim;
	ch->pcdata->apuesta = valor;
	arena_table[temp].pozo += valor;
	al->apuestas += valor;

	printf_to_char( ch, "Apuestas %d a %s.\n\r", valor, SELFPERS(victim) );

	return;
}