#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "emlen.h"
void 
do_setlevels (CHAR_DATA * ch, char *argy)
{
  int i;
  int k;
  char arg1[500];
  char arg2[500];
  char arg3[500];
  bool two_prizes;
  DEFINE_COMMAND ("setlevels", do_setlevels, POSITION_DEAD, 110, LOG_ALWAYS, "Sets up a battleground.")

    argy = one_argy (argy, arg1);
  argy = one_argy (argy, arg2);
  argy = one_argy (argy, arg3);
  if (!is_number (arg2) || !is_number (arg1) || !is_number (arg3))
    {
      send_to_char ("Syntax is Setlevels <min> <max> <prize1_vnum> <prize2_vnum>.\n\r", ch);
      return;
    }
  k = atoi (arg2);
  i = atoi (arg1);
  if (i < 0 || i > 100 || k < 0 || k > 100)
    {
      send_to_char ("Ranges are 0-100.\n\r", ch);
      return;
    }
  min_level = i;
  max_level = k;
  if (argy != NULL && argy != "" && argy[0] != '\0' && is_number (argy))
    two_prizes = TRUE;
  else
    two_prizes = FALSE;
  if (get_obj_index (atoi (arg3)) == NULL)
    {
      send_to_char ("Invalid prize vnum.\n\r", ch);
      return;
    }
  if (two_prizes && get_obj_index (atoi (argy)) == NULL)
    {
      send_to_char ("Invalid prize vnum #2.\n\r", ch);
      return;
    }
  prize_vnum_1 = atoi (arg3);
  if (two_prizes)
    prize_vnum_2 = atoi (argy);
  else
    prize_vnum_2 = 0;
  send_to_char ("Minimum and maximum battleground level, and prize(s) set.\n\r", ch);
  ticks_to_battlefield = 10;
  return;
}

void 
do_battleground (CHAR_DATA * ch, char *argy)
{
  DEFINE_COMMAND ("battleground", do_battleground, POSITION_DEAD, 0, LOG_NORMAL, "Signs you up, or removes you from the list of people joining the battleground (when it starts).")

    if (IS_MOB (ch))
    return;
  if (ch->pcdata->bgf)
    {
      send_to_char ("You no longer will participate in the battleground.\n\r", ch);
      ch->pcdata->bgf = FALSE;
      return;
    }
  if (LEVEL (ch) < min_level || LEVEL (ch) > max_level)
    {
      char bufff[500];
      sprintf (bufff, "The battleground is only open to levels %d to %d at this time.\n\r", min_level, max_level);
      send_to_char (bufff, ch);
      return;
    }
  send_to_char ("You will now participate in the battleground when it begins.\n\r", ch);
  ch->pcdata->bgf = TRUE;
  return;
}

long 
bidtotal (int nummy)
{
  int k;
  long x;
  x = 0;
  for (k = 0; k < 50; k++)
    {
      if (biddata.bidders[k][0] == '\0')
	continue;
      if (biddata.bids[k] == 0)
	continue;
      if (nummy == 1 && biddata.bidfor[k] == TRUE)
	continue;
      if (nummy == 2 && biddata.bidfor[k] == FALSE)
	continue;
      x += biddata.bids[k];
    }
  return x;
}

void 
give_back_money (void)
{
  int k;
  CHAR_DATA *victim;
  for (k = 0; k < 50; k++)
    {
      if (biddata.bidders[k][0] == '\0')
	continue;
      if ((victim = get_player_world (char_list, biddata.bidders[k], FALSE)) == NULL)
	continue;
      if (IS_MOB (victim))
	continue;
      victim->pcdata->bank += biddata.bids[k];
    }
  return;
}

void 
free_arena (void)
{
  int k;
  biddata.fighters[0][0] = '\0';
  biddata.fighters[1][0] = '\0';
  for (k = 0; k < 50; k++)
    {
      biddata.bidders[k][0] = '\0';
      biddata.bids[k] = 0;
      biddata.bidfor[k] = FALSE;
    }
  biddata.taking_bids = FALSE;
  biddata.waitticks = -1;
  arena_timelimit = -1;
  return;
}

int 
get_bet_slot (char *charname)
{
  int i, k;
  i = -1;
  for (k = 0; k < 50; k++)
    {
      if (!str_cmp (biddata.bidders[k], charname))
	{
	  i = k;
	  break;
	}
    }
  return i;
}

