diff -uNr circle30bpl15_stock/src/Makefile circle30bpl15_mod/src/Makefile
--- circle30bpl15_stock/src/Makefile	Wed Mar 17 10:46:48 1999
+++ circle30bpl15_mod/src/Makefile	Wed Mar 17 10:16:47 1999
@@ -29,14 +29,14 @@
 	boards.o castle.o class.o comm.o config.o constants.o db.o fight.o \
 	graph.o handler.o house.o interpreter.o limits.o magic.o mail.o \
 	mobact.o modify.o objsave.o olc.o random.o shop.o spec_assign.o \
-	spec_procs.o spell_parser.o spells.o utils.o weather.o
+	spec_procs.o spell_parser.o spells.o utils.o weather.o arena.o
 
 CXREF_FILES = act.comm.c act.informative.c act.item.c act.movement.c \
 	act.offensive.c act.other.c act.social.c act.wizard.c alias.c ban.c \
 	boards.c castle.c class.c comm.c config.c constants.c db.c fight.c \
 	graph.c handler.c house.c interpreter.c limits.c magic.c mail.c \
 	mobact.c modify.c objsave.c olc.c random.c shop.c spec_assign.c\
-	spec_procs.c spell_parser.c spells.c utils.c weather.c
+	spec_procs.c spell_parser.c spells.c utils.c weather.c arena.c
 
 default: all
 
@@ -199,3 +199,6 @@
 weather.o: weather.c conf.h sysdep.h structs.h utils.h comm.h handler.h \
   interpreter.h db.h
 	$(CC) -c $(CFLAGS) weather.c
+arena.o: arena.c conf.h sysdep.h structs.h utils.h comm.h screen.h spells.h \
+  handler.h interpreter.h db.h arena.h
+	$(CC) -c $(CFLAGS) arena.c
\ No newline at end of file
diff -uNr circle30bpl15_stock/src/act.offensive.c circle30bpl15_mod/src/act.offensive.c
--- circle30bpl15_stock/src/act.offensive.c	Fri Mar  5 01:47:46 1999
+++ circle30bpl15_mod/src/act.offensive.c	Wed Mar 17 10:16:47 1999
@@ -28,6 +28,7 @@
 /* extern functions */
 void raw_kill(struct char_data * ch);
 void check_killer(struct char_data * ch, struct char_data * vict);
+extern int arena_ok(struct char_data *ch, struct char_data *victim);
 int compute_armor_class(struct char_data *ch);
 
 /* local functions */
@@ -74,7 +75,8 @@
       act("But nobody is fighting $M!", FALSE, ch, 0, helpee, TO_CHAR);
     else if (!CAN_SEE(ch, opponent))
       act("You can't see who is fighting $M!", FALSE, ch, 0, helpee, TO_CHAR);
-    else if (!pk_allowed && !IS_NPC(opponent))	/* prevent accidental pkill */
+    else if (!pk_allowed && !IS_NPC(opponent) && !arena_ok(ch, opponent))
+    /* prevent accidental pkilling */
       act("Use 'murder' if you really want to attack $N.", FALSE,
 	  ch, 0, opponent, TO_CHAR);
     else {
@@ -103,7 +105,7 @@
   } else if (AFF_FLAGGED(ch, AFF_CHARM) && (ch->master == vict))
     act("$N is just such a good friend, you simply can't hit $M.", FALSE, ch, 0, vict, TO_CHAR);
   else {
-    if (!pk_allowed) {
+    if (!pk_allowed && !arena_ok(ch, vict)) {
       if (!IS_NPC(vict) && !IS_NPC(ch)) {
 	if (subcmd != SCMD_MURDER) {
 	  send_to_char("Use 'murder' to hit another player.\r\n", ch);
@@ -186,6 +188,10 @@
     send_to_char("You can't backstab a fighting person -- they're too alert!\r\n", ch);
     return;
   }
+  if (!pk_allowed && !arena_ok(ch, vict)) {
+    send_to_char("You and your victim must both be in the arena!\r\n", ch);
+    return;
+  }
 
   if (MOB_FLAGGED(vict, MOB_AWARE) && AWAKE(vict)) {
     act("You notice $N lunging at you!", FALSE, vict, 0, ch, TO_CHAR);
@@ -326,6 +332,10 @@
   }
   if (vict == ch) {
     send_to_char("Aren't we funny today...\r\n", ch);
+    return;
+  }
+  if (!pk_allowed && !arena_ok(ch, vict)) {
+    send_to_char("You and your victim must both be in the arena!\r\n", ch);
     return;
   }
   percent = number(1, 101);	/* 101% is a complete failure */
diff -uNr circle30bpl15_stock/src/act.other.c circle30bpl15_mod/src/act.other.c
--- circle30bpl15_stock/src/act.other.c	Fri Mar  5 01:47:46 1999
+++ circle30bpl15_mod/src/act.other.c	Wed Mar 17 10:16:47 1999
@@ -886,7 +886,9 @@
     {"Autoexits disabled.\r\n",
     "Autoexits enabled.\r\n"},
     {"Will no longer track through doors.\r\n",
-    "Will now track through doors.\r\n"}
+    "Will now track through doors.\r\n"},
+    {"You will no longer seee arena messages.\r\n",
+    "You will now see arena messages.\r\n"}
   };
 
 
@@ -944,6 +946,9 @@
     break;
   case SCMD_TRACK:
     result = (track_through_doors = !track_through_doors);
+    break;
+  case SCMD_ARENA:
+    result = PRF_TOG_CHK(ch, PRF_ARENA);
     break;
   default:
     log("SYSERR: Unknown subcmd %d in do_gen_toggle.", subcmd);
diff -uNr circle30bpl15_stock/src/act.wizard.c circle30bpl15_mod/src/act.wizard.c
--- circle30bpl15_stock/src/act.wizard.c	Fri Mar  5 01:47:46 1999
+++ circle30bpl15_mod/src/act.wizard.c	Wed Mar 17 10:34:41 1999
@@ -21,6 +21,7 @@
 #include "house.h"
 #include "screen.h"
 #include "constants.h"
+#include "arena.h"
 
 /*   external vars  */
 extern FILE *player_fl;
@@ -1710,6 +1711,17 @@
   case '\\':
     ++argument;
     break;
+  case '%':      /* arena */
+    if (in_arena == ARENA_OFF) {
+        sprintf(buf, "The Arena is closed right now.\r\n");
+    } else if (in_arena == ARENA_START) {
+        sprintf(buf, "Arena will start in %d hour(s)\r\n", time_to_start);
+        sprintf(buf, "%sIt will last for %d hour(s)\r\n", buf, game_length);
+    } else if (in_arena == ARENA_RUNNING) {
+        sprintf(buf, "Arena will end in %d hour(s)\r\n", time_left_in_game);
+    }
+    send_to_char(buf, ch);
+    return;
   default:
     break;
   }
@@ -1943,6 +1955,7 @@
     { "shops",		LVL_IMMORT },
     { "houses",		LVL_GOD },
     { "snoop",		LVL_GRGOD },			/* 10 */
+    { "arena",          LVL_IMMORT },
     { "\n", 0 }
   };
 
