swfote2.1/.slog/
swfote2.1/backup/u/
swfote2.1/bin/cygwin/
swfote2.1/building/
swfote2.1/doc/mudprogs/
swfote2.1/gods/
swfote2.1/html/profiles/
swfote2.1/player/
swfote2.1/player/u/
 /*********************************************************************************** 
 *                                                                                  *
 *          _______.____    __    ____       _______                  _______       *
 *         /       |\   \  /  \  /   /  _   |   ____|          __    |   ____|      *
 *        |   (----` \   \/    \/   /  (_)  |  |__    ____   _/  |_  |  |__         *
 *         \   \      \            /    _   |   __|  /  _ \  \   __\ |   __|        *
 *     .----)   |      \    /\    /    (_)  |  |    (  <_> )  |  |   |  |____       *
 *     |_______/        \__/  \__/          |__|     \____/   |__|   |_______|      *
 *                                                                                  *
 * SWFotE v2.0 (FotE v1.1 cleaned up and considerably modded)  by:                  *
 * Greg (Keberus) Mosley                                                            *
 * Roman (Trelar) Arnold                                                            *
 *                                                                                  *
 * SWFotE v1 & v1.1 copyright (c) 2002 was created by                               *
 * Chris 'Tawnos' Dary (cadary@uwm.edu),                                            *
 * Korey 'Eleven' King (no email),                                                  *
 * Matt 'Trillen' White (mwhite17@ureach.com),                                      *
 * Daniel 'Danimal' Berrill (danimal924@yahoo.com),                                 *
 * Richard 'Bambua' Berrill (email unknown),                                        *
 * Stuart 'Ackbar' Unknown (email unknown)                                          *
 *                                                                                  *
 * SWR 1.0 copyright (c) 1997, 1998 was created by Sean Cooper                      *
 * based on a concept and ideas from the original SWR immortals:                    *
 * Himself (Durga), Mark Matt (Merth), Jp Coldarone (Exar), Greg Baily (Thrawn),    *
 * Ackbar, Satin, Streen and Bib as well as much input from our other builders      *
 * and players.                                                                     *
 *                                                                                  *
 * Original SMAUG 1.4a written by Thoric (Derek Snider) with Altrag,                *
 * Blodkai, Haus, Narn, Scryn, Swordbearer, Tricops, Gorog, Rennard,                *
 * Grishnakh, Fireblade, and Nivek.                                                 *
 *                                                                                  *
 * Original MERC 2.1 code by Hatchet, Furey, and Kahn.                              *
 *                                                                                  *
 * Original DikuMUD code by: Hans Staerfeldt, Katja Nyboe, Tom Madsen,              *
 * Michael Seifert, and Sebastian Hammer.                                           *
 *                                                                                  *
 ***********************************************************************************/

/*
 * This is a new automated arena for Smaug 1.4.
 * You can do anything you want with this code, I hope it will be
 * compatible with the DOS version.
 *
 * INSTALLATION:
 * Add to mud.h
 * in pc_data ...
 * char *     betted_on;
 * int 	      bet_amt;
 * down at the bottom of mud.h with all the rest of this stuff ...
 * #define GET_BETTED_ON(ch)    ((ch)->betted_on)
 * #define GET_BET_AMT(ch) ((ch)->bet_amt)
 *
 * change around the Makefile to include this file,
 * You also have to set the room flags in the limbo.are for the arena.
 * The arena bit is 67108864 (It's not included in the help roomflags)
 * This snippet is based on the ROM arena snippet by Kevin Hoogheem
 * It was ported to SMAUG1.4 by LrdElder
 * If you have any cool additions or questions just e-mail me at
 * tdison@swetland.net - LrdElder 10/24/98
 */
 
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "mud.h"

