/*Pit by Xkilla*/
#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 "rok.h"
#include "pit.h"
void clean_pit args( ( CHAR_DATA *loser, CHAR_DATA *winner ) );
void do_pinfo args( ( CHAR_DATA *ch, char *argument ) );
bool is_inpit( CHAR_DATA *ch )
{
if ( IS_SET(ch->flag2, AFF2_INPIT) )
{
stc("You cannot do that while in the pit!\n\r",ch);
return TRUE;
}
else
return FALSE;
}
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_pinfo(ch,buf);
pit = FIGHT_CLEAR;
undo_pit(ch);
return;
}
void do_pinfo( 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( "[<Pit>] ",d->character );
send_to_char( argument, d->character );
send_to_char( " [<Pit>]\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 ( pit != FIGHT_CLEAR )
{
stc("The pit 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 pit.\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 Pit.\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 pit 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 pit fight.\n\r",ch);
return;
}
ch->challenged = victim;
victim->challenged = ch;
sprintf(buf,"%s has challenged %s to a death match in the pit.\n",ch->name,victim->name);
do_info(ch,buf);
SET_BIT(ch->flag2, AFF2_CHALLENGER);
SET_BIT(victim->flag2, AFF2_CHALLENGED);
pit = FIGHT_PRE;
return;
}
void do_pitagree( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
ROOM_INDEX_DATA *chroom;
ROOM_INDEX_DATA *victroom;
char buf[MAX_STRING_LENGTH];
if ( IS_NPC(ch) ) return;
if ( !IS_SET(ch->flag2, AFF2_CHALLENGED) )
{
stc("You weren't even challenged.\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);
pit = FIGHT_CLEAR;
sprintf(buf,"The Pit is Clear.\n");
do_pinfo(ch,buf);
}
victim = ch->challenged;
sprintf(buf,"%s has accepted %s's challenge.",ch->name, victim->name);
pit = FIGHT_START;
SET_BIT(ch->flag2, AFF2_INPIT);
SET_BIT(victim->flag2, AFF2_INPIT);
char_from_room(ch);
char_from_room(victim);
chroom = get_room_index(number_range(12000,12010));
victroom = get_room_index(number_range(12000,12010));
if ( victroom == chroom )
chroom = get_room_index(number_range(12000,12010));
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_pinfo(ch,buf);
return;
}
void clean_pit( 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_INPIT );
loser->challenged = NULL;
loser->hit = loser->max_hit;
loser->move = loser->max_move;
loser->mana = loser->max_mana;
char_from_room(loser);
char_to_room(loser, get_room_index(ROOM_VNUM_PLOSER));
REMOVE_BIT(winner->flag2, AFF2_CHALLENGED);
REMOVE_BIT(winner->flag2, AFF2_CHALLENGER);
REMOVE_BIT(winner->flag2, AFF2_INPIT );
winner->challenged = NULL;
winner->hit = winner->max_hit;
winner->mana = winner->max_mana;
winner->move = winner->max_move;
char_from_room(winner);
char_to_room(winner, get_room_index(ROOM_VNUM_PWINNER));
do_look(winner,"");
do_look(loser,"");
sprintf(buf,"%s has defeated %s!",winner->name, loser->name);
do_pinfo(winner,buf);
winner->pwins++;
loser->plosses++;
pit = FIGHT_CLEAR;
return;
}
void undo_pit( 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_INPIT);
ch->challenged = NULL;
}
else if ( victim->in_room->vnum >= 50 && victim->in_room->vnum <= 68 )
clean_pit( ch, victim );
else
{
REMOVE_BIT(ch->flag2, AFF2_CHALLENGED);
REMOVE_BIT(ch->flag2, AFF2_CHALLENGER);
REMOVE_BIT(ch->flag2, AFF2_INPIT);
ch->challenged = NULL;
REMOVE_BIT(victim->flag2, AFF2_CHALLENGED);
REMOVE_BIT(victim->flag2, AFF2_CHALLENGER);
REMOVE_BIT(victim->flag2, AFF2_INPIT);
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_INPIT) )
REMOVE_BIT(ch->flag2, AFF2_INPIT);
}
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));
}
return;
}