int 
free_bet_slot (void)
{
  int k;
  int i;
  i = -1;
  for (k = 0; k < 50; k++)
    {
      if (biddata.bidders[k][0] == '\0')
	{
	  i = k;
	  break;
	}
    }
  return i;
}

void 
do_cancel (CHAR_DATA * ch, char *argy)
{
  CHAR_DATA *winner;
  CHAR_DATA *loser;
  check_ced (ch);
  if (ch == NULL)
    ch = char_list->next;
  if (ch == NULL)
    ch = char_list->next;
  if (ch == NULL)
    ch = char_list->next;
  winner = get_char_world_2 (ch, biddata.fighters[0]);
  loser = get_char_world_2 (ch, biddata.fighters[1]);
  if (winner != NULL)
    {
      check_ced (winner);
      char_from_room (winner);
      char_to_room (winner, get_room_index (winner->ced->wasroom));
      winner->ced->wasroom = 0;
    }
  if (loser != NULL)
    {
      check_ced (loser);
      char_from_room (loser);
      char_to_room (loser, get_room_index (loser->ced->wasroom));
      loser->ced->wasroom = 0;
    }
  free_arena ();
  do_arenaecho (ch, "$1$BArena battle has been cancelled.", FALSE);
  return;
}

void 
end_arena (CHAR_DATA * winner, CHAR_DATA * loser)
{
  bool whowon;
  char buffy[500];
  CHAR_DATA *temp;
  int totalbets;
  int winnermoney;
  int totalwinners;
  int share;
  int k;
  stop_fighting (winner, TRUE);
  stop_fighting (loser, TRUE);
  winner->fgt->challenge = 0;
  loser->fgt->challenge = 0;
  check_ced (winner);
  check_ced (loser);
  totalbets = 0;
  winnermoney = 0;
  totalwinners = 0;
  if (!str_cmp (NAME (winner), biddata.fighters[0]))
    whowon = FALSE;
  else
    whowon = TRUE;
  if (IS_PLAYER (winner))
    winner->pcdata->no_quit = 0;
  if (IS_PLAYER (loser))
    loser->pcdata->no_quit = 0;
  char_from_room (winner);
  char_from_room (loser);
  char_to_room (winner, get_room_index (winner->ced->wasroom));
  winner->ced->wasroom = 0;
  char_to_room (loser, get_room_index (loser->ced->wasroom));
  loser->ced->wasroom = 0;
  do_save (winner, "");
  do_save (loser, "");
  if (IS_PLAYER (winner))
    winner->pcdata->challenge_time = 12;
  if (IS_PLAYER (loser))
    loser->pcdata->challenge_time = 12;
  sprintf (buffy, "$B$7Arena Victor: $5%s$7. Arena Loser: $5%s$7.", NAME (winner), NAME (loser));
  do_arenaecho (winner, buffy, FALSE);
/*tally all the bets */
/*handle all the bets */
  for (k = 0; k < 50; k++)	/*remove bank money and tally totals */
    {
      if (biddata.bidders[k][0] == '\0')
	continue;
      if (biddata.bids[k] == 0)
	continue;
      if ((temp = get_player_world (winner, biddata.bidders[k], FALSE)) == NULL)
	continue;
      if (IS_MOB (temp))
	continue;
      /*temp->pcdata->bank-=biddata.bids[k]; */
      totalbets += biddata.bids[k];
      if (biddata.bidfor[k] == whowon)
	{
	  winnermoney += biddata.bids[k];
	  totalwinners++;
	}
      else
	{
	  send_to_char ("Bummer... can kiss your bet goodbye.\n\r", temp);
	}
      temp = NULL;
    }
  for (k = 0; k < 50; k++)	/*Award money to winners */
    {
      if (biddata.bidders[k][0] == '\0')
	continue;
      if ((temp = get_player_world (winner, biddata.bidders[k], FALSE)) == NULL)
	continue;
      if (IS_MOB (temp))
	continue;
      if (biddata.bidfor[k] == whowon)
	{
	  share = (((biddata.bids[k] * 100) / winnermoney) * totalbets) / 100;
	  if (biddata.bids[k] > share + 1)
	    share = biddata.bids[k] + 1;
	  temp->pcdata->bank += share;
	  sprintf (buffy, "You just won %d coins from your bet on the arena battle!\n\rThe money has been placed in your bank account.\n\r", share);
	  send_to_char (buffy, temp);
	  temp = NULL;
	}
    }
  free_arena ();
  return;
}