#define PREP_START  42   /* vnum of first prep room */
#define PREP_END    43   /* vnum of last prep room */
#define ARENA_START number_range( 29, 41)    /* vnum of first real arena room*/
#define ARENA_END   41   /* vnum of last real arena room*/
#define HALL_FAME_FILE  SYSTEM_DIR "halloffame.lst"


struct hall_of_fame_element 
{
   char name[MAX_INPUT_LENGTH+1];
   time_t date;
   int award;
   struct  hall_of_fame_element *next;
};

void sportschan(char *);
void start_arena();
void show_jack_pot();
void do_game();
int num_in_arena();
void find_game_winner();
void do_end_game();
void start_game();
void silent_end();
void write_fame_list(void);
void write_one_fame_node(FILE * fp, struct hall_of_fame_element * node);
void load_hall_of_fame(void);
void find_bet_winners(CHAR_DATA *winner);
void lost_arena(CHAR_DATA *ch);


struct hall_of_fame_element *fame_list = NULL;

int ppl_challenged = 0;
int ppl_in_arena = 0;
int in_start_arena = 0;
int start_time;
int game_length;
int lo_lim;
int hi_lim;
int time_to_start;
int time_left_in_game;
int arena_pot;
int bet_pot;
int barena = 0;

extern int parsebet (const int currentbet, char *s);
extern int advatoi (char *s);

void do_bet(CHAR_DATA *ch, char *argument)
 {
   char arg[MAX_INPUT_LENGTH];
   char buf[MAX_INPUT_LENGTH];
   char buf1[MAX_INPUT_LENGTH];
   int newbet;
       
   argument = one_argument(argument,arg);
   one_argument(argument,buf1);
           
   if (IS_NPC(ch))
   {
      send_to_char("Mobs cant bet on the arena.\r\n",ch);
      return;
   }
                    
   if(arg[0]=='\0')
   {
      send_to_char("Usage: bet <player> <amt>\r\n",ch);
      return;
   }
   else if(!in_start_arena && !ppl_challenged)
   {
      send_to_char("Sorry the arena is closed, wait until it opens up to bet.\r\n", ch);
      return;
   }
   else if(ppl_in_arena)
   {
      send_to_char("Sorry Arena has already started, no more bets.\r\n", ch);
      return;
   }
   else if (!(ch->betted_on = get_char_world_ooc(ch, arg)))
      send_to_char("No such person exists in the Necropolis.", ch);
   else if (ch->betted_on == ch)
      send_to_char("That doesn't make much sense, does it?\r\n", ch);
   else if(!(IS_SET(ch->betted_on->in_room->room_flags2, ROOM_ARENA)))
      send_to_char("Sorry that person is not in the arena.\r\n", ch);
   else
      {
         if(GET_BET_AMT(ch) > 0)
         {
           send_to_char("Sorry you have already bet.\r\n", ch);
           return;
         }
         GET_BETTED_ON(ch) = ch->betted_on;
         newbet=parsebet(bet_pot,buf1); 
         if(newbet == 0)
         {
            send_to_char("Bet some credits why dont you!\r\n", ch);
            return;
         }
         if (newbet > ch->gold)
         {
            send_to_char("You don't have that much money!\n\r",ch);
            return;
         }
         if(newbet > 500)
         {
            send_to_char("Sorry the house will not accept that much.\r\n", ch);
            return;
         }
       
         ch->gold -= newbet;
         arena_pot += (newbet / 2);
         bet_pot += (newbet / 2);
         GET_BET_AMT(ch) = newbet;
         sprintf(buf, "You place %d credits on %s.\r\n", newbet, ch->betted_on->name);
         send_to_char(buf, ch);
         sprintf(buf,"%s has placed %d credits on %s.", ch->name,
         newbet, ch->betted_on->name);
         sportschan(buf);
  }
}

