mud_dist/area/
/*$Id: arena.c,v 1.4 2005/02/22 23:55:15 ahsile Exp $*/

#if defined( macintosh )
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <assert.h>
#include "merc.h"

extern bool fight_in_progress;

/*=======================================================================*
 * 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 buf[MAX_STRING_LENGTH]; 

/* == First make all invalid checks == */
 if(IS_NPC(ch))
 return; 

 if( fight_in_progress )
  {
  send_to_char(AT_BLOOD,"Sorry, there is a fight in progress, please wait a few moments.\n\r",ch); 
  return; 
  }

 if(IS_SET(ch->affected_by3, AFF_CHALLENGED))
  {
  send_to_char(AT_BLOOD,"You have already been challenged, either ACCEPT or DECLINE first.\n\r",ch);
  return; 
  }

 if(ch->hit < ch->max_hit)
  {
  send_to_char(AT_BLOOD,"You must be fully healed to fight in the arena.\n\r",ch); 
  return;
  }

 if(IS_AFFECTED(ch,AFF_INVISIBLE))
 {
 send_to_char(AT_BLOOD,"Not while invisible.\n\r",ch);
 return;
 }

 if((victim = get_char_world(ch,argument)) == NULL)
  {
  send_to_char(AT_BLOOD,"They are not playing.\n\r",ch);
  return;
  }

 if(IS_NPC(victim) || IS_IMMORTAL(victim) || victim == ch )
  {
send_to_char(AT_BLOOD,"You cannot challenge NPC's, Immortals, or yourself.\n\r",ch);
return;
  }

 if(IS_AFFECTED(victim,AFF_BLIND))
 {
 send_to_char(AT_BLOOD,"That person is blind right now.\n\r",ch);
 return;
 }

 if(IS_SET(victim->affected_by3,AFF_CHALLENGER))
  {
send_to_char(AT_BLOOD,"They have already challenged someone else.\n\r",ch);
return;
  }

 if(victim->fighting != NULL )
  {
send_to_char(AT_BLOOD,"That person is engaged in battle right now.\n\r",ch); 
return; 
  }

 if(victim->hit < victim->max_hit)
  {
send_to_char(AT_BLOOD,"That player is not healthy enough to fight right now.\n\r",ch);
return;
  }

 if(victim->level <=5 )
  {
send_to_char(AT_BLOOD,"That player is just a newbie!\n\r",ch);
return; 
  }