void 
do_arena (CHAR_DATA * ch, char *argy)
{
  CHAR_DATA *victim;
  CHAR_DATA *victimtwo;
  char buffy[500];
  DEFINE_COMMAND ("arena", do_arena, POSITION_DEAD, 0, LOG_NORMAL, "Toggles arena message status.")

    if (IS_MOB (ch))
    return;
  if (argy != "" && argy[0] != '\0' && !str_cmp (argy, "on"))
    {
      ch->pcdata->arena_msg = TRUE;
      send_to_char ("You now will see all arena messages and can recieve challenges.\n\r", ch);
      return;
    }
  if (argy != "" && argy[0] != '\0' && !str_cmp (argy, "off"))
    {
      ch->pcdata->arena_msg = FALSE;
      send_to_char ("You will no longer see anything related to the arena.\n\r", ch);
      return;
    }
  if (LEVEL (ch) < 110)
    return;
  if (biddata.fighters[0][0] == '\0')
    {
      send_to_char ("But no battle has been set up!\n\r", ch);
      return;
    }
  if ((victim = get_char_world_2 (ch, biddata.fighters[0])) == NULL)
    {
      sprintf (buffy, "<%s> was a lamer and left the game. Battle cancelled.", biddata.fighters[0]);
      give_back_money ();
      do_arenaecho (ch, buffy, FALSE);
      do_cancel (ch, "");
      return;
    }
  if ((victimtwo = get_char_world_2 (ch, biddata.fighters[1])) == NULL)
    {
      sprintf (buffy, "<%s> was a lamer and left the game. Battle cancelled.", biddata.fighters[1]);
      give_back_money ();
      do_arenaecho (ch, buffy, FALSE);
      do_cancel (ch, "");
      return;
    }
  arena ();
  return;
}

void 
arena (void)
{
  CHAR_DATA *victim;
  CHAR_DATA *victimtwo;
  CHAR_DATA *dumchar;
  char buffy[500];
  dumchar = char_list;
  if ((victim = get_char_world_2 (dumchar, biddata.fighters[0])) == NULL)
    {
      sprintf (buffy, "<%s> was a lamer and left the game. Battle cancelled.", biddata.fighters[0]);
      give_back_money ();
      do_arenaecho (dumchar, buffy, FALSE);
      do_cancel (dumchar, "");
      return;
    }
  if ((victimtwo = get_char_world_2 (victim, biddata.fighters[1])) == NULL)
    {
      sprintf (buffy, "<%s> was a lamer and left the game. Battle cancelled.", biddata.fighters[1]);
      give_back_money ();
      do_arenaecho (victim, buffy, FALSE);
      do_cancel (victim, "");
      return;
    }
  do_arenaecho (victim, "$4$BThe arena battle has started. All bets closed.", FALSE);
  biddata.taking_bids = FALSE;
  check_fgt (victim);
  check_fgt (victimtwo);
  victim->fgt->challenge = 10;
  victimtwo->fgt->challenge = 10;
  sprintf (buffy, "%s 504", NAME (victim));
  do_transfer (victim, buffy);
  save_char_obj (victim);
  sprintf (buffy, "%s 505", NAME (victimtwo));
  do_transfer (victimtwo, buffy);
  arena_timelimit = (LEVEL (victim) + LEVEL (victimtwo)) / 2;
  save_char_obj (victimtwo);
  return;
}