void do_arena(CHAR_DATA *ch, char *argument)
{
 char buf[MAX_INPUT_LENGTH];
 ROOM_INDEX_DATA *location;

 
 if (IS_NPC(ch))
 {
   send_to_char("Mobs cant play in the arena.\r\n",ch);
   return;
 }

 if(!in_start_arena)
 {
   send_to_char("The killing fields are closed right now.\r\n", ch);
   return;
 }
 
 if(ch->top_level < lo_lim)
 {
   sprintf(buf, "Sorry but you must be at least level %d to enter this arena.\r\n", lo_lim);
   send_to_char(buf, ch);
   return;	
 }
 
 if( ch->top_level > hi_lim)
 {
    send_to_char("This arena is for lower level characters.\n\r", ch);
    return;
 } 
 
 if(IS_SET(ch->in_room->room_flags2, ROOM_ARENA))
 { 
    send_to_char("You are in the arena already\r\n",ch);
    return;
 }	
 else
 {

    location = ch->in_room;
    ch->pcdata->roomarena = location;
    act(AT_RED, "$n has been whisked away to the killing fields.", ch, NULL, NULL, TO_ROOM);
    char_from_room(ch);
    char_to_room(ch, get_room_index(PREP_START)); 
    act(AT_WHITE,"$n is dropped from the sky.", ch, NULL, NULL, TO_ROOM);
    send_to_char("You have been taken to the killing fields\r\n",ch);
    do_look(ch, "auto");
    sprintf(buf, "%s has joined the blood bath.", ch->name);
    sportschan(buf);
    send_to_char(buf, ch);
    ch->hit = ch->max_hit;
    ch->mana = ch->max_mana;
    ch->move = ch->max_move; 
     return;
  }
}

void do_chaos(CHAR_DATA *ch, char *argument)
{
  char lolimit[MAX_INPUT_LENGTH];
  char hilimit[MAX_INPUT_LENGTH], start_delay[MAX_INPUT_LENGTH];
  char length[MAX_INPUT_LENGTH], buf[MAX_INPUT_LENGTH];
          
  if(argument[0] == '\0')  
  {
    send_to_char("Usage: chaos lo hi start_delay length", ch);
    return;
  }

 /*Usage: chaos lo hi start_delay cost/lev length*/
        
  argument = one_argument(argument, lolimit);
  lo_lim = atoi(lolimit);
  argument = one_argument(argument, hilimit);
  hi_lim = atoi(hilimit);
  argument = one_argument(argument, start_delay);
  start_time = atoi(start_delay);
  one_argument(argument, length);
  game_length = atoi(length);
                                 
  sprintf(buf,"LowLim %d HiLim %d Delay %d Length %d\n\r", lo_lim,
         hi_lim, start_time, game_length);
  send_to_char(buf,ch);
      
  if(hi_lim >= LEVEL_GOD + 1)
  {
     send_to_char("Please choose a hi_lim under the Imps top_level\r\n", ch);
     return;
  }
  
  if(!*lolimit || !*hilimit || !*start_delay || !*length)
  {
    send_to_char("Usage: chaos lo hi start_delay length", ch);
    return;
  }
                
  if (lo_lim >= hi_lim)
  {
    send_to_char("Ya that just might be smart.\r\n", ch);
    return;
  }
                              
  if ((lo_lim || hi_lim || game_length) < 0 )
  {
    send_to_char("I like positive numbers thank you.\r\n", ch);
    return;
  }
                                            
  if ( start_time <= 0)
  {
    send_to_char("Lets at least give them a chance to enter!\r\n", ch);
    return;
  }
  ppl_in_arena = 0;
  in_start_arena = 1;
  time_to_start = start_time;
  time_left_in_game =0;
  arena_pot =0;
  bet_pot = 0;
  barena = 1;
  start_arena();
                                   
}
                                                                                                                                             