@@ -2096,6 +2109,17 @@
     }
     send_to_char(*buf ? buf : "No one is currently snooping.\r\n", ch);
     break; /* snoop */
+  case 11:      /* arena */
+    if (in_arena == ARENA_OFF) {
+        sprintf(buf, "The Arena is closed right now.\r\n");
+    } else if (in_arena == ARENA_START) {
+        sprintf(buf, "Arena will start in %d hour(s)\r\n", time_to_start);
+        sprintf(buf, "%sIt will last for %d hour(s)\r\n", buf, game_length);
+    } else if (in_arena == ARENA_RUNNING) {
+        sprintf(buf, "Arena will end in %d hour(s)\r\n", time_left_in_game);
+    }
+    send_to_char(buf, ch);
+    break;
   default:
     send_to_char("Sorry, I don't understand that.\r\n", ch);
     break;
diff -uNr circle30bpl15_stock/src/arena.c circle30bpl15_mod/src/arena.c
--- circle30bpl15_stock/src/arena.c	Wed Dec 31 19:00:00 1969
+++ circle30bpl15_mod/src/arena.c	Wed Mar 17 10:16:47 1999
@@ -0,0 +1,631 @@
+/* ************************************************************************
+ *   File: arena.c                                   Addition to CircleMUD *
+ *  Usage: Implementation of a event driven arena where players pay to kill*
+ *                                                                         *
+ *  Writen by:  Kevin Hoogheem aka Goon                                    *
+ *              Modified by Billy H. Chan (STROM)                          *
+ *                                                                         *
+ * Using this code without consent by Goon will make your guts spill       *
+ * out or worse.. Maybe I will hire Lauraina Bobbet to come visit you      *
+ ************************************************************************ */
+
+#include "conf.h"
+#include "sysdep.h"
+
+#include "structs.h"
+#include "utils.h"
+#include "comm.h"
+#include "screen.h"
+#include "spells.h"
+#include "handler.h"
+#include "interpreter.h"
+#include "db.h"
+#include "arena.h"
+
+/*  external vars  */
+extern FILE *player_fl;
+extern struct room_data *world;
+extern struct char_data *character_list;
+extern struct obj_data *object_list;
+extern struct descriptor_data *descriptor_list;
+extern struct index_data *mob_index;
+extern struct index_data *obj_index;
+extern struct zone_data *zone_table;
+extern int top_of_zone_table;
+extern int restrict;
+extern room_rnum top_of_world;
+extern int top_of_mobt;
+extern int top_of_objt;
+extern int top_of_p_table;
+extern sh_int r_mortal_start_room;
+
+int in_arena = ARENA_OFF;
+int start_time;
+int game_length;
+int lo_lim;
+int hi_lim;
+int cost_per_lev;
+int time_to_start;
+int time_left_in_game;
+long arena_pot;
+long bet_pot;
+
+struct hall_of_fame_element *fame_list = NULL;
+
+void send_to_arena(char *messg);
+
+
+ACMD(do_bet)
+{
+  long newbet;
+  struct char_data *bet_on;
+
+  two_arguments(argument, arg, buf1);
+ 
+  if (IS_NPC(ch)) {
+    send_to_char("Mobs cant bet on the arena.\r\n",ch);
+    return;
+  }
+ 
+  if (!*arg) {
+    if (in_arena == ARENA_OFF) {
+      send_to_char("Sorry no arena is in going on.\r\n", ch);
+      return;
+    } else if (in_arena == ARENA_START) {
+        send_to_char("Usage: bet <player> <amt>\r\n",ch);	 
+        return;
+    } else if (in_arena == ARENA_RUNNING) {
+        send_to_char("Fighting has already begun - no more bets.\r\n", ch);
+        return;
+    }
+  }
+
+  if (in_arena == ARENA_OFF) {
+    send_to_char("The arena is closed - wait until it opens to bet.\r\n",ch);
+  } else if (in_arena == ARENA_RUNNING) {
+      send_to_char("Arena is in session, no more bets.\r\n", ch);
+  } else if (!(bet_on = get_char_vis(ch, arg, FIND_CHAR_WORLD)))
+      send_to_char(NOPERSON, ch);
+    else if (!(world[bet_on->in_room].zone == ARENA_ZONE && 
+               ROOM_FLAGGED(IN_ROOM(bet_on), ROOM_ARENA)))
+      send_to_char("Sorry that person is not in the arena.\r\n", ch);
+  else {
+    if(GET_AMT_BET(ch) > 0) {
+      send_to_char("Sorry you have already bet.\r\n", ch);
+      return;
+    }
+    GET_BETTED_ON(ch) = GET_IDNUM(bet_on); 
+    newbet =  atoi(buf1);
+    if (newbet == 0) {
+      send_to_char("Bet some gold why dont you!\r\n", ch);
+      return;
+    }
+    if (newbet > GET_GOLD(ch)) {
+      send_to_char ("You don't have that much money!\n\r",ch);
+      return;
+    }
+    if (newbet > MAX_BET) {
+      send_to_char("Sorry the house will not accept that much.\r\n", ch);
+      return;
+    }
+
+  *buf2 = '\0';
+  GET_GOLD(ch) -= newbet;  /* substract the gold */
+  arena_pot += (newbet / 2);
+  bet_pot += (newbet / 2);
+  GET_AMT_BET(ch) = newbet;
+  sprintf(buf2, "You place %ld coins on %s.\r\n", newbet, GET_NAME(bet_on));
+  send_to_char(buf2, ch);
+  *buf = '\0';
+  sprintf(buf,"%s has placed %ld coins on %s.", GET_NAME(ch),
+          newbet, GET_NAME(bet_on));
+  send_to_arena(buf);
+  }
+}
+
+
+ACMD(do_arena)
+{
+
+  if (IS_NPC(ch)) {
+    send_to_char("Mobs cant play in the arena.\r\n",ch);
+    return;
+  }
+  if (in_arena == ARENA_OFF) {
+    send_to_char("The killing fields are closed right now.\r\n", ch);
+  } else if (GET_LEVEL(ch) < lo_lim) {
+      sprintf(buf, "You must be at least level %d to enter this arena.\r\n", 
+              lo_lim);
+      send_to_char(buf, ch);
+  } else if (PLR_FLAGGED(ch, PLR_KILLER) || PLR_FLAGGED(ch, PLR_THIEF)) {
+      send_to_char("Wanted criminals can not play in the arena", ch);
+  } else if (GET_LEVEL(ch) > hi_lim) {
+      send_to_char("Sorry the killing fields are not open to you\r\n",ch);
+  } else if (GET_GOLD(ch) < (cost_per_lev * GET_LEVEL(ch))) {
+      sprintf(buf, "Sorry but you need %d coins to enter the arena\r\n",
+              (cost_per_lev * GET_LEVEL(ch)) );
+      send_to_char(buf, ch);      
+  } else if (in_arena == ARENA_RUNNING) {
+      send_to_char("The fighting has already begun.\r\n", ch);
+  } else if(ROOM_FLAGGED(IN_ROOM(ch), ROOM_ARENA)) {
+      send_to_char("You are already in the arena.\r\n",ch);
+  } else {
+      act("$n has been taken to the killing fields.",FALSE, ch, 0, 0, TO_ROOM);
+      char_from_room(ch);
+      char_to_room(ch, real_room(number(ARENA_PREP_START,ARENA_PREP_END)));
+      act("$n is droped from the sky.", FALSE, ch, 0, 0, TO_ROOM);
+      send_to_char("You have been taken to the killing fields\r\n",ch);
+      look_at_room(ch, 0);
+      sprintf(buf, "%s has joined the blood bath.", GET_NAME(ch));
+      send_to_arena(buf);
+      GET_GOLD(ch) -= (cost_per_lev * GET_LEVEL(ch));
+      arena_pot += (cost_per_lev * GET_LEVEL(ch));
+      sprintf(buf, "You pay %d coins to enter the arena\r\n", 
+              (cost_per_lev * GET_LEVEL(ch)));
+      send_to_char(buf, ch);
+      GET_HIT(ch) = GET_MAX_HIT(ch);
+      GET_MANA(ch) = GET_MAX_MANA(ch);
+      GET_MOVE(ch) = GET_MAX_MOVE(ch);
+      if (ch->affected) 
+        while (ch->affected)
+          affect_remove(ch, ch->affected);
+  }
+}
+
+
+ACMD(do_chaos)
+{
+  char cost[MAX_INPUT_LENGTH], lolimit[MAX_INPUT_LENGTH];
+  char hilimit[MAX_INPUT_LENGTH], start_delay[MAX_INPUT_LENGTH];
+  char length[MAX_INPUT_LENGTH];
+
+  /* Usage: chaos lo hi start_delay cost/lev length */
+
+  if (in_arena != ARENA_OFF) {
+    send_to_char("There is an arena running already.\r\n", ch);
+    return;
+  }
+  half_chop(argument, lolimit, buf);
+  lo_lim = atoi(lolimit);
+  half_chop(buf, hilimit, buf);
+  hi_lim = atoi(hilimit);
+  half_chop(buf, start_delay, buf);
+  start_time = atoi(start_delay);
+  half_chop(buf, cost, buf);
+  cost_per_lev = atoi(cost);
+  strcpy(length, buf);
+  game_length = atoi(length);
+
+  if (hi_lim > LVL_IMPL ) {
+    send_to_char("Please choose a hi_lim under the Imps level\r\n", ch);
+    return;
+  }
+  if (lolimit < 0)
+    silent_end();
+  if (!*lolimit || !*hilimit || !*start_delay || !*cost || !*length) {
+    send_to_char("Usage: chaos lo hi start_delay cost/lev length\r\n", ch);
+    return;
+  }
+  if (lo_lim > hi_lim) {
+    send_to_char("Sorry, low limit must be lower than hi limit.\r\n", ch);
+    return;
+  }
+  if ((hi_lim < 0) || (cost_per_lev < 0) || (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;
+  }
+  if ((GET_LEVEL(ch) < LVL_IMPL) && (cost_per_lev < MIN_ARENA_COST)) {
+    send_to_char("The minimum cost per level is 100.\r\n",ch);
+    return;
+  }
+  in_arena = ARENA_START;
+  time_to_start = start_time;
+  time_left_in_game =0;
+  arena_pot =0; 
+  bet_pot = 0; 
+  start_arena();
+}
+
+
+void start_arena()
+{
+
+  if (time_to_start == 0) {
+    show_jack_pot();
+    in_arena = ARENA_RUNNING;    /* start the blood shed */
+    time_left_in_game = game_length;
+    start_game();
+  } else {
+      if(time_to_start >1) {
+        sprintf(buf1, "The Killing Fields are open to levels %d thru %d",
+                lo_lim, hi_lim);
+        send_to_arena(buf1);
+        sprintf(buf1, "%d coins/level to enter. %d hours to start\r\n",
+                cost_per_lev, time_to_start);
+        send_to_arena(buf1);
+        sprintf(buf1, "Type arena to enter.");
+        send_to_arena(buf1);
+  } else {
+      sprintf(buf1, "The Killing Fields are open to levels %d thru %d",
+              lo_lim, hi_lim);
+      send_to_arena(buf1);
+      sprintf(buf1, "%d coins/level to enter. 1 hour to start\r\n",
+	      cost_per_lev);
+      send_to_arena(buf1);
+      sprintf(buf1, "Type arena to enter.");
+      send_to_arena(buf1);
+  }
+  time_to_start--;
+  }
+}
+
+
+void show_jack_pot()
+{
+  sprintf(buf1, "\007\007Lets get ready to RUMBLE!!!!!!!!\r\n");
+  send_to_arena(buf1);  
+  sprintf(buf1, "The jackpot for this arena is %ld coins.", arena_pot);
+  send_to_arena(buf1);
+  sprintf(buf1, "There are %ld coins in the betting pool.", bet_pot);
+  send_to_arena(buf1);
+}
+
+
+void start_game()
+{
+  register struct char_data *i;
+  struct descriptor_data *d;
+
+  for (d = descriptor_list; d; d = d->next) {
+    if (!d->connected) {
+      i = d->character;
+      if (world[i->in_room].zone == ARENA_ZONE &&
+            ROOM_FLAGGED(IN_ROOM(i), ROOM_ARENA) &&
+            (i->in_room != NOWHERE)) {
+        send_to_char("\r\nThe floor opens, droping you in the arena.\r\n", i);
+        char_from_room(i);
+        char_to_room(i, real_room(number(ARENA_START_ROOM,ARENA_END_ROOM)));
+        look_at_room(i, 0);
+      }
+    }
+  }
+  do_game();
+}
+
+
+void do_game()
+{
+
+  if (num_in_arena() == 1) {
+    in_arena = ARENA_OFF; 
+    find_game_winner();
+  } else if(time_left_in_game == 0) {
+      in_arena = ARENA_OFF; 
+      do_end_game();
+  } else if (num_in_arena() == 0) {
+      in_arena = ARENA_OFF;
+      silent_end();
+  } else if ((time_left_in_game % 5) || 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());
+      send_to_arena(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());
+  send_to_arena(buf);
+  }
+  time_left_in_game--;
+}
+
+
+void find_game_winner()
+{
+  register struct char_data *i;
+  struct descriptor_data *d;
+  struct hall_of_fame_element *fame_node;
+
+  for (d = descriptor_list; d; d = d->next)
+    if (!d->connected) {
+      i = d->character;
+      if (world[i->in_room].zone == ARENA_ZONE &&
+          ROOM_FLAGGED(IN_ROOM(i), ROOM_ARENA) && 
+          (!IS_NPC(i)) && (i->in_room != NOWHERE) && 
+          GET_LEVEL(i) < LVL_IMMORT) {
+        GET_HIT(i) = GET_MAX_HIT(i);
+        GET_MANA(i) = GET_MAX_MANA(i);
+        if (i->affected)
+          while (i->affected)
+            affect_remove(i, i->affected);
+        char_from_room(i);
+        char_to_room(i, r_mortal_start_room);
+        look_at_room(i, 0);
+        act("$n falls from the sky.", FALSE, i, 0, 0, TO_ROOM);  
+        if (game_length - time_left_in_game == 1) {
+          sprintf(buf, "After 1 brief hour, %s is declared the winner.\r\n",
+                  GET_NAME(i));
+          send_to_arena(buf);
+        } else {
+            sprintf(buf,"After %d hours, %s is declared the winner.\r\n",
+                    game_length - time_left_in_game, GET_NAME(i));
+            send_to_arena(buf);
+	}
+        GET_GOLD(i) += arena_pot/2;
+        sprintf(buf, "You have earned %ld coins for winning the arena.\r\n",
+                (arena_pot/2));
+        send_to_char(buf, i);
+        sprintf(buf2, "%s has been awarded %ld coins for winning arena.\r\n", 
+	        GET_NAME(i), (arena_pot/2));
+        send_to_arena(buf2);
+        /* debuglog(buf2, FALSE); */
+        log(buf2);
+        CREATE(fame_node, struct hall_of_fame_element, 1);
+        strncpy(fame_node->name, GET_NAME(i), MAX_NAME_LENGTH);
+        fame_node->name[MAX_NAME_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);
+      }
+    }
+}
+
+
+void silent_end()
+{
+  in_arena = ARENA_OFF;
+  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.");
+  send_to_arena(buf);
+}
+
+
+void do_end_game()
+{
+  register struct char_data *i;
+  struct descriptor_data *d;
+
+  for (d = descriptor_list; d; d = d->next)
+    if (!d->connected) {
+      i = d->character;
+      if (ROOM_FLAGGED(IN_ROOM(i), ROOM_ARENA) && 
+         (i->in_room != NOWHERE) && (!IS_NPC(i))) {
+        GET_HIT(i) = GET_MAX_HIT(i);
+        GET_MANA(i) = GET_MAX_MANA(i);
+	GET_MOVE(i) = GET_MAX_MOVE(i);
+        if (i->affected)
+          while (i->affected)
+            affect_remove(i, i->affected);
+        char_from_room(i);
+        char_to_room(i, r_mortal_start_room);
+        look_at_room(i, 0);
+        act("$n falls from the sky.", FALSE, i, 0, 0, TO_ROOM);
+      }
+    }
+    sprintf(buf, "After %d hours of battle the Match is a draw.",game_length);
+    send_to_arena(buf);
+    time_left_in_game = 0;
+}
+
+
+int num_in_arena()
+{
+  register struct char_data *i;
+  struct descriptor_data *d;
+  int num = 0;
+
+  for (d = descriptor_list; d; d = d->next)
+    if (!d->connected) {
+      i = d->character;
+      if (world[i->in_room].zone == ARENA_ZONE && 
+          ROOM_FLAGGED(IN_ROOM(i), ROOM_ARENA) && (i->in_room != NOWHERE)) {
+        if (GET_LEVEL(i) < LVL_IMMORT)
+          num++;
+      }
+    }
+  return num;
+}
+
+
+ACMD(do_awho)
+{
+  struct descriptor_data *d;
+  struct char_data *tch;
+  int num =0;
+  *buf2 = '\0';
+  
+  if (in_arena == ARENA_OFF) {
+    send_to_char("There is no Arena going on right now.\r\n", ch);
+    return;
+  }
+  sprintf(buf,"  Gladiators in the Arena\r\n");
+  sprintf(buf,"%s---------------------------------------\r\n", buf);
+  sprintf(buf,"%sGame Length = %-3d   Time To Start %-3d\r\n", buf,
+              game_length, time_to_start);
+  sprintf(buf,"%sLevel Limits %d to %d\r\n", buf, lo_lim, hi_lim);
+  sprintf(buf,"%s         Jackpot = %ld\r\n", buf, arena_pot);
+  sprintf(buf,"%s---------------------------------------\r\n", buf);
+
+  for (d = descriptor_list; d; d = d->next)
+    if (!d->connected) {
+      tch = d->character;
+        if (world[tch->in_room].zone == ARENA_ZONE && 
+	    ROOM_FLAGGED(IN_ROOM(tch), ROOM_ARENA) &&
+	    (tch->in_room != NOWHERE) && GET_LEVEL(tch)<LVL_IMMORT) {
+          sprintf(buf, "%s%-20.20s%s", buf,
+          GET_NAME(tch),(!(++num % 3) ? "\r\n" : ""));
+	}
+    }
+  strcat(buf, "\r\n\r\n");
+  page_string(ch->desc, buf, 1);	
+}
+
+
+ACMD(do_ahall)
+{
+  char site[MAX_INPUT_LENGTH], format[MAX_INPUT_LENGTH], *timestr;
+  char format2[MAX_INPUT_LENGTH];
+  struct hall_of_fame_element *fame_node;
+
+  *buf = '\0';
+  *buf2 = '\0';
+
+  if (!fame_list) {
+    send_to_char("No-one is in the Hall of Fame.\r\n", ch);
+    return;
+  }
+
+  sprintf(buf2, "%s|---------------------------------------|%s\r\n",
+          CCBLU(ch, C_NRM), CCNRM(ch, C_NRM));
+  sprintf(buf2, "%s%s|%sPast Winners of Arena%s                  |%s\r\n",
+	  buf2, CCBLU(ch, C_NRM), CCNRM(ch, C_NRM),
+    	  CCBLU(ch, C_NRM),CCNRM(ch, C_NRM));
+  sprintf(buf2, "%s%s|---------------------------------------|%s\r\n\r\n",
+          buf2,CCBLU(ch, C_NRM), CCNRM(ch, C_NRM));
+
+  strcpy(format, "%-10.10s  %-15.15s  %-40s\r\n");
+  sprintf(buf, format, 
+	    "Date",
+	    "Award Amt",
+	    "Name"
+	  );
+  strcat(buf2, buf);
+  sprintf(buf, format,
+	    "---------------------------------",
+	    "--------------------------------",
+	    "-------------------------------------------------");
+  strcat(buf2, buf);    
+
+  strcpy(format2, "%-10.10s  %-16d %s\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, site, fame_node->award, CAP(fame_node->name));
+        strcat(buf2, buf);
+  }
+
+  page_string(ch->desc, buf2, 1);	
+  return; 
+}
+
+
+void load_hall_of_fame(void)
+{
+  FILE *fl;
+  int date, award;
+  char name[MAX_NAME_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_NAME_LENGTH);
+    next_node->name[MAX_NAME_LENGTH] = '\0';
+    next_node->date = date;
+    next_node->award = award;
+    next_node->next = fame_list;
+    fame_list = next_node;
+  }
+
+  fclose(fl);
+}
+
+
+void write_fame_list(void)
+{
+  FILE *fl;
+
+  if (!(fl = fopen(HALL_FAME_FILE, "w"))) {
+    /* syserrlog("Error writing _hall_of_fame_list", FALSE); */
+    log("Error writing _hall_of_fame_list");
+    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 %ld\n", node->name, (long) node->date, node->award);
+  }
+}
+
+
+void find_bet_winners(struct char_data *winner)
+{
+  register struct char_data *i;
+  struct descriptor_data *d;
+
+  *buf1 = '\0';
+  
+  for (d = descriptor_list; d; d = d->next)
+  if (!d->connected) {
+    i = d->character;
+    if ((!IS_NPC(i)) && (i->in_room != NOWHERE) &&
+          (GET_BETTED_ON(i) == GET_IDNUM(winner)) && GET_AMT_BET(i) > 0) {
+      sprintf(buf1, "You have won %d coins on your bet.\r\n",GET_AMT_BET(i)*2);
+      send_to_char(buf1, i);
+      GET_GOLD(i) += GET_AMT_BET(i)*2;
+      GET_BETTED_ON(i) = 0;
+      GET_AMT_BET(i) = 0;
+    }
+    else /* they bet and did't win, or didn't bet at all */
+      GET_AMT_BET(i) = 0;
+  }
+}
+
+
+int arena_ok(struct char_data * ch, struct char_data * victim)
+{
+  if (ROOM_FLAGGED(ch->in_room, ROOM_ARENA) && 
+      ROOM_FLAGGED(victim->in_room, ROOM_ARENA))
+    return TRUE;
+  else
+    return FALSE;
+}
+
+
+void arena_kill(struct char_data * ch, struct char_data * victim)
+{
+  if (FIGHTING(ch))
+    stop_fighting(ch);
+
+  while (ch->affected)
+    affect_remove(ch, ch->affected);
+
+  GET_HIT(ch) = GET_MAX_HIT(ch);
+  GET_MOVE(ch) = GET_MAX_MOVE(ch);
+  GET_MANA(ch) = GET_MAX_MANA(ch);
+
+  update_pos(ch);
+ 
+  char_from_room(ch);
+  char_to_room(ch, r_mortal_start_room);
+  look_at_room(ch, 0);
+  act("$n is droped from the sky.", FALSE, ch, 0, 0, TO_ROOM);
+}
diff -uNr circle30bpl15_stock/src/arena.h circle30bpl15_mod/src/arena.h
--- circle30bpl15_stock/src/arena.h	Wed Dec 31 19:00:00 1969
+++ circle30bpl15_mod/src/arena.h	Wed Mar 17 10:16:47 1999
@@ -0,0 +1,58 @@
+/* ************************************************************************
+ *   File: arena.h                                   Addition to CircleMUD *
+ *  Usage: header file for arena                                           *
+ *                                                                         *
+ ************************************************************************ */
+
+#ifndef _ARENA_H_
+#define _ARENA_H_
+
+#define ARENA_OFF	0
+#define ARENA_START	1
+#define ARENA_RUNNING	2
+
+#define PULSE_ARENA	(75 RL_SEC)
+
+#define ARENA_ZONE             1          /* zone number */
+#define ARENA_PREP_START       100        /* vnum of first prep room */
+#define ARENA_PREP_END         110        /* vnum of last prep room */
+#define ARENA_START_ROOM       111        /* vnum of first real arena room */
+#define ARENA_END_ROOM         150        /* vnum of last real arena room */
+#define ARENA_START_CHAL1      160        /* vnum of first challenge room */
+#define ARENA_END_CHAL1        161        /* vnum of last challenge room */
+#define ARENA_START_CHAL2      162        /* vnum of first challenge room */
+#define ARENA_END_CHAL2        163        /* vnum of last challenge room */
+#define HALL_FAME_FILE LIB_TEXT"hallfame" /* the arena hall of fame */
+
+#define MAX_BET	        10000             /* max betable */
+#define MIN_ARENA_COST	100               /* minimum cost per level */
+
+struct hall_of_fame_element {
+   char name[MAX_NAME_LENGTH+1];
+   char lastname[MAX_NAME_LENGTH+1];
+   time_t date;
+   long award;
+   struct  hall_of_fame_element *next;
+};
+
+/* in arena.c */
+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(struct char_data *winner);
+
+extern int in_arena;
+extern int game_length;
+extern int time_to_start;
+extern int time_left_in_game;
+extern int start_time;
+
+#endif /* _ARENA_H_ */
diff -uNr circle30bpl15_stock/src/comm.c circle30bpl15_mod/src/comm.c
--- circle30bpl15_stock/src/comm.c	Fri Mar  5 00:42:32 1999
+++ circle30bpl15_mod/src/comm.c	Wed Mar 17 10:16:47 1999
@@ -55,6 +55,7 @@
 #include "handler.h"
 #include "db.h"
 #include "house.h"