/* == Now for the challenge == */
 SET_BIT(ch->affected_by3, AFF_CHALLENGER);
 send_to_char(AT_BLOOD,"Challenge has been sent\n\r",ch);
 act(AT_BLOOD,"$n has challenged you to a death match.",ch,NULL,victim,TO_VICT);
 sprintf(buf,"type: ACCEPT %s to meet the challenge.\n\r",ch->name);
 send_to_char(AT_BLOOD,buf,victim);
 sprintf(buf,"type: DECLINE %s to chicken out.\n\r",ch->name); 
 send_to_char(AT_BLOOD,buf,victim);
 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_accept(CHAR_DATA *ch, char *argument)
 {
 CHAR_DATA *victim; 
 char buf[MAX_STRING_LENGTH]; 
 int char_room; 
 int vict_room; 
 extern bool fight_in_progress; 

 /*== Default to NO fight in progress ==*/
 fight_in_progress = !fight_in_progress;

 /*== the room VNUM's for our arena.are ==*/
 /* we use 1051 thru 1066 for a 4x4 arena */
 char_room = number_range(2700,2799);
 vict_room = number_range(2700,2799);

/* == first make all invalid checks == */
 if(IS_NPC(ch))
 return;

 if((victim = get_char_world(ch,argument)) == NULL)
  {
send_to_char(AT_BLOOD,"They aren't logged in!\n\r",ch);
return;
  }

 if(victim == ch)
  {
send_to_char(AT_BLOOD,"You haven't challenged yourself!\n\r",ch);
return;
  }

 if(!IS_SET(victim->affected_by3, AFF_CHALLENGER))
  {
send_to_char(AT_BLOOD,"That player hasn't challenged you!\n\r",ch); 
return; 
  }

/* == now get to business == */
SET_BIT(ch->affected_by3, AFF_CHALLENGED); 
send_to_char(AT_BLOOD,"You have accepted the challenge!\n\r",ch);
act(AT_BLOOD,"$n accepts your challenge!",ch,NULL,victim,TO_VICT);
/* == announce the upcoming event == */
sprintf(buf,"[Arena] %s (%d wins) (%d losses)\n\r",
victim->name,victim->pcdata->awins,victim->pcdata->alosses);
log_string( buf, CHANNEL_INFO, -1 );
/*NEWS(buf);*/
sprintf(buf,"[Arena] %s (%d wins) (%d losses)\n\r",ch->name,ch->pcdata->awins,ch->pcdata->alosses); 
log_string( buf, CHANNEL_INFO, -1 );
/*NEWS(buf); */
/* == now move them both to an arena for the fun == */
send_to_char(AT_BLOOD,"You make your way into the arena.\n\r",ch);
char_from_room(ch); 
char_to_room(ch,get_room_index(char_room));
send_to_char(AT_BLOOD,"You make your way to the arena.\n\r",victim); 
char_from_room(victim); 
char_to_room(victim,get_room_index(vict_room)); 
/*NEWS("[Arena] To wager on the fight, type: wager <amount> <player 
name>\n\r");*/ 
sprintf(buf,"[Arena] To wager on the fight, type: wager <amount> <player name>\n\r");
log_string( buf, CHANNEL_INFO, -1 );
fight_in_progress = TRUE; 
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; 

/*== make all invalid checks == */
  if(IS_NPC(ch))
  return;
  
 if((victim = get_char_world(ch,argument)) == NULL)
  {
send_to_char(AT_BLOOD,"They aren't logged in!\n\r",ch);
return;
  }

 if(!IS_SET(victim->affected_by3, AFF_CHALLENGER))
  {
send_to_char(AT_BLOOD,"That player hasn't challenged you.\n\r",ch);
return;
  }

 if(victim == ch)
 return; 

/*== now actually decline == */
REMOVE_BIT(victim->affected_by3, AFF_CHALLENGER); 
send_to_char(AT_BLOOD,"Challenge declined!\n\r",ch);
act(AT_BLOOD,"$n has declined your challenge.",ch,NULL,victim,TO_VICT);
return;
}

/*======================================================================*
 * function: do_bet                                                     *
 * purpose: to allow players to wager on the outcome of arena battles   *
 * written by: Doug Araya (whiplash@tft.nacs.net) 6-10-96               *
 *======================================================================*/
void do_wager(CHAR_DATA *ch, char *argument)
 {
 char arg[MAX_INPUT_LENGTH]; 
 char buf[MAX_STRING_LENGTH]; 
 CHAR_DATA *fighter; 
 int wager; 

 argument = one_argument(argument, arg); 

 if(argument[0] == '\0' || !is_number(arg))
  {
send_to_char(AT_BLOOD,"Syntax: WAGER [amount] [player]\n\r",ch); 
return;
  }

/*== disable the actual fighters from betting ==*/
 if(IS_SET(ch->affected_by3,AFF_CHALLENGER) || IS_SET(ch->affected_by3,AFF_CHALLENGED))
  {
send_to_char(AT_BLOOD,"You can't bet on this battle.\n\r",ch); 
return; 
  }

/*== make sure the choice is valid ==*/
 if((fighter = get_char_world(ch,argument)) == NULL)
  {
send_to_char(AT_BLOOD,"That player is not in the arena.\n\r",ch); 
return; 
  }

/*== do away with the negative number trickery ==*/
 if(!str_prefix("-",arg))
  {
send_to_char(AT_BLOOD,"Error: Invalid argument!\n\r",ch); 
return; 
  }

 wager   = atoi(arg);

 if(wager > 50000 || wager < 1)
  {
send_to_char(AT_BLOOD,"Wager range is between 1 and 1000\n\r",ch);
return; 
  }

/*== make sure they have the cash ==*/
 if(wager > ch->gold)
  {
send_to_char(AT_BLOOD,"You don't have that much gold to wager!\n\r",ch); 
return; 
  }

/*== now set the info ==*/
ch->gladiator = fighter;
ch->pcdata->plr_wager = wager;
sprintf(buf,"You have placed a %d gold wager on %s\n\r",wager,fighter->name);
send_to_char(AT_BLOOD,buf,ch);
return; 
}