void start_arena()
{
  char buf1[MAX_INPUT_LENGTH];
  char buf[MAX_INPUT_LENGTH];
//  DESCRIPTOR_DATA *d;
  
  
 if (!(ppl_challenged))
 {   
    if(time_to_start == 0)
    {
      in_start_arena = 0;
      show_jack_pot();
      ppl_in_arena = 1;    /* start the blood shed */
      time_left_in_game = game_length;
      start_game();
    }
    else
    {
      if(time_to_start >1)
      {
         sprintf(buf1, "&WThe Killing Fields are open to top_levels &R%d &Wthru &R%d\r\n",
                 lo_lim, hi_lim);
         sprintf(buf1, "%s%d &Whours to start\r\n", buf1, time_to_start);
         sprintf(buf1, "%s\r\nType &Rarena &Wto enter.\r\n", buf1);
         sprintf(buf, "With just %d hours to go till the start of the arena %d people have accepted the challenge!\n\r", time_to_start, num_in_arena());
         sportschan (buf);
         sportschan (buf1);
      }
      else
      {
         sprintf(buf1, "&WThe Killing Fields are open to top_levels &R%d &Wthru &R%d\r\n",
                lo_lim, hi_lim);
         sprintf(buf1, "%s1 &Whour to start\r\n", buf1);
         sprintf(buf1, "%s\r\nType &Rarena &Wto enter.\r\n", buf1);
         sprintf(buf, "With just 1 hour to go till the start of the arena %d people have accepted the challenge!\n\r",  num_in_arena());
         sportschan (buf);
         sportschan (buf1);
      }
            sprintf(buf, "&WThe arena has been opened. &R%d &Whour(s) to start.\r\n", time_to_start);
         sportschan (buf);
      }
      /* echo_to_all(AT_WHITE, buf1, ECHOTAR_ALL); */
      time_to_start--;
  }  
  else
  if (!(ppl_in_arena))
  {
    if(time_to_start == 0)
    {
      ppl_challenged = 0;
      game_length = 8;
      show_jack_pot();
      ppl_in_arena = 1;    /* start the blood shed */
      time_left_in_game = 8;
      start_game();
    }
    else 
    {
      if(time_to_start >1)
      {
        sprintf(buf1, "The duel will start in %d hours.",
                        time_to_start);
      }
      else
      {
        sprintf(buf1, "The duel will start in 1 hour.");
      }
      sportschan(buf1);
      time_to_start--;
    }
  }
}                      
                                                                                                                                                                                                                                                                                      
void start_game()
{
  CHAR_DATA *i;
  DESCRIPTOR_DATA *d;
    
  for (d = first_descriptor; d; d = d->next)
  {
  if( d->connected == CON_PLAYING )
  {
    i = d->character;
    if (IS_SET(i->in_room->room_flags2, ROOM_ARENA))
    {
       send_to_char("\r\nThe floor falls out from bellow, droping you in the arena\r\n", i);
       char_from_room(i);
//      i->pcdata->oldac = i->armor;
//       i->armor = -1500;
       char_to_room(i, get_room_index( ARENA_START));
       do_look(i,"auto");
    }
  }
 }
  do_game();
}
void do_game()
{
  char buf[MAX_INPUT_LENGTH];
  
  if(num_in_arena() == 1)
  {
    ppl_in_arena = 0;
    ppl_challenged = 0;
    find_game_winner();
  }
  else if(time_left_in_game == 0)
  {
    do_end_game();
  }
  else if(num_in_arena() == 0)
  {
    ppl_in_arena = 0;
    ppl_challenged = 0;
    silent_end();
  }
  else if(time_left_in_game % 5)
  {
     sprintf(buf, "With %d hours left in the game there are %d players left.",
             time_left_in_game, num_in_arena());
     sportschan(buf);
  }
  else if(time_left_in_game == 1)
  {
    sprintf(buf, "With 1 hour left in the game there are %d players left.",
                  num_in_arena());
    sportschan(buf);
  }
  else if(time_left_in_game <= 4)
  {
    sprintf(buf, "With %d hours left in the game there are %d players left.",
            time_left_in_game, num_in_arena());
    sportschan(buf);
  }
  time_left_in_game--;
}