void 
do_bet (CHAR_DATA * ch, char *argy)
{
  char buffy[500];
  long bet;
  int fighternum;
  char buf[500];
  int kkkk;
  DEFINE_COMMAND ("bet", do_bet, POSITION_DEAD, 0, LOG_NORMAL, "This command allows you to bet on arena fights.")

    if (!pow.arena_on)
    {
      send_to_char ("Huh?\n\r", ch);
      return;
    }
  if (IS_MOB (ch))
    return;
  if (LEVEL (ch) > 109 && str_cmp (NAME (ch), "Orin"))
    {
      send_to_char ("You aren't allowed to bet... it's like giving mortals free money :(\n\r", ch);
      return;
    }
  if (LEVEL (ch) > 100 && LEVEL (ch) < 110)
    {
      send_to_char ("Due to cheat possibilities, immortals may not bet.\n\r", ch);
      return;
    }
  if (argy == "" || argy[0] == '\0')
    {
      send_to_char ("Bet INFO for arena news/status.\n\rBet fighter# <amount> to bet on a fighter.\n\rBet SHOW to view your current bet.\n\rBet WITHDRAW to remove your current bet.\n\r", ch);
      return;
    }
  if (!biddata.taking_bids && biddata.fighters[0][0] == '\0')
    {
      send_to_char ("No arena battle has been set up.\n\r", ch);
      return;
    }
  kkkk = get_bet_slot (NAME (ch));
  if (!str_cmp (argy, "info"))
    {
      int position;
      position = ch->position;
      ch->position = POSITION_STANDING;
      act ("$B$1-----Upcoming Arena Battle-----", ch, NULL, NULL, TO_CHAR);
      sprintf (buf, "$B$2Fighter #1: $3%s", biddata.fighters[0]);
      act (buf, ch, NULL, NULL, TO_CHAR);
      sprintf (buf, "$B$2Fighter #2: $4%s", biddata.fighters[1]);
      act (buf, ch, NULL, NULL, TO_CHAR);
      act ("$B$1-------------------------------", ch, NULL, NULL, TO_CHAR);
      sprintf (buf, "\n\r\x1B[37;1mTotal Money on fighter #1 so far: \x1B[32m%d\x1B[37m.\n\rTotal Money on fighter #2 so far: \x1B[32m%d\x1B[37m.\x1B[37;0m\n\r", bidtotal (1), bidtotal (2));
      send_to_char (buf, ch);
      ch->position = position;
      return;
    }
  if (!str_cmp (argy, "show"))
    {
      sprintf (buf, "\n\rTotal Money on fighter #1 so far: %d.\n\rTotal Money on fighter #2 so far: %d.\n\r", bidtotal (1), bidtotal (2));
      send_to_char (buf, ch);
      if (kkkk == -1)
	{
	  send_to_char ("You currently have no bet placed.\n\r", ch);
	  return;
	}
      if (biddata.bidfor[kkkk] == FALSE)
	sprintf (buffy, "%s", biddata.fighters[0]);
      else
	sprintf (buffy, "%s", biddata.fighters[1]);
      sprintf (buf, "Your current bet is \x1B[34;1m%d\x1B[37;0m coins on \x1B[37;1m%s\x1B[0m.\n\r", biddata.bids[kkkk], buffy);
      send_to_char (buf, ch);
      return;
    }
  if (!biddata.taking_bids && biddata.fighters[0][0] != '\0')
    {
      send_to_char ("The battle has begun... bets are closed.\n\r", ch);
      return;
    }
/*OKAY, real bid below */
  if (!str_cmp (argy, "withdraw"))
    {
      if (kkkk == -1)
	{
	  send_to_char ("But you didn't bet anything...\n\r", ch);
	  return;
	}
      ch->pcdata->bank += biddata.bids[kkkk];
      biddata.bidders[kkkk][0] = '\0';
      biddata.bids[kkkk] = 0;
      biddata.bidfor[kkkk] = FALSE;
      send_to_char ("Bet removed.\n\r", ch);
      return;
    }
  argy = one_argy (argy, buffy);
  if (argy == "" || argy[0] == '\0')
    {
      send_to_char ("Bet INFO for arena news/status.\n\rBet # <amount> to bet on a fighter.\n\rBet SHOW to view your current bet.\n\rBet WITHDRAW to remove your current bet.\n\r", ch);
      return;
    }
  if (!is_number (argy) || !is_number (buffy))
    {
      send_to_char ("Bet INFO for arena news/status.\n\rBet # <amount> to bet on a fighter.\n\rBet SHOW to view your current bet.\n\rBet WITHDRAW to remove your current bet.\n\r", ch);
      return;
    }
  fighternum = atoi (buffy);
  bet = atoi (argy);
  if (bet < 1)
    return;
  if (fighternum != 1 && fighternum != 2)
    {
      send_to_char ("Bet INFO for arena news/status.\n\rBet # <amount> to bet on a fighter.\n\rBet SHOW to view your current bet.\n\rBet WITHDRAW to remove your current bet.\n\r", ch);
      return;
    }
  if (!str_cmp (NAME (ch), biddata.fighters[0]) && fighternum == 2)
    {
      send_to_char ("You cannot bid on your opponent!\n\r", ch);
      return;
    }
  if (!str_cmp (NAME (ch), biddata.fighters[1]) && fighternum == 1)
    {
      send_to_char ("You cannot bid on your opponent!\n\r", ch);
      return;
    }
  if (bet < 1 || bet > ch->pcdata->bank)
    {
      send_to_char ("You don't have that much money in your bank.\n\r", ch);
      return;
    }
  if (kkkk == -1)
    {
      int q;
      if ((q = free_bet_slot ()) == -1)
	{
	  send_to_char ("Sorry, too many bets in already.\n\r", ch);
	  return;
	}
      strcpy (biddata.bidders[q], NAME (ch));
      biddata.bids[q] = bet;
      if (fighternum == 1)
	biddata.bidfor[q] = FALSE;
      else
	biddata.bidfor[q] = TRUE;
      kkkk = q;
    }
  else
    {
      ch->pcdata->bank += biddata.bids[kkkk];
      biddata.bids[kkkk] = bet;
      if (fighternum == 1)
	biddata.bidfor[kkkk] = FALSE;
      else
	biddata.bidfor[kkkk] = TRUE;
    }
  if (biddata.bidfor[kkkk] == FALSE)
    sprintf (buffy, "%s", biddata.fighters[0]);
  else
    sprintf (buffy, "%s", biddata.fighters[1]);
  sprintf (buf, "Bet of \x1B[37;1m%d\x1B[0m coins placed on \x1B[32;1m%s\x1B[37;0m.\n\r", bet, buffy);
  send_to_char (buf, ch);
  send_to_char ("Bet placed. You may change it until the second the battle begins.\n\r", ch);
  ch->pcdata->bank -= bet;
  return;
}