+#include "arena.h"
 
 #ifdef HAVE_ARPA_TELNET_H
 #include <arpa/telnet.h>
@@ -87,6 +88,7 @@
 extern struct room_data *world;	/* In db.c */
 extern struct time_info_data time_info;		/* In db.c */
 extern char *help;
+extern int in_arena;
 
 /* local globals */
 struct descriptor_data *descriptor_list = NULL;		/* master desc list */
@@ -151,6 +153,7 @@
 void show_string(struct descriptor_data *d, char *input);
 int isbanned(char *hostname);
 void weather_and_time(int mode);
+void start_arena();
 
 #ifdef __CXREF__
 #undef FD_ZERO
@@ -807,6 +810,13 @@
   if (!(pulse % PULSE_VIOLENCE))
     perform_violence();
 
+  if (in_arena == ARENA_START)
+    if(!(pulse % PULSE_ARENA))
+        start_arena();
+  if (in_arena == ARENA_RUNNING)
+    if(!(pulse % PULSE_ARENA))
+        do_game();
+
   if (!(pulse % (SECS_PER_MUD_HOUR * PASSES_PER_SEC))) {
     weather_and_time(1);
     affect_update();
@@ -2050,6 +2060,15 @@
     SEND_TO_Q(messg, ch->desc);
 }
 