void find_game_winner()
{
  char buf[MAX_INPUT_LENGTH];
//  char buf2[MAX_INPUT_LENGTH];
  CHAR_DATA *i;
  DESCRIPTOR_DATA *d;    
  ROOM_INDEX_DATA *location;
  
  struct hall_of_fame_element *fame_node;
          
  for (d = first_descriptor; d; d = d->next)
      {
       if( d->connected == CON_PLAYING )
        {
        i = d->original ? d->original : d->character;
        if (IS_SET(i->in_room->room_flags2,ROOM_ARENA)
            && (i->top_level < LEVEL_IMMORTAL))
        {
          i->hit = i->max_hit;
          i->mana = i->max_mana;
          i->move = i->max_move;
          i->challenged=NULL;
//          i->armor = i->pcdata->oldac;
          char_from_room(i);
          location = i->pcdata->roomarena;
          char_to_room(i,location);
          do_look(i, "auto");
          act(AT_YELLOW,"$n falls from the sky.", i, NULL, NULL, TO_ROOM);
          if(time_left_in_game == 1)
          {
             sprintf(buf, "After 1 hour of battle %s is declared the winner",i->name);
             sportschan(buf);
          }
          else
          {
             sprintf(buf, "After %d hours of battle %s is declared the winner",
                   game_length - time_left_in_game, i->name);
             sportschan(buf);
          }
          i->gold += arena_pot/2;
          sprintf(buf, "You have been awarded %d credits for winning the arena\r\n",
                        (arena_pot/2));
          send_to_char(buf, i);
//          sprintf(buf2, "%s awarded %d credits for winning arena", i->name,                 (arena_pot/2));
//          bug(buf2, 0);
          CREATE(fame_node, struct hall_of_fame_element, 1);
          strncpy(fame_node->name, i->name, MAX_INPUT_LENGTH);
          fame_node->name[MAX_INPUT_LENGTH] = '\0';
          fame_node->date = time(0);
          fame_node->award = (arena_pot/2);
          fame_node->next = fame_list;
          fame_list = fame_node;
          write_fame_list();
          find_bet_winners(i);
          ppl_in_arena = 0;
          ppl_challenged = 0;
        }
     }
}
}                                                                                                                                                                                                                                                                                                                     
void show_jack_pot()
{
  char buf1[MAX_INPUT_LENGTH];
  
  sprintf(buf1, "&G&W\r\n\007\007Lets get ready to RUMBLE!!!!!!!!\r\n");
  sprintf(buf1, "%sThe jack pot for this arena is %d credits\r\n",
  buf1, arena_pot);
  sprintf(buf1, "%s%d credits have been bet on this arena.\r\n\r\n",buf1, bet_pot);
  sportschan(buf1);
                    
}

void silent_end()
{
  char buf[MAX_INPUT_LENGTH];
  ppl_in_arena = 0;
  ppl_challenged = 0;
  in_start_arena = 0;
  start_time = 0;
  game_length = 0;
  time_to_start = 0;
  time_left_in_game = 0;
  arena_pot = 0;
  bet_pot = 0;
  sprintf(buf, "It looks like no one was brave enough to enter the Arena.");
  sportschan(buf);
}
       
void do_end_game()
{
  char buf[MAX_INPUT_LENGTH];
  CHAR_DATA *i;
  DESCRIPTOR_DATA *d;
  ROOM_INDEX_DATA *location;      
  for (d = first_descriptor; d; d = d->next)
  {
     if( d->connected == CON_PLAYING )

     {
       i = d->character;
       if (IS_SET(i->in_room->room_flags2, ROOM_ARENA))
       {
          i->hit = i->max_hit;
          i->mana = i->max_mana;
          i->move = i->max_move;
          i->challenged = NULL;
//          i->armor = i->pcdata->oldac;
          stop_fighting(i,TRUE);
          location = i->pcdata->roomarena;
          char_from_room(i);
          char_to_room(i, location);
          do_look(i,"auto");
          act(AT_TELL,"$n falls from the sky.", i, NULL, NULL, TO_ROOM);
       }
     }
     }
     sprintf(buf, "After %d hours of battle the Match is a draw",game_length);
     sportschan(buf);
     time_left_in_game = 0;
     ppl_in_arena=0;
     ppl_challenged = 0;
}                                                                                                                                                                  