void 
do_acceptc (CHAR_DATA * ch, char *argy)
{
  CHAR_DATA *victim;
  ROOM_DATA *r;
  char tempstr[50];
  char buf[500];
  DEFINE_COMMAND ("accept", do_acceptc, POSITION_DEAD, 0, LOG_NORMAL, "This allows you to accept an arena challenge.")

    if (!pow.arena_on)
    {
      send_to_char ("Huh?\n\r", ch);
      return;
    }
  if (IS_MOB (ch))
    return;
  if (!ch->pcdata->challenged_by)
    {
      send_to_char ("But you have not been challenged!\n\r", ch);
      return;
    }
  strcpy (tempstr, ch->pcdata->challenged_by);
  if (biddata.fighters[0][0] != '\0')
    {
      send_to_char ("Someone beat you to it; an arena battle has already been arranged\n\rby another party. Try again after the battle.\n\r", ch);
      return;
    }
  if (argy == "" || argy[0] == '\0')
    {
      sprintf (buf, "\x1B[37;1mYou have been challenged by \x1B[32m%s\x1B[37m.\x1B[37;0m Type ACCEPT YES to accept the challenge.\n\r", ch->pcdata->challenged_by);
      send_to_char (buf, ch);
      return;
    }
  if (ch->hit < ch->max_hit)
    {
      send_to_char ("You must be at your max hit points to accept the challenge.\n\r", ch);
      return;
    }
  if (str_cmp (argy, "yes"))
    return;
  if ((victim = get_char_world_2 (ch, tempstr)) == NULL)
    {
      send_to_char ("You challenger left the world.\n\r", ch);
      if (ch->pcdata->challenged_by)
	free_string (ch->pcdata->challenged_by);
      ch->pcdata->challenged_by = NULL;
      return;
    }
  if (victim->desc == NULL)
    {
      send_to_char ("Your challenger has lost link.\n\r", ch);
      return;
    }
  if (IS_MOB (victim))
    return;
  if (victim->hit < victim->max_hit)
    {
      send_to_char ("Your challenger was dumb and fought something or somehow fell below max\n\r", ch);
      send_to_char ("hitpoints. Tell your opponent to rest up, then you can accept.\n\r", ch);
      send_to_char ("Your challengee accepted but you are no longer at full hit points and thus\n\r", victim);
      send_to_char ("cannot fight the battle. Rest up and your opponent may accept later.\n\r", victim);
      return;
    }
  if (ch->in_room && ch->in_room->vnum < 1000)
    {
      send_to_char ("You cannot accept a challenge from here...\n\r", ch);
      return;
    }
#ifdef NEW_WORLD
  if ((ch->in_room->area->vnum != 1 && ch->in_room->area->vnum != 2) ||
      (IS_EVIL (ch) && ch->in_room->area->vnum == 1) ||
      (!IS_EVIL (ch) && ch->in_room->area->vnum == 2))
    {
      send_to_char ("You must be near or in one of the main cities to accept the challenge!\n\r", ch);
      return;
    }
  if ((victim->in_room->area->vnum != 1 && victim->in_room->area->vnum != 2) ||
      (IS_EVIL (victim) && victim->in_room->area->vnum == 1) ||
      (!IS_EVIL (victim) && victim->in_room->area->vnum == 2))
    {
      send_to_char ("Your challenger is no longer near a main city!\n\r", ch);
      return;
    }
#endif
  if ((r = get_room_index (VNUM_WAITONE)) == NULL)
    return;
  if (r->more && r->more->people)
    {
      send_to_char ("Someone was fucking around and screwed up the arena.  Try back later.\n\r", ch);
      return;
    }
  if ((r = get_room_index (VNUM_WAITTWO)) == NULL)
    return;
  if (r->more && r->more->people)
    {
      send_to_char ("Someone was fucking around and screwed up the arena.  Try back later.\n\r", ch);
      return;
    }
  sprintf (buf, "%s %s", NAME (victim), NAME (ch));
  do_set_fighters (ch, buf);
  if (ch->pcdata->challenged_by)
    {
      free_string (ch->pcdata->challenged_by);
      ch->pcdata->challenged_by = NULL;
    }
  victim->pcdata->challenge_time = 0;
  return;
}