+void send_to_arena(char *messg)
+{
+struct descriptor_data *d;
+
+    for (d = descriptor_list; d; d = d->next) {
+      if (d->descriptor && messg && PRF_FLAGGED(d->character, PRF_ARENA))
+        SEND_TO_Q(messg, d);
+    }
+}
 
 void send_to_all(const char *messg)
 {
diff -uNr circle30bpl15_stock/src/constants.c circle30bpl15_mod/src/constants.c
--- circle30bpl15_stock/src/constants.c	Fri Mar  5 00:39:21 1999
+++ circle30bpl15_mod/src/constants.c	Wed Mar 17 10:16:47 1999
@@ -53,7 +53,8 @@
   "HCRSH",
   "ATRIUM",
   "OLC",
-  "*",				/* BFS MARK */
+  "*",
+  "ARENA",                             /* BFS MARK */
   "\n"
 };
 
diff -uNr circle30bpl15_stock/src/fight.c circle30bpl15_mod/src/fight.c
--- circle30bpl15_stock/src/fight.c	Fri Jan 15 23:21:10 1999
+++ circle30bpl15_mod/src/fight.c	Wed Mar 17 10:16:47 1999
@@ -20,6 +20,7 @@
 #include "db.h"
 #include "spells.h"
 #include "screen.h"