int num_in_arena()
{
	DESCRIPTOR_DATA *d;
	int num = 0;
      
	for (d = first_descriptor; d; d = d->next)
	{
		if( d->connected == CON_PLAYING )
		{
			if (IS_SET(d->character->in_room->room_flags2,ROOM_ARENA))
			{
				if(d->character->top_level < LEVEL_IMMORTAL)
					num++;
			}
		}
	}
	return num;
}
                                                                                                        
void sportschan(char *argument)
{
  char buf1[MAX_INPUT_LENGTH];
  DESCRIPTOR_DATA *i;
        
  sprintf(buf1, "&RInfo: &W%s\r\n", argument);

  for (i = first_descriptor; i; i = i->next)
  {
    if (!i->connected && i->character)
    {
      if(IS_SET( i->character->deaf, CHANNEL_SPORTS))
	continue;

      send_to_char(buf1, i->character);
    }
  }
}
                                                               
void do_awho(CHAR_DATA *ch, char *argument)
{
  DESCRIPTOR_DATA *d;
  CHAR_DATA *tch;
  char buf[MAX_INPUT_LENGTH];
  char buf2[MAX_INPUT_LENGTH];
  int phealth;
  int num=num_in_arena();
          
  if(num==0)
  {
     send_to_char("There is noone in the arena right now.\r\n", ch);
     return;
  }
                            
  sprintf(buf,"&W  Players in the &BChaos&W Arena\r\n");
  sprintf(buf,"%s-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-", buf);
  sprintf(buf,"%s&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-\r\n", buf);
  sprintf(buf,"%sGame Length = &R%-3d   &WTime To Start &R%-3d\r\n", buf, game_length, time_to_start);
  sprintf(buf,"%s&Wtop_level Limits &R%d &Wto &R%d\r\n", buf, lo_lim, hi_lim);
  sprintf(buf,"%s         &WJackpot = &R%d\r\n", buf, arena_pot);
  sprintf(buf,"%s&W-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B", buf);
  sprintf(buf,"%s-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B-&W-&B\r\n", buf);
  send_to_char(buf, ch);
  for (d = first_descriptor; d; d = d->next)
  {
     if( d->connected == CON_PLAYING )
        {
          tch = d->character;
	  phealth = (100 * tch->hit) / tch->max_hit;
          if (IS_SET(tch->in_room->room_flags2, ROOM_ARENA)
              && (tch->top_level < LEVEL_IMMORTAL))
          {
             sprintf(buf2, "&W%12.12s         %d%%\n\r", tch->name, phealth);
             send_to_char(buf2,ch);
          }
        }
       }
   return;	
}

