#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;
}