void 
do_decline (CHAR_DATA * ch, char *argy)
{
  char buf[500];
  char tempstr[50];
  CHAR_DATA *victim;
  DEFINE_COMMAND ("decline", do_decline, POSITION_DEAD, 0, LOG_NORMAL, "This command allows you to decline an arena challenge")

    if (IS_MOB (ch))
    return;
  if (!ch->pcdata->challenged_by)
    {
      send_to_char ("But you have not been challenged!\n\r", ch);
      return;
    }
  strcpy (tempstr, ch->pcdata->challenged_by);
  if (argy == "" || argy[0] == '\0')
    {
      sprintf (buf, "\x1B[37;1mYou have been challenged by \x1B[32m%s\x1B[37m.\x1B[37;0m Type DECLINE YES to decline the challenge.\n\r", ch->pcdata->challenged_by);
      send_to_char (buf, ch);
      return;
    }
  if (str_cmp (argy, "yes"))
    return;
  if ((victim = get_char_world_2 (ch, tempstr)) == NULL)
    {
      send_to_char ("You challenger left the world anyway... what an idiot.\n\r", ch);
      if (ch->pcdata->challenged_by)
	free_string (ch->pcdata->challenged_by);
      ch->pcdata->challenged_by = NULL;
      return;
    }
  if (ch->pcdata->challenged_by)
    free_string (ch->pcdata->challenged_by);
  ch->pcdata->challenged_by = NULL;
  if (IS_MOB (victim))
    return;
  victim->pcdata->challenge_time = 0;
  if (victim->desc == NULL)
    {
      send_to_char ("Your challenger has lost link.\n\r", ch);
      send_to_char ("-->You have successfully declined the challenge.<--\n\r", ch);
      send_to_char ("If you are being disturbed by challenges, type CHALLENGE OFF.\n\r", ch);
      return;
    }
  send_to_char ("\x1B[37;1m*****\x1B[0mYour challenge has just been declined!\n\r", victim);
  send_to_char ("-->You have successfully declined the challenge.<--\n\r", ch);
  send_to_char ("If you are being disturbed by challenges, type CHALLENGE OFF.\n\r", ch);
  return;
}