void do_ahall(CHAR_DATA *ch, char *argument)
{
  char site[MAX_INPUT_LENGTH], format[MAX_INPUT_LENGTH], *timestr;
  char format2[MAX_INPUT_LENGTH];
  struct hall_of_fame_element *fame_node;
      
  char buf[MAX_INPUT_LENGTH];
  char buf2[MAX_INPUT_LENGTH];
          
  if (!fame_list)
  {
     send_to_char("No-one is in the Hall of Fame.\r\n", ch);
     return;
  }
                                  
     sprintf(buf2,  "&B|---------------------------------------|\r\n");
     strcat(buf2, "|    &WPast Winners of The ");
     strcat(buf2, sysdata.mud_acronym);  
     strcat(buf2, " Arena&B     |\r\n");
     strcat(buf2, "|---------------------------------------|\r\n\r\n"); 

     send_to_char(buf2, ch);
     strcpy(format, "%-25.25s  %-10.10s  %-16.16s\r\n");
     sprintf(buf, format,
        "&RName",
        "&RDate",
        "&RAward Amt");
     send_to_char(buf, ch);
     sprintf(buf, format,
        "&B---------------------------------",
        "&B---------------------------------",
        "&B---------------------------------");
 
     send_to_char(buf, ch);
     strcpy(format2, "&W%-25.25s  &R%-10.10s  &Y%-16d\r\n");
     for (fame_node = fame_list; fame_node; fame_node = fame_node->next)
     {
        if (fame_node->date)
        {
           timestr = asctime(localtime(&(fame_node->date)));
           *(timestr + 10) = 0;
           strcpy(site, timestr);
        }
     else
        strcpy(site, "Unknown");
     sprintf(buf, format2, fame_node->name, site, fame_node->award);
     send_to_char(buf, ch);
     }
     return;
 }

void load_hall_of_fame(void)
{
  FILE *fl;
  int date, award;
  char name[MAX_INPUT_LENGTH + 1];
  struct hall_of_fame_element *next_node;
        
  fame_list = 0;
          
  if (!(fl = fopen(HALL_FAME_FILE, "r")))
  {
    perror("Unable to open hall of fame file");
    return;
  }
  while (fscanf(fl, "%s %d %d", name, &date, &award) == 3)
  {
    CREATE(next_node, struct hall_of_fame_element, 1);
    strncpy(next_node->name, name, MAX_INPUT_LENGTH);
    next_node->date = date;
    next_node->award = award;
    next_node->next = fame_list;
    fame_list = next_node;
  }
  
  fclose(fl);
  return;
}
                                                        
void write_fame_list(void)
{
  FILE *fl;
  
  if (!(fl = fopen(HALL_FAME_FILE, "w")))
  {
     bug("Error writing _hall_of_fame_list", 0);
     return;
  }
  write_one_fame_node(fl, fame_list);/* recursively write from end to start */
  fclose(fl);
                    
   return;
}
                    
void write_one_fame_node(FILE * fp, struct hall_of_fame_element * node)
{
  if (node)
  {
    write_one_fame_node(fp, node->next);
    fprintf(fp, "%s %ld %d\n",node->name,(long) node->date, node->award);
  }
}
                             