+#include "arena.h"
 
 /* Structures */
 struct char_data *combat_list = NULL;	/* head of l-list of fighting chars */
@@ -44,6 +45,7 @@
 int backstab_mult(int level);
 int thaco(int ch_class, int level);
 int ok_damage_shopkeeper(struct char_data * ch, struct char_data * victim);
+void arena_kill(struct char_data * ch);
 
 /* local functions */
 void perform_group_gain(struct char_data * ch, int base, struct char_data * victim);
@@ -196,6 +198,8 @@
     return;
   if (PLR_FLAGGED(ch, PLR_KILLER) || IS_NPC(ch) || IS_NPC(vict) || ch == vict)
     return;
+  if ROOM_FLAGGED(ch->in_room, ROOM_ARENA)
+    return;
 
   SET_BIT(PLR_FLAGS(ch), PLR_KILLER);
   sprintf(buf, "PC Killer bit set on %s for initiating attack on %s at %s.",
@@ -350,14 +354,16 @@
 
 void die(struct char_data * ch)
 {
-  gain_exp(ch, -(GET_EXP(ch) / 2));
-  if (!IS_NPC(ch))
+  if (!IS_NPC(ch) && ROOM_FLAGGED(ch->in_room, ROOM_ARENA))
+    arena_kill(ch);
+  else {
+    gain_exp(ch, -(GET_EXP(ch) / 2));
     REMOVE_BIT(PLR_FLAGS(ch), PLR_KILLER | PLR_THIEF);
-  raw_kill(ch);
+    raw_kill(ch);
+  }
 }
 
 
-
 void perform_group_gain(struct char_data * ch, int base,
 			     struct char_data * victim)
 {
@@ -699,7 +705,7 @@
   GET_HIT(victim) -= dam;
 
   /* Gain exp for the hit */
-  if (ch != victim)
+  if ((ch != victim) && (!ROOM_FLAGGED(ch->in_room, ROOM_ARENA)))
     gain_exp(ch, GET_LEVEL(victim) * dam);
 
   update_pos(victim);
@@ -780,8 +786,10 @@
     stop_fighting(victim);
 
   /* Uh oh.  Victim died. */
+
   if (GET_POS(victim) == POS_DEAD) {
-    if ((ch != victim) && (IS_NPC(victim) || victim->desc)) {
+    if ((ch != victim) && (IS_NPC(victim) || victim->desc) &&
+    (!ROOM_FLAGGED(ch->in_room, ROOM_ARENA))) {
       if (AFF_FLAGGED(ch, AFF_GROUP))
 	group_gain(ch, victim);
       else
diff -uNr circle30bpl15_stock/src/interpreter.c circle30bpl15_mod/src/interpreter.c
--- circle30bpl15_stock/src/interpreter.c	Fri Mar  5 00:55:38 1999
+++ circle30bpl15_mod/src/interpreter.c	Wed Mar 17 10:16:47 1999
@@ -68,13 +68,18 @@
 /* prototypes for all do_x functions. */
 ACMD(do_action);
 ACMD(do_advance);
+ACMD(do_ahall);
 ACMD(do_alias);
+ACMD(do_arena);
 ACMD(do_assist);
 ACMD(do_at);
+ACMD(do_awho);
 ACMD(do_backstab);
 ACMD(do_ban);
 ACMD(do_bash);
+ACMD(do_bet);
 ACMD(do_cast);
+ACMD(do_chaos);
 ACMD(do_color);
 ACMD(do_commands);
 ACMD(do_consider);
@@ -222,11 +227,15 @@
   { "advance"  , POS_DEAD    , do_advance  , LVL_IMPL, 0 },
   { "alias"    , POS_DEAD    , do_alias    , 0, 0 },
   { "accuse"   , POS_SITTING , do_action   , 0, 0 },
+  { "ahall"    , POS_DEAD    , do_ahall    , 0, 0 },
   { "applaud"  , POS_RESTING , do_action   , 0, 0 },
+  { "arena"    , POS_STANDING, do_arena    , 0, 0 },
+  { "arinfo"   , POS_SLEEPING, do_gen_tog  , 0, SCMD_ARENA },
   { "assist"   , POS_FIGHTING, do_assist   , 1, 0 },
   { "ask"      , POS_RESTING , do_spec_comm, 0, SCMD_ASK },
   { "auction"  , POS_SLEEPING, do_gen_comm , 0, SCMD_AUCTION },
   { "autoexit" , POS_DEAD    , do_gen_tog  , 0, SCMD_AUTOEXIT },
+  { "awho"     , POS_DEAD    , do_awho     , 0, 0 },
 
   { "bounce"   , POS_STANDING, do_action   , 0, 0 },
   { "backstab" , POS_STANDING, do_backstab , 1, 0 },
@@ -234,6 +243,7 @@
   { "balance"  , POS_STANDING, do_not_here , 1, 0 },
   { "bash"     , POS_FIGHTING, do_bash     , 1, 0 },
   { "beg"      , POS_RESTING , do_action   , 0, 0 },
+  { "bet"      , POS_DEAD    , do_bet     , 0, 0 },
   { "bleed"    , POS_RESTING , do_action   , 0, 0 },
   { "blush"    , POS_RESTING , do_action   , 0, 0 },
   { "bow"      , POS_STANDING, do_action   , 0, 0 },
@@ -245,6 +255,7 @@
 
   { "cast"     , POS_SITTING , do_cast     , 1, 0 },
   { "cackle"   , POS_RESTING , do_action   , 0, 0 },
+  { "chaos"    , POS_STANDING, do_chaos    , LVL_IMMORT, 0 },
   { "check"    , POS_STANDING, do_not_here , 1, 0 },
   { "chuckle"  , POS_RESTING , do_action   , 0, 0 },
   { "clap"     , POS_RESTING , do_action   , 0, 0 },
diff -uNr circle30bpl15_stock/src/interpreter.h circle30bpl15_mod/src/interpreter.h
--- circle30bpl15_stock/src/interpreter.h	Fri Jan  8 03:20:00 1999
+++ circle30bpl15_mod/src/interpreter.h	Wed Mar 17 10:16:47 1999
@@ -119,6 +119,7 @@
 #define SCMD_SLOWNS	14
 #define SCMD_AUTOEXIT	15
 #define SCMD_TRACK	16
+#define SCMD_ARENA      17
 
 /* do_wizutil */
 #define SCMD_REROLL	0
diff -uNr circle30bpl15_stock/src/magic.c circle30bpl15_mod/src/magic.c
--- circle30bpl15_stock/src/magic.c	Wed Mar 10 00:42:12 1999
+++ circle30bpl15_mod/src/magic.c	Wed Mar 17 10:16:47 1999
@@ -37,6 +37,7 @@
 void weight_change_object(struct obj_data * obj, int weight);
 void add_follower(struct char_data * ch, struct char_data * leader);
 extern struct spell_info_type spell_info[];
+extern int arena_ok(struct char_data * ch, struct char_data * victim);
 
 /* local functions */
 int mag_materials(struct char_data * ch, int item0, int item1, int item2, int extract, int verbose);
@@ -459,7 +460,7 @@
     break;
 
   case SPELL_SLEEP:
-    if (!pk_allowed && !IS_NPC(ch) && !IS_NPC(victim))
+    if (!pk_allowed && !arena_ok(ch, victim) && !IS_NPC(ch) && !IS_NPC(victim))
       return;
     if (MOB_FLAGGED(victim, MOB_NOSLEEP))
       return;
@@ -670,7 +671,7 @@
       continue;
     if (!IS_NPC(tch) && GET_LEVEL(tch) >= LVL_IMMORT)
       continue;
-    if (!pk_allowed && !IS_NPC(ch) && !IS_NPC(tch))
+    if (!pk_allowed && !arena_ok(ch, tch) && !IS_NPC(ch) && !IS_NPC(tch))
       continue;
     if (!IS_NPC(ch) && IS_NPC(tch) && AFF_FLAGGED(tch, AFF_CHARM))
       continue;
diff -uNr circle30bpl15_stock/src/structs.h circle30bpl15_mod/src/structs.h
--- circle30bpl15_stock/src/structs.h	Fri Mar  5 00:39:21 1999
+++ circle30bpl15_mod/src/structs.h	Wed Mar 17 10:16:47 1999
@@ -69,6 +69,7 @@
 #define ROOM_ATRIUM		(1 << 13)  /* (R) The door to a house	*/
 #define ROOM_OLC		(1 << 14)  /* (R) Modifyable/!compress	*/
 #define ROOM_BFS_MARK		(1 << 15)  /* (R) breath-first srch mrk	*/
+#define ROOM_ARENA              (1 << 16)  /* The room is part of arena */
 
 
 /* Exit info: used in room_data.dir_option.exit_info */
@@ -193,6 +194,7 @@
 #define PRF_NOGOSS	(1 << 19) /* Can't hear gossip channel		*/
 #define PRF_NOGRATZ	(1 << 20) /* Can't hear grats channel		*/
 #define PRF_ROOMFLAGS	(1 << 21) /* Can see room flags (ROOM_x)	*/
+#define PRF_ARENA       (1 << 22) /* Can see arena messages             */
 
 
 /* Affect bits: used in char_data.char_specials.saved.affected_by */
@@ -794,8 +796,8 @@
    ubyte spare4;
    ubyte spare5;
    int spells_to_learn;		/* How many can you learn yet this level*/
-   int spare7;
-   int spare8;
+   int bet_amt;
+   int betted_on;
    int spare9;
    int spare10;
    int spare11;
diff -uNr circle30bpl15_stock/src/utils.h circle30bpl15_mod/src/utils.h
--- circle30bpl15_stock/src/utils.h	Sat Mar 13 19:59:47 1999
+++ circle30bpl15_mod/src/utils.h	Wed Mar 17 10:16:47 1999
@@ -281,6 +281,8 @@
 #define GET_BANK_GOLD(ch) ((ch)->points.bank_gold)
 #define GET_HITROLL(ch)	  ((ch)->points.hitroll)
 #define GET_DAMROLL(ch)   ((ch)->points.damroll)
+#define GET_AMT_BET(ch) ((ch)->player_specials->saved.bet_amt)
+#define GET_BETTED_ON(ch) ((ch)->player_specials->saved.betted_on)
 
 #define GET_POS(ch)	  ((ch)->char_specials.position)
 #define GET_IDNUM(ch)	  ((ch)->char_specials.saved.idnum)