void 
do_challenge (CHAR_DATA * ch, char *argy)
{
  char buf[500];
  CHAR_DATA *victim;
  char arg1[500];
  DEFINE_COMMAND ("challenge", do_challenge, POSITION_DEAD, 0, LOG_NORMAL, "This command allows you to challenge another player to an arena battle.")

    if (!pow.arena_on)
    {
      send_to_char ("Huh?\n\r", ch);
      return;
    }
  if (IS_MOB (ch))
    return;
  if (argy == "" || argy[0] == '\0')
    {
      send_to_char ("Format is Challenge <playername> if you wish to challenge someone.\n\r", ch);
      return;
      /* if (ch->pcdata->challenge_on) 
         {
         send_to_char("You no longer will accept any challenges from anyone.\n\r",ch);
         ch->pcdata->challenge_on=FALSE; 
         }
         else
         {
         send_to_char("You now accept challenges if given.\n\r",ch);
         ch->pcdata->challenge_on=TRUE;
         }
         return; */
    }
  if (!str_cmp (argy, "on"))
    {
      send_to_char ("You now accept challenges if given.\n\r", ch);
      ch->pcdata->challenge_on = TRUE;
      return;
    }
  if (!str_cmp (argy, "off"))
    {
      send_to_char ("You no longer will accept any challenges from anyone.\n\r", ch);
      ch->pcdata->challenge_on = FALSE;
      return;
    }
  if (biddata.fighters[0][0] != '\0')
    {
      send_to_char ("There is already a fight arranged/going on.\n\r", ch);
      return;
    }
  if (ch->hit != ch->max_hit)
    {
      send_to_char ("You must be at full hit points to challenge someone.\n\r", ch);
      return;
    }
  if (LEVEL (ch) < 6)
    {
      send_to_char ("You must be level 6 before you may fight in the arena.\n\r", ch);
      return;
    }
  if (ch->pcdata->challenge_on == FALSE)
    {
      send_to_char ("You must have challenge ON if you wish to challenge someone.\n\r", ch);
      return;
    }
  argy = one_argy (argy, arg1);
  if ((victim = get_char_world_2 (ch, arg1)) == NULL)
    {
      send_to_char ("That person is not currently playing or visible to you.\n\r", ch);
      return;
    }
  if (IS_MOB (victim))
    {
      send_to_char ("You cannot challenge NPC's.\n\r", ch);
      return;
    }
  if (ch->pcdata->bounty != 0)
    {
      send_to_char ("You may not challenge when you have a bounty!\n\r", ch);
      return;
    }
  if (!pow.arena_good_evil && ((IS_EVIL (ch) && !IS_EVIL (victim)) || (!IS_EVIL (ch) && IS_EVIL (victim))))
    {
      send_to_char ("That person is not currently playing or visible to you.\n\r", ch);
      return;
    }
  if (ch->in_room && ch->in_room->vnum < 1000)
    {
      send_to_char ("You cannot challenge someone from here...\n\r", ch);
      return;
    }
  if (victim->pcdata->bounty != 0)
    {
      send_to_char ("You cannot challenge outlaws!\n\r", ch);
      return;
    }
  if (LEVEL (victim) > 100)
    {
      send_to_char ("No challenging immorts!\n\r", ch);
      return;
    }
  if (LEVEL (ch) > 100)
    {
      send_to_char ("Immorts cannot challenge!\n\r", ch);
      return;
    }
  if (victim->pcdata->challenge_on == FALSE)
    {
      send_to_char ("That player is not accepting challenges.\n\r", ch);
      return;
    }
  if (victim->pcdata->challenged_by && argy != "" && argy[0] != '\0' && !str_cmp (argy, "cancel") && !str_cmp (NAME (ch), victim->pcdata->challenged_by))
    {
      send_to_char ("Your challenger has cancelled the challenge. What a wimp!\n\r", victim);
      send_to_char ("Challenge withdrawn.\n\r", ch);
      if (victim->pcdata->challenged_by)
	{
	  free_string (victim->pcdata->challenged_by);
	  victim->pcdata->challenged_by = NULL;
	}
      ch->pcdata->challenge_time = 0;
      return;
    }
  if (ch->pcdata->challenge_time > 0)
    {
      send_to_char ("You must wait a bit before offering another challenge.\n\r", ch);
      return;
    }
  if (ch == victim)
    {
      send_to_char ("Challenge yourself? You mentally challenged or something, STUPID?!\n\r", ch);
      return;
    }
  sprintf (buf, "\x1B[34;1mINCOMING CHALLENGE from \x1B[37m%s\x1B[34;1m.\n\r", NAME (ch));
  send_to_char (buf, victim);
  send_to_char ("\x1B[37;0mUse ACCEPT to accept the challenge, DECLINE to decline.\n\r", victim);
  ch->pcdata->challenge_time = 5;
  if (victim->pcdata->challenged_by)
    {
      free_string (victim->pcdata->challenged_by);
      victim->pcdata->challenged_by = NULL;
    }
  victim->pcdata->challenged_by = str_dup (NAME (ch));
  send_to_char ("You challenge has been successfully sent. Because the other character must\n\r", ch);
  send_to_char ("also be at full health, the response may be slow. If your victim does not\n\r", ch);
  send_to_char ("answer the challenge within 5 ticks, you may propose a challenge to\n\r", ch);
  send_to_char ("someone else. Type CHALLENGE <person> CANCEL to cancel this challenge.\n\r", ch);
  return;
}