void find_bet_winners(CHAR_DATA *winner)
{
  DESCRIPTOR_DATA *d;
  CHAR_DATA *wch;
    
  char buf1[MAX_INPUT_LENGTH];
      
  for (d = first_descriptor; d; d = d->next)
  {
    if( d->connected == CON_PLAYING )
    {
       wch = d->original ? d->original : d->character;
       if ((!IS_NPC(wch)) && (GET_BET_AMT(wch) > 0) && (GET_BETTED_ON(wch) == winner))
       {
          sprintf(buf1, "You have won %d coins on your bet.\r\n",(GET_BET_AMT(wch))*2);
          send_to_char(buf1, wch);
          wch->gold += GET_BET_AMT(wch)*2;
          GET_BETTED_ON(wch) = NULL;
          GET_BET_AMT(wch) = 0;
       }	  
    }
}
}
void do_challenge(CHAR_DATA *ch, char *argument)
{
 CHAR_DATA *victim;
 char buf[MAX_INPUT_LENGTH];
 ROOM_INDEX_DATA *location;     
   
 if ( ( victim = get_char_world_ooc( ch, argument ) ) == NULL)
 {
    send_to_char("&WThat character is not of these realms!\n\r",ch);  
    return;
 }

 if ((ch->top_level > LEVEL_IMMORTAL) || (victim->top_level > LEVEL_IMMORTAL))
 {
    send_to_char("Sorry, Immortal's are not allowed to participate in the arena.\n\r",ch);
    return;
 }
         
 if (IS_NPC(victim) || IS_NPC(ch))
 {
    send_to_char("&WYou cannot challenge mobiles!\n\r",ch);
    return;
 }
 
 if (victim->name == ch->name)
 {
   send_to_char("&WYou cannot challenge yourself!",ch);
   return;
 }
 
 if (victim->top_level<5)
 {
   send_to_char("&WThat character is too young.\n\r",ch);
   return;
 }
 
 if (get_timer(victim,TIMER_PKILLED)>0)
 {
   send_to_char("&WThat player has died within the last 5 minutes and cannot be challenged!\n\r",ch);
   return;
 }
 
 if (get_timer(ch,TIMER_PKILLED)>0)
 {
   send_to_char("&WYou have died within the last 5 minutes and cannot challenge anyone.\n\r",ch);
   return;
 }        
 
 if (num_in_arena()>0)
 {
    send_to_char("&WSomeone is already in the arena!\n\r",ch);
    return;
 }
 if(ch->pcdata->release_date != 0)
 {
   send_to_char("&RYou're in hell. Dink.\n\r", ch);
   return;
 }
 if(victim->pcdata->release_date != 0)
 {
   send_to_char("&RYou cannot challenge someone in hell.\n\r", ch);
    return;
 }

 sprintf(buf,"&R%s &Whas challenged you to a duel!\n\r",ch->name);
 send_to_char(buf,victim);
 send_to_char("&WPlease either accept or decline the challenge.\n\r\n\r",victim);
 sprintf(buf,"%s has challenged %s to a duel!!\n\r",ch->name,victim->name);
 location = ch->in_room;
 ch->pcdata->roomarena = location;
 sportschan(buf);
 victim->challenged = ch;
}

void do_aaccept(CHAR_DATA *ch, char *argument)
{
  char buf[MAX_INPUT_LENGTH];
  ROOM_INDEX_DATA *location;     
  if (num_in_arena()>0)
  {
   send_to_char("Please wait until the current arena is closed before you accept.\n\r",ch);
   return;
  }

  if (!(ch->challenged))
  {
    send_to_char("You have not been challenged!\n\r",ch);
    return;
  }
  else
  {            
    CHAR_DATA *dch;
    dch = ch->challenged;
    if(!dch || dch == NULL)
    {
	send_to_char("Your challenger has left!\n\r", ch);
	ch->challenged = NULL;
	return;
    }
    location = ch->in_room;
    ch->pcdata->roomarena = location;
    sprintf(buf,"%s has accepted %s's challenge!",ch->name,dch->name);
    sportschan(buf);
    ch->challenged = NULL;
    char_from_room(ch);
    char_to_room(ch, get_room_index(PREP_END));
    do_look(ch,"auto");
    char_from_room(dch);
    char_to_room(dch, get_room_index(PREP_START));
    do_look(dch,"auto");
    ppl_in_arena = 0;
    ppl_challenged = 1;
    time_to_start = 2;
    time_left_in_game =0;
    arena_pot =0;
    bet_pot = 0;

    start_arena();
    return;
   }
}

void do_adecline(CHAR_DATA *ch, char *argument)
{
 char buf[MAX_INPUT_LENGTH];
 
 if (ch->challenged)
 {
   sprintf(buf,"%s has DECLINED %s's challenge! WHAT A WUSS!!!\n\r",ch->name,ch->challenged->name);
   sportschan(buf);
   ch->challenged=NULL;
   return;
 }
 else 
 {
   send_to_char("You have not been challenged!\n\r",ch);
   return;
 }
}                                                                                                                                                                                                 

void lost_arena(CHAR_DATA *ch)
{
   char buf[MAX_STRING_LENGTH];

   sprintf(buf, "%s has been defeated in the arena!\n\r", ch->name );
   sportschan(buf);

   return;
}