void 
do_set_fighters (CHAR_DATA * ch, char *argy)
{
  char buffy[500];
  char buf[500];
  CHAR_DATA *victimtwo;
  CHAR_DATA *victim;
  ROOM_DATA *rm;
  ROOM_DATA *rm2;
  DEFINE_COMMAND ("setfighters", do_set_fighters, POSITION_DEAD, 110, LOG_NORMAL, "Sets arena fighters.")

    if (IS_MOB (ch))
    return;
  if (argy == "" || argy[0] == '\0')
    {
      send_to_char ("Format is setfighters <fighter1> <fighter2>.\n\r", ch);
      return;
    }
  argy = one_argy (argy, buffy);
  if (argy == "" || argy[0] == '\0')
    {
      send_to_char ("Format is setfighters <fighter1> <fighter2>.\n\r", ch);
      return;
    }
  if ((victimtwo = get_char_world_2 (ch, argy)) == NULL)
    {
      send_to_char ("The second person isn't in the world.\n\r", ch);
      return;
    }
  if ((victim = get_char_world_2 (ch, buffy)) == NULL)
    {
      send_to_char ("The first person isn't in the world.\n\r", ch);
      return;
    }
  if ((rm = get_room_index (VNUM_WAITONE)) == NULL)
    return;
  if ((rm2 = get_room_index (VNUM_WAITTWO)) == NULL)
    return;
  check_room_more (rm);
  check_room_more (rm2);
  if (rm->more->people != NULL ||
      rm2->more->people != NULL)
    {
      send_to_char ("Someone is apparently stuck in the waiting room, sorry.\n\r", victim);
      send_to_char ("Someone is apparently stuck in the waiting room, sorry.\n\r", victimtwo);
      do_cancel (ch, "");
      return;
    }
  check_ced (victim);
  check_ced (victimtwo);
  victim->ced->wasroom = victim->in_room->vnum;
  sprintf (buf, "%s %d", NAME (victim), VNUM_WAITONE);
  do_transfer (ch, buf);
  victimtwo->ced->wasroom = victimtwo->in_room->vnum;
  sprintf (buf, "%s %d", NAME (victimtwo), VNUM_WAITTWO);
  do_transfer (ch, buf);
  send_to_char ("You have been transferred to the waiting room while bets are placed.\n\r", victim);
  send_to_char ("You have been transferred to the waiting room while bets are placed.\n\r", victimtwo);
  biddata.waitticks = ARENA_WAIT_TICK;
  do_arenaecho (ch, "$B$1-----Upcoming Arena Battle-----", FALSE);
  sprintf (buf, "$B$2Fighter #1: $3%s", NAME (victim));
  do_arenaecho (ch, buf, FALSE);
  sprintf (buf, "$B$2Fighter #2: $4%s", NAME (victimtwo));
  do_arenaecho (ch, buf, FALSE);
  do_arenaecho (ch, "$B$1-------------------------------", FALSE);
  do_arenaecho (ch, "For betting info, type help bet", FALSE);
  biddata.taking_bids = TRUE;
  strcpy (biddata.fighters[0], NAME (victim));
  strcpy (biddata.fighters[1], NAME (victimtwo));
  return;
}