#include <sys/types.h>
#include <time.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include "merc.h"
#include "obj_trig.h"

int superduel_ticks;
bool superduel_teams;
extern bool battle_royale;
void do_echo (CHAR_DATA * ch, char *argument);
void do_goto (CHAR_DATA * ch, char *argument);
void do_transfer (CHAR_DATA * ch, char *argument);
extern char str_empty[1];
struct duel_data *current_duel = NULL;
extern bool make_backup_duel;
ROOM_INDEX_DATA *find_location args ((CHAR_DATA * ch, char *arg));
void do_ooc args((CHAR_DATA * ch, char *argument));
void arena_equip (CHAR_DATA *, int);
void arena_chan args((char* text));
void unlink_duel_backups (CHAR_DATA * loser, CHAR_DATA * winner)
{
  char strsave[MAX_STRING_LENGTH];
  sprintf (strsave, "%s%c/%s%s", PLAYER_DIR, toupper (loser->name[0]),
	   capitalize (loser->name), PFILE_BACKUP_DUEL);
  unlink (strsave);
  sprintf (strsave, "%s%c/%s%s", PLAYER_DIR, toupper (winner->name[0]),
	   capitalize (winner->name), PFILE_BACKUP_DUEL);
  unlink (strsave);
  return;
}

void do_stripaffects args((CHAR_DATA *ch,char* argument));
	

/* This function is run when user uses the 'duel' command */
void award_item (CHAR_DATA * winner, CHAR_DATA * loser)
{
  OBJ_DATA *some_obj;
  int total_stuff = 0, xx, rndnum;
  char tcbuf[MAX_INPUT_LENGTH];
  if (loser->carrying == NULL)
    {
      send_to_char
	("Unfortunately there are no items to be won from the defeated.\n\r",
	 winner);

      /*
         send_to_char("In lieu of an item from the defeated, you are awarded 5000 silver.\n\r", winner);
         winner->silver += 5000; */
      send_to_char ("Luckily, you have no equipment to lose.\n\r", loser);
      return;
    }
  total_stuff = 0;
  some_obj = loser->carrying;
  for (some_obj = loser->carrying; some_obj != NULL;
       some_obj = some_obj->next_content)
    total_stuff++;
  rndnum = number_range (1, total_stuff);
  xx = 1;
  for (some_obj = loser->carrying; xx < rndnum && some_obj != NULL;
       some_obj = some_obj->next_content)
    xx++;
  if (some_obj == NULL)
    {
      send_to_char ("OBJIS NULL BUG!\n\r", winner);
      send_to_char ("OBJIS NULL BUG!\n\r", loser);
    }
  if (some_obj->wear_loc != WEAR_NONE)
    unequip_char (loser, some_obj);
  obj_from_char (some_obj);
  obj_to_char (some_obj, winner);
  sprintf (tcbuf,
	   "You have also won %s as tribute from the defeated.\n\r",
	   some_obj->short_descr);
  send_to_char (tcbuf, winner);
  sprintf (tcbuf,
	   "Shamefully defeated, you are stripped of %s, which has been awarded to the victor.\n\r",
	   some_obj->short_descr);
  send_to_char (tcbuf, loser);
}

void do_duel (CHAR_DATA * ch, char *argument)
{
  char tcbuf[MAX_STRING_LENGTH];	/* Temporary string variable */
  CHAR_DATA *to_duel, *tch_next, *tch;	/* Some character structures */
  int tch_count = 0;		/* Integer counting variable */
  ROOM_INDEX_DATA *location;	/* Room location structure */
  int level_avg;
  OBJ_DATA *obj, *obj_next;
  if (!str_cmp (argument, "cancel"))
    {
      if (IS_TRUSTED (ch, GOD))
	{
	  if (current_duel == NULL)
	    {
	      send_to_char ("There is no duel in progress!\n\r", ch);
	      return;
	    }
	  else
	    {
	      send_to_char ("Cancelling current duel...\n\r", ch);
	      duel_cancel (ch);
	      return;
	    }
	}
      else
	{
	  send_to_char ("Sorry, you can't do that.\n\r", ch);
	  return;
	}
    }
  if (!IS_NPC (ch))
    if ((time (NULL) - ch->pcdata->last_fight < 120))
      {
	send_to_char ("You can't duel right now.\n\r", ch);
	return;
      }

  /* Check to make sure user is in an arena registration room */
  if (!IS_SET (ch->in_room->room_flags, ROOM_ARENA_REGISTRATION)
      && argument[0] != '\0')
    {
      send_to_char
	("You must be in the Hall of Legends to use this command!\n\r", ch);
      return;
    }
  if (argument[0] != '\0')
    {				/* Did user supply an argument to duel? */
      if (!str_cmp (argument, "reject"))
	{			/* If argument was 'reject'... */

	  /* Loop through the character list looking for anyone dueling
	   * this character.  If any are found, cancel the duel 
	   * requests and inform both parties */
	  for (tch = char_list; tch != NULL; tch = tch_next)
	    {
	      tch_next = tch->next;
	      if (tch->duel == ch->name)
		{
		  sprintf (tcbuf,
			   "%s has rejected your duel request!\n\r",
			   ch->name);
		  send_to_char (tcbuf, tch);
		  tch->duel = &str_empty[0];
		  tch_count++;
		  break;
		}
	    }
	  if (tch_count == 0)	/* if 0, no one was dueling this character */
	    send_to_char ("No one has requested a duel with you.\n\r", ch);

	  else
	    {
	      sprintf (tcbuf, "Rejecting duel request from %s.\n\r",
		       tch->name);
	      send_to_char (tcbuf, ch);
	    }
	  return;		/* We're done here, return out of function */
	}
      if (!str_cmp (argument, "withdraw"))
	{			/* If argument is 'withdraw'... */

	  /* Remove duel request from character structure... */
	  if (ch->duel[0] != '\0')
	    {
	      send_to_char ("Cancelling current duel request.\n\r", ch);
	      if (ch->duel != ch->name)
		if ((to_duel = get_char_world (ch, ch->duel)) != NULL)
		  {
		    act ("$n has withdrawn $S duel request.", ch, NULL,
			 to_duel, TO_VICT);
		  }
	      ch->duel = &str_empty[0];
	    }
	  else
	    send_to_char ("No current duel request exists.\n\r", ch);
	  return;
	}
      if (!str_cmp (argument, "add"))
	{			/* If add, add to the 'public' list */
	  send_to_char ("Adding you to the public duel list.\n\r", ch);
	  ch->duel = ch->name;
	  return;
	}

      /* Make sure named character exists and is online */
      if ((to_duel = get_char_world (ch, argument)) == NULL)
	{
	  send_to_char ("They aren't here.\n\r", ch);
	  return;		/* If not, do nothing. */
	}
      if (((ch->level < to_duel->level - 10)
	   || (ch->level > to_duel->level + 10))
	  && !IS_TRUSTED (ch, DEMIGOD) && !IS_TRUSTED (to_duel, DEMIGOD))
	{
	  send_to_char
	    ("Only fair and honorable fights may take place in the Arena!\n\r",
	     ch);
	  return;
	}
      if (to_duel == ch)
	{			/* Can't duel yourself! */
	  send_to_char ("Don't be silly!\n\r", ch);
	  return;
	}
      if (IS_NPC (to_duel))
	{			/* can't duel NPCs! */
	  send_to_char ("You can't duel a non-player character!\n\r", ch);
	  return;
	}
      if (ch->duel[0] != '\0' && ch->duel != ch->name)
	{			/* If a duel already exists, inform character, then return */
	  sprintf (tcbuf,
		   "You are alreading awaiting a duel with %s.  Type 'duel withdraw' to withdraw your request.\n\r",
		   ch->duel);
	  send_to_char (tcbuf, ch);
	  return;
	}
      if (to_duel->duel == ch->name)
	{
	  if (current_duel != NULL)
	    {
	      send_to_char
		("You must wait until the current duel has ended.\n\r", ch);
	      return;
	    }
	  if (!to_duel->in_room || to_duel->in_room != ch->in_room)
	  {
		  send_to_char("They must also be in this room for the duel to begin.\n\r",ch);
		  return;
	  }
	  if (!IS_NPC (to_duel))
	     if ((time (NULL) - to_duel->pcdata->last_fight < 120))
	     {
	        send_to_char ("They have fought too recently to join the duel.\n\r", ch);
	        return;
	     }
	  
	  if (to_duel->dueler)
	  {
		  send_to_char("You must wait until they are done super dueling.\n\r",ch);
		  return;
	  }
	  send_to_char ("THE DUEL BEGINS!  Entering the arena...\n\r", ch);
	  send_to_char ("THE DUEL BEGINS! Entering the arena...\n\r",
			to_duel);
	  ch->duel = &str_empty[0];
	  to_duel->duel = &str_empty[0];
	  sprintf (tcbuf,
		   "%s and %s have been transported to the Arena for a duel to the death!\n\r",
		   ch->name, to_duel->name);
	  arena_report (tcbuf);
	  act
	    ("$n and $N have been transported to the Arena for a duel to the death!\n\r",
	     ch, NULL, to_duel, TO_NOTVICT);
	  make_backup_duel = TRUE;
	  save_char_obj (ch);
	  make_backup_duel = TRUE;
	  save_char_obj (to_duel);
	  location = get_random_arena (ch);
	  char_from_room (ch);
	  char_to_room (ch, location);
	  trip_triggers(ch, OBJ_TRIG_ENTER_ROOM, NULL, NULL, OT_SPEC_NONE);
	  trap_check(ch,"room",ch->in_room,NULL);
	  sprintf(tcbuf,"%d",ch->in_room->vnum);
	  trip_triggers_arg(ch, OBJ_TRIG_CHAR_TO_ROOM, NULL, NULL, OT_SPEC_NONE,tcbuf);
	  check_aggression(ch);
	  location = get_random_arena (to_duel);
	  char_from_room (to_duel);
	  char_to_room (to_duel, location);
	  trip_triggers(to_duel, OBJ_TRIG_ENTER_ROOM, NULL, NULL, OT_SPEC_NONE);
	  trap_check(to_duel,"room",to_duel->in_room,NULL);
	  sprintf(tcbuf,"%d",to_duel->in_room->vnum);
	  trip_triggers_arg(to_duel, OBJ_TRIG_CHAR_TO_ROOM, NULL, NULL, OT_SPEC_NONE,tcbuf);
	  check_aggression(to_duel);
	  current_duel =
	    (struct duel_data *) malloc (sizeof (struct duel_data));
	  current_duel->old_carry_1 = NULL;
	  current_duel->old_carry_2 = NULL;
	  current_duel->in_duel_1 = ch;
	  current_duel->old_hit_1 = ch->hit;
	  current_duel->old_mana_1 = ch->mana;
	  current_duel->old_move_1 = ch->move;
	  for (obj = ch->carrying; obj; obj = obj_next)
	    {
	      obj_next = obj->next_content;
	      obj->prev_wear_loc = obj->wear_loc;
	      unequip_char (ch, obj);
	      obj_from_char (obj);
	      obj->next_content = current_duel->old_carry_1;
	      current_duel->old_carry_1 = obj;
	    }
	  current_duel->in_duel_2 = to_duel;
	  current_duel->old_hit_2 = to_duel->hit;
	  current_duel->old_mana_2 = to_duel->mana;
	  current_duel->old_move_2 = to_duel->move;
	  for (obj = to_duel->carrying; obj; obj = obj_next)
	    {
	      obj_next = obj->next_content;
	      obj->prev_wear_loc = obj->wear_loc;
	      unequip_char (to_duel, obj);
	      obj_from_char (obj);
	      obj->next_content = current_duel->old_carry_2;
	      current_duel->old_carry_2 = obj;
	    }
	  ch->hit = ch->max_hit;
	  ch->mana = ch->max_mana;
	  ch->move = ch->max_move;
	  to_duel->hit = to_duel->max_hit;
	  to_duel->mana = to_duel->max_mana;
	  to_duel->move = to_duel->max_move;
	  level_avg = (ch->level + to_duel->level) / 2;
	  arena_equip (ch, level_avg);
	  arena_equip (to_duel, level_avg);
	  return;
	}
      for (tch = char_list; tch != NULL; tch = tch_next)
	{
	  tch_next = tch->next;
	  if (tch->duel == to_duel->name && tch->duel != tch->name)
	    {
	      sprintf (tcbuf,
		       "Sorry, %s has already been challenged to a duel!\n\r",
		       to_duel->name);
	      send_to_char (tcbuf, ch);
	      return;
	    }
	}
      sprintf (tcbuf, "You have challenged %s to a duel!\n\r",
	       capitalize (to_duel->name));
      send_to_char (tcbuf, ch);
      sprintf (tcbuf,
	       "%s has challenged you to a duel, type 'duel %s' in the Hall of Legends to accept!\n\r",
	       capitalize (ch->name), capitalize (ch->name));
      send_to_char (tcbuf, to_duel);
      ch->duel = to_duel->name;
    }
  else
    {
      send_to_char ("\n\r", ch);
      send_to_char
	("     `c/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/~~\\``\n\r",
	 ch);
      send_to_char
	("    `c|                                                 |    |``\n\r",
	 ch);
      send_to_char
	("    `c|       `n-`k=    `oCURRENT DUEL INFORMATION   `k=`n-       `c|___/``\n\r",
	 ch);
      send_to_char
	("    `c|                                                 |\n\r", ch);
      send_to_char
	("    `c|                                                 |``\n\r",
	 ch);
      if (current_duel != NULL)
	{

	  /*      sprintf(tcbuf, "Duel in progress: %13s vs %-13s!\n\r", 
	     current_duel->in_duel_1->name, 
	     current_duel->in_duel_2->name);
	   */
	  send_to_char
	    ("    `c|``               `o* In Progress * ``                  `c|``\n\r",
	     ch);
	  sprintf (tcbuf,
		   "    `c|``        `k%13s vs %-13s``           `c|``\n\r",
		   current_duel->in_duel_1->name,
		   current_duel->in_duel_2->name);
	  send_to_char (tcbuf, ch);
	  send_to_char
	    ("    `c|``                                                 `c|``\n\r",
	     ch);
	}
      for (tch = char_list; tch != NULL; tch = tch_next)
	{
	  tch_next = tch->next;
	  if (!IS_NPC (tch))
	    {
	      if (tch->duel[0] != '\0')
		{
		  if (tch->duel == tch->name)
		    sprintf (tcbuf,
			     "    `c|```n%13s is awaiting any challenger.``        `c|``\n\r",
			     capitalize (tch->name));

		  else
		    sprintf (tcbuf,
			     "    `c|``    `n%13s is awaiting `n%-13s``      `c|``\n\r",
			     tch->name, tch->duel);
		  send_to_char (tcbuf, ch);
		  tch_count++;
		}
	    }
	}
      if (tch_count == 0)
	{
	  send_to_char
	    ("    `c|                                                 |``\n\r",
	     ch);
	  send_to_char
	    ("    `c|``      `jNo players are awaiting challengers.       `c|``\n\r",
	     ch);
	  send_to_char
	    ("    `c|``                                                 `c|``\n\r",
	     ch);
	  send_to_char
	    ("    `c|``                                                 `c|``\n\r",
	     ch);
	}
      send_to_char
	("    `c|``                                                 `c|``\n\r",
	 ch);
      send_to_char
	("    `c|``                                                 `c|``\n\r",
	 ch);
      send_to_char
	("    `c|``                                                 `c|``\n\r",
	 ch);

      /*      for(tch = char_list; tch != NULL; tch = tch_next)
         {
         tch_next = tch->next;
         if(!IS_NPC(tch) && tch != ch)
         if(tch->duel == ch->name)
         {
         sprintf(tcbuf, "`n%s has challenged you.``\n\r", capitalize(tch->name));
         send_to_char(tcbuf, ch);
         break;
         }
         } 

         if(ch->duel[0] == '\0')
         strcpy(tcbuf, "`c|``    `jYou are currently challenging no one.``      `c|``\n\r");
         else if(ch->duel == ch->name)
         strcpy(tcbuf, "`c|``    `jYou are on the public duel list.       `c|``\n\r");
         else
         sprintf(tcbuf, "`c|``    `nYou are currently challenging `n%s.     `c|``\n\r\n\r", ch->duel);

         send_to_char(tcbuf, ch); */
      send_to_char
	("  `c/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/   |\n\r", ch);
      send_to_char
	(" `c|                                               |    |\n\r", ch);
      send_to_char
	("  `c\\_______________________________________________\\__/``\n\r",
	 ch);
    }
  return;
}

void arena_report (char *spectator_stuff)
{
  DESCRIPTOR_DATA *ps;
  for (ps = descriptor_list; ps != NULL; ps = ps->next)
    {
      CHAR_DATA *victim;
      victim = ps->original ? ps->original : ps->character;
      if (ps->connected == CON_PLAYING
	  && IS_SET (victim->in_room->room_flags, ROOM_SPECTATOR))
	{
	  send_to_char (spectator_stuff, victim);
	}
    }
}
void arena_equip (CHAR_DATA * ch, int level_avg)
{
  OBJ_DATA *arena_obj;
  int best, objvnum, curr;
  if (IS_NPC (ch))
    return;
  best = 0;
  objvnum = OBJ_VNUM_APOLEARM;
  if ((curr = get_skill (ch, gsn_polearm)) > best)
    best = curr;
  if ((curr = get_skill (ch, gsn_staff)) > best)
    {
      best = curr;
      objvnum = OBJ_VNUM_ASTAFF;
    }
  if ((curr = get_skill (ch, gsn_mace)) > best)
    {
      best = curr;
      objvnum = OBJ_VNUM_AMACE;
    }
  if ((curr = get_skill (ch, gsn_dagger)) > best)
    {
      best = curr;
      objvnum = OBJ_VNUM_ADAGGER;
    }
  if ((curr = get_skill (ch, gsn_sword)) > best || IS_CLASS (ch, PC_CLASS_REAVER))
    {
      best = curr;
      objvnum = OBJ_VNUM_ASWORD;
    }
  if ((curr = get_skill (ch, gsn_hand_to_hand)) <= best
      && !(IS_CLASS (ch, PC_CLASS_MONK)))
    {
      arena_obj = create_object (get_obj_index (objvnum), level_avg);
      arena_obj->level = level_avg;
      obj_to_char (arena_obj, ch);
      if (ch->pcdata->primary_hand == HAND_RIGHT
	  || ch->pcdata->primary_hand == HAND_AMBIDEXTROUS)
	equip_char (ch, arena_obj, WEAR_WIELD_R);

      else
	equip_char (ch, arena_obj, WEAR_WIELD_L);
    }
  if (!IS_CLASS (ch, PC_CLASS_ASSASSIN))
    {
      arena_obj = create_object (get_obj_index (OBJ_VNUM_ASHIELD), level_avg);
      arena_obj->level = level_avg;
      obj_to_char (arena_obj, ch);
      equip_char (ch, arena_obj, WEAR_SHIELD);
    }
  arena_obj = create_object (get_obj_index (OBJ_VNUM_ABOOTS), level_avg);
  arena_obj->level = level_avg;
  obj_to_char (arena_obj, ch);
  equip_char (ch, arena_obj, WEAR_FEET);
  arena_obj = create_object (get_obj_index (OBJ_VNUM_AGLOVES), level_avg);
  arena_obj->level = level_avg;
  obj_to_char (arena_obj, ch);
  equip_char (ch, arena_obj, WEAR_HANDS);
  arena_obj = create_object (get_obj_index (OBJ_VNUM_ALIGHT), level_avg);
  arena_obj->level = level_avg;
  obj_to_char (arena_obj, ch);
  equip_char (ch, arena_obj, WEAR_LIGHT);
  arena_obj = create_object (get_obj_index (OBJ_VNUM_ASLEEVES), level_avg);
  arena_obj->level = level_avg;
  obj_to_char (arena_obj, ch);
  equip_char (ch, arena_obj, WEAR_ARMS);
  arena_obj = create_object (get_obj_index (OBJ_VNUM_ABELT), level_avg);
  arena_obj->level = level_avg;
  obj_to_char (arena_obj, ch);
  equip_char (ch, arena_obj, WEAR_WAIST);
  if (IS_CLASS (ch, PC_CLASS_BARD))
    {
      arena_obj = create_object (get_obj_index (OBJ_VNUM_AINST), level_avg);
      arena_obj->level = level_avg;
      obj_to_char (arena_obj, ch);
      equip_char (ch, arena_obj, WEAR_HOLD);
    }
  arena_obj = create_object (get_obj_index (OBJ_VNUM_ALEGGINGS), level_avg);
  arena_obj->level = level_avg;
  obj_to_char (arena_obj, ch);
  equip_char (ch, arena_obj, WEAR_LEGS);
}

int is_dueling (CHAR_DATA * chk_duel)
{
  if (current_duel != NULL)
    if (chk_duel == current_duel->in_duel_1
	|| chk_duel == current_duel->in_duel_2)
      return (1);
  return (0);
}

void duel_cancel (CHAR_DATA * who_god)
{
  char tcbuf[MAX_STRING_LENGTH];
  OBJ_DATA *obj, *obj_next;
  ROOM_INDEX_DATA *location;
  sprintf (tcbuf, "The duel has been cancelled by %s.\n\r", who_god->name);
  send_to_char (tcbuf, current_duel->in_duel_1);
  send_to_char (tcbuf, current_duel->in_duel_2);
  for (obj = current_duel->in_duel_1->carrying; obj != NULL; obj = obj_next)
    {
      obj_next = obj->next_content;
      unequip_char (current_duel->in_duel_1, obj);
      obj_from_char (obj);
      extract_obj (obj);
    }
  for (obj = current_duel->in_duel_2->carrying; obj != NULL; obj = obj_next)
    {
      obj_next = obj->next_content;
      unequip_char (current_duel->in_duel_2, obj);
      obj_from_char (obj);
      extract_obj (obj);
    }
  current_duel->in_duel_1->hit = current_duel->old_hit_1;
  current_duel->in_duel_1->mana = current_duel->old_mana_1;
  current_duel->in_duel_1->move = current_duel->old_move_1;
  current_duel->in_duel_1->position = POS_STANDING;
  for (obj = current_duel->old_carry_1; obj; obj = obj_next)
    {
      obj_next = obj->next_content;
      obj_to_char (obj, current_duel->in_duel_1);
      equip_char_slot_new (current_duel->in_duel_1, obj, obj->prev_wear_loc);
    }
  current_duel->in_duel_2->hit = current_duel->old_hit_2;
  current_duel->in_duel_2->mana = current_duel->old_mana_2;
  current_duel->in_duel_2->move = current_duel->old_move_2;
  current_duel->in_duel_2->position = POS_STANDING;
  for (obj = current_duel->old_carry_2; obj; obj = obj_next)
    {
      obj_next = obj->next_content;
      obj_to_char (obj, current_duel->in_duel_2);
      equip_char_slot_new (current_duel->in_duel_2, obj, obj->prev_wear_loc);
    }
  location = get_room_index (ROOM_VNUM_SPECTATOR);
  char_from_room (current_duel->in_duel_1);
  char_to_room (current_duel->in_duel_1, location);
  trip_triggers(current_duel->in_duel_1, OBJ_TRIG_ENTER_ROOM, NULL, NULL, OT_SPEC_NONE);
  trap_check(current_duel->in_duel_1,"room",current_duel->in_duel_1->in_room,NULL);
  sprintf(tcbuf,"%d",current_duel->in_duel_1->in_room->vnum);
  trip_triggers_arg(current_duel->in_duel_1, OBJ_TRIG_CHAR_TO_ROOM, NULL, NULL, OT_SPEC_NONE,tcbuf);
  check_aggression(current_duel->in_duel_1);
  location = get_room_index (ROOM_VNUM_HALL_LEGENDS);
  char_from_room (current_duel->in_duel_2);
  char_to_room (current_duel->in_duel_2, location);
  trip_triggers(current_duel->in_duel_2, OBJ_TRIG_ENTER_ROOM, NULL, NULL, OT_SPEC_NONE);
  trap_check(current_duel->in_duel_2,"room",current_duel->in_duel_2->in_room,NULL);
  sprintf(tcbuf,"%d",current_duel->in_duel_2->in_room->vnum);
  trip_triggers_arg(current_duel->in_duel_2, OBJ_TRIG_CHAR_TO_ROOM, NULL, NULL, OT_SPEC_NONE,tcbuf);
  check_aggression(current_duel->in_duel_2);
  free (current_duel);
  current_duel = NULL;
}

void duel_ends (CHAR_DATA * loser)
{
  CHAR_DATA *winner, *spectator;
  ROOM_INDEX_DATA *location;
  OBJ_DATA *obj, *obj_next;
  char tcbuf[MAX_STRING_LENGTH];
  sh_int xx;
  stop_fighting (loser, TRUE);
  send_to_char ("The duel is over!\n\r", current_duel->in_duel_1);
  send_to_char ("The duel is over!\n\r", current_duel->in_duel_2);
  if (current_duel->in_duel_1 == loser)
    winner = current_duel->in_duel_2;

  else
    winner = current_duel->in_duel_1;
  send_to_char ("You are the WINNER!\n\r", winner);
  send_to_char ("You are the LOSER!\n\r", loser);

  /* 09-18-03 Iblis - Added new kc elements */

  winner->pcdata->has_killed[ARENA_KILL]++;
  loser->pcdata->been_killed[ARENA_KILL]++;
  
  for (obj = winner->carrying; obj != NULL; obj = obj_next)
    {
      obj_next = obj->next_content;
      unequip_char (winner, obj);
      obj_from_char (obj);
      extract_obj (obj);
    }
  for (obj = loser->carrying; obj != NULL; obj = obj_next)
    {
      obj_next = obj->next_content;
      unequip_char (loser, obj);
      obj_from_char (obj);
      extract_obj (obj);
    }
  current_duel->in_duel_1->hit = current_duel->old_hit_1;
  current_duel->in_duel_1->mana = current_duel->old_mana_1;
  current_duel->in_duel_1->move = current_duel->old_move_1;
  current_duel->in_duel_1->position = POS_STANDING;
  location = get_room_index (ROOM_VNUM_SPECTATOR);
  spectator = location->people;
  char_from_room (winner);
  char_to_room (winner, location);
  trip_triggers(winner, OBJ_TRIG_ENTER_ROOM, NULL, NULL, OT_SPEC_NONE);
  trap_check(winner,"room",winner->in_room,NULL);
  sprintf(tcbuf,"%d",winner->in_room->vnum);
  trip_triggers_arg(winner, OBJ_TRIG_CHAR_TO_ROOM, NULL, NULL, OT_SPEC_NONE,tcbuf);
  check_aggression(winner);
  location = get_room_index (ROOM_VNUM_HALL_LEGENDS);
  char_from_room (loser);
  char_to_room (loser, location);
  trip_triggers(loser, OBJ_TRIG_ENTER_ROOM, NULL, NULL, OT_SPEC_NONE);
  trap_check(loser,"room",loser->in_room,NULL);
  sprintf(tcbuf,"%d",loser->in_room->vnum);
  trip_triggers_arg(loser, OBJ_TRIG_CHAR_TO_ROOM, NULL, NULL, OT_SPEC_NONE,tcbuf);
  check_aggression(loser);
  for (obj = current_duel->old_carry_1; obj; obj = obj_next)
    {
      obj_next = obj->next_content;
      obj_to_char (obj, current_duel->in_duel_1);
      equip_char_slot_new (current_duel->in_duel_1, obj, obj->prev_wear_loc);
    }
  current_duel->in_duel_2->hit = current_duel->old_hit_2;
  current_duel->in_duel_2->mana = current_duel->old_mana_2;
  current_duel->in_duel_2->move = current_duel->old_move_2;
  current_duel->in_duel_2->position = POS_STANDING;
  for (obj = current_duel->old_carry_2; obj; obj = obj_next)
    {
      obj_next = obj->next_content;
      obj_to_char (obj, current_duel->in_duel_2);
      equip_char_slot_new (current_duel->in_duel_2, obj, obj->prev_wear_loc);
    }
  current_duel->old_carry_1 = NULL;
  current_duel->old_carry_2 = NULL;
  free (current_duel);
  current_duel = NULL;
  duel_record (winner->name, loser->name);
  for (xx = 0; spectator != NULL; xx++)
    spectator = spectator->next_in_room;
  winner->gold += (xx * 2);
  sprintf (tcbuf,
	   "You are awarded your cut of the ticket sales, %d gold coins!\n\r",
	   xx * 2);
  send_to_char (tcbuf, winner);
  send_to_char
    ("You are instantly transported to the arena spectator's room.\n\r",
     winner);
  act ("$n arrives, $s fists raised in victory.", winner, NULL, NULL,
       TO_ROOM);
  send_to_char
    ("You are instantly transported to the Hall of Legends.\n\r", loser);
  act ("$n arrives, hanging $s head in shame.", loser, NULL, NULL, TO_ROOM);
  award_item (winner, loser);
  unlink_duel_backups (loser, winner);
  do_stripaffects(loser,loser->name);
  do_stripaffects(winner,winner->name);
  if (!IS_NPC(loser))
    loser->pcdata->aggression = 0;
  if (!IS_NPC(winner))
     winner->pcdata->aggression = 0;
	  
}

ROOM_INDEX_DATA *get_random_arena (CHAR_DATA * ch)
{
  ROOM_INDEX_DATA *room;
  for (;;)
    {
      room = get_room_index (number_range (23001, 23020));
      if (room != NULL)
//      if (IS_SET (room->room_flags, ROOM_ARENA))
	break;
    }
  return room;
}

int duel_compare (const struct duel_info *i, const struct duel_info *j)
//int duel_compare (void *i, void *j)   
{
  int icnt = 0, jcnt = 0;
  if ((i->wins * (i->wins + i->losses)) -
      (i->losses * (i->wins + i->losses)) >
      (j->wins * (j->wins + j->losses)) - (j->losses * (j->wins + j->losses)))
    icnt += 3;
  if ((i->wins * (i->wins + i->losses)) -
      (i->losses * (i->wins + i->losses)) <
      (j->wins * (j->wins + j->losses)) - (j->losses * (j->wins + j->losses)))
    jcnt += 3;
  if (i->per > j->per)
    icnt += 2;
  if (i->per < j->per)
    jcnt += 2;
  if (i->per == 0)
    icnt -= 2;
  if (j->per == 0)
    jcnt -= 2;
  if (icnt > jcnt)
    return (1);
  if (icnt < jcnt)
    return (-1);
  return (0);
}

void show_duel_record (CHAR_DATA * ch)
{
  struct duel_info *duel_array;
  struct stat sbuf;
  int afd, xx = 0, cnt = 1;
  char tcbuf[MAX_STRING_LENGTH];
  if (stat ("duel_record", &sbuf) == -1)
    {
      send_to_char
	("               `i___________________   ___________________``\n\r",
	 ch);
      send_to_char
	("           `b.-/`i|  `e45   `l~`g~`k**`g~`l~      `m\\ /``      `l~`g~`k**`g~`l~   `e46  `i|`b\\-.``\n\r",
	 ch);
      send_to_char
	("           `b|||`i|                    `b:                    `i|`b|||``\n\r",
	 ch);
      send_to_char
	("           `b|||`i| `l<`g= `kRank & Hero `g=`l>  `b: `l<`g= `kWins & Losses `g=`l>`i|`b|||``\n\r",
	 ch);
      send_to_char
	("           `b|||`i|                    `b:                    `i|`b|||``\n\r",
	 ch);
      send_to_char
	("           `b|||`i|                    `b:                    `i|`b|||``\n\r",
	 ch);
      send_to_char
	("           `b|||`i|                    `b:                    `i|`b|||``\n\r",
	 ch);
      send_to_char
	("           `b|||`i|                    `b:                    `i|`b|||``\n\r",
	 ch);
      send_to_char
	("           `b|||`i|                    `b:                    `i|`b|||``\n\r",
	 ch);
      send_to_char
	("           `b|||`i|                    `b:                    `i|`b|||``\n\r",
	 ch);
      send_to_char
	("           `b|||`i|                    `b:                    `i|`b|||``\n\r",
	 ch);
      send_to_char
	("           `b||`m/`i====================`m\\`b:`m/`i====================`m\\`b||``\n\r",
	 ch);
      send_to_char
	("            `m==`b-------------------`m~`b___`m~`b--------------------`m=``\n\r",
	 ch);
      return;
    }
  if (sbuf.st_size <= 0)
    return;
  duel_array = (struct duel_info *) malloc (sbuf.st_size);
  if (duel_array == NULL)
    return;
  afd = open ("duel_record", O_RDONLY);
  if (afd < 1)
    {
      send_to_char
	("               `i___________________   ___________________``\n\r",
	 ch);
      send_to_char
	("           `b.-/`i|  `e45   `l~`g~`k**`g~`l~      `m\\ /``      `l~`g~`k**`g~`l~   `e46  `i|`b\\-.``\n\r",
	 ch);
      send_to_char
	("           `b|||`i|                    `b:                    `i|`b|||``\n\r",
	 ch);
      send_to_char
	("           `b|||`i| `l<`g= `kRank & Hero `g=`l>  `b: `l<`g= `kWins & Losses `g=`l>`i|`b|||``\n\r",
	 ch);
      send_to_char
	("           `b|||`i|                    `b:                    `i|`b|||``\n\r",
	 ch);
      send_to_char
	("           `b|||`i|                    `b:                    `i|`b|||``\n\r",
	 ch);
      send_to_char
	("           `b|||`i|                    `b:                    `i|`b|||``\n\r",
	 ch);
      send_to_char
	("           `b|||`i|                    `b:                    `i|`b|||``\n\r",
	 ch);
      send_to_char
	("           `b|||`i|                    `b:                    `i|`b|||``\n\r",
	 ch);
      send_to_char
	("           `b|||`i|                    `b:                    `i|`b|||``\n\r",
	 ch);
      send_to_char
	("           `b|||`i|                    `b:                    `i|`b|||\n\r",
	 ch);
      send_to_char
	("           `b||`m/`i====================`m\\`b:`m/`i====================`m\\`b||``\n\r",
	 ch);
      send_to_char
	("          `m==`b--------------------`m~`b___`m~`b--------------------`m==``\n\r",
	 ch);
      return;
    }
  while (read (afd, &duel_array[xx], sizeof (struct duel_info)) > 0)
    xx++;
  qsort ((struct duel_info *) duel_array, xx, sizeof (struct duel_info),
	 (int(*)(const void *,const void *)) duel_compare);
  send_to_char
    ("               `i___________________   ___________________``\n\r", ch);
  send_to_char
    ("           `b.-/`i|  `e45   `l~`g~`k**`g~`l~      `m\\ /``      `l~`g~`k**`g~`l~   `e46  `i|`b\\-.``\n\r",
     ch);
  send_to_char
    ("           `b|||`i|                    `b:                    `i|`b|||``\n\r",
     ch);
  send_to_char
    ("           `b|||`i| `l<`g= `kRank & Hero `g=`l>  `b: `l<`g= `kWins & Losses `g=`l>`i|`b|||``\n\r",
     ch);
  send_to_char
    ("           `b|||`i|                    `b:                    `i|`b|||``\n\r",
     ch);
  for (xx--; xx >= 0; xx--)
    {
      if (cnt == 10)
	sprintf (tcbuf,
		 "           `b|||`i| `g{`o%d`g}`` `o%-13s`` `b:``    `l%3d   %3d       `i|`b|||``\n\r",
		 cnt, duel_array[xx].name, duel_array[xx].wins,
		 duel_array[xx].losses);

      else
	sprintf (tcbuf,
		 "           `b|||`i| `g{`o%d`g}``  `o%-13s`` `b:``    `l%3d   %3d       `i|`b|||``\n\r",
		 cnt, duel_array[xx].name, duel_array[xx].wins,
		 duel_array[xx].losses);
      send_to_char (tcbuf, ch);
      if (cnt == 10)
	break;
      cnt++;
    }
  for (; cnt < 6; cnt++)
    send_to_char
      ("           `b|||`i|                    `b:                    `i|`b|||``\n\r",
       ch);
  send_to_char
    ("           `b|||`i|                    `b:                    `i|`b|||``\n\r",
     ch);
  send_to_char
    ("           `b||`m/`i====================`m\\`b:`m/`i====================`m\\`b||\n\r",
     ch);
  send_to_char
    ("           `m==`b--------------------`m~`b___`m~`b--------------------`m==``\n\r",
     ch);
  close (afd);
}

void duel_record (char *winner, char *loser)
{
  bool win_find = FALSE, lose_find = FALSE;
  struct duel_info dinfo;
  int afd;
  afd = open ("duel_record", O_CREAT | O_RDWR, 00644);
  if (afd < 1)
    return;
  while (read (afd, &dinfo, sizeof (struct duel_info)) > 0)
    {
      if (win_find == FALSE && !str_cmp (dinfo.name, winner))
	{
	  lseek (afd, (0 - sizeof (struct duel_info)), SEEK_CUR);
	  dinfo.wins++;
	  if (dinfo.losses == 0)
	    dinfo.per = 100.0;

	  else if (dinfo.wins == 0)
	    dinfo.per = 0.0;

	  else
	    dinfo.per =
	      ((float) dinfo.wins /
	       ((float) dinfo.losses + (float) dinfo.wins)) * 100.000;
	  write (afd, &dinfo, sizeof (struct duel_info));
	  win_find = TRUE;
	}
      else if (lose_find == FALSE && !str_cmp (dinfo.name, loser))
	{
	  lseek (afd, (0 - sizeof (struct duel_info)), SEEK_CUR);
	  dinfo.losses++;
	  if (dinfo.losses == 0)
	    dinfo.per = 100.0;

	  else if (dinfo.wins == 0)
	    dinfo.per = 0.0;

	  else
	    dinfo.per =
	      ((float) dinfo.wins /
	       ((float) dinfo.losses + (float) dinfo.wins)) * 100.0;
	  write (afd, &dinfo, sizeof (struct duel_info));
	  lose_find = TRUE;
	}
      if (win_find && lose_find)
	break;
    }
  lseek (afd, 0L, SEEK_END);
  if (!win_find)
    {
      strcpy (dinfo.name, winner);
      dinfo.wins = 1;
      dinfo.losses = 0;
      dinfo.per = 100.0;
      write (afd, &dinfo, sizeof (struct duel_info));
    }
  if (!lose_find)
    {
      strcpy (dinfo.name, loser);
      dinfo.wins = 0;
      dinfo.losses = 1;
      dinfo.per = 0.0;
      write (afd, &dinfo, sizeof (struct duel_info));
    }
  close (afd);
}

//Iblis - New Dueling function, "Super Duel"
void do_superduel(CHAR_DATA* ch, char* argument)
{
  char buf[MAX_STRING_LENGTH];
  if (ch->level < 10)
  {
    send_to_char ("You are too little to super duel!\n\r",ch);
    return;
  }
  if (IS_IMMORTAL(ch))
  {
    send_to_char ("BAD IMM NO!\n\r",ch);
    sprintf(buf,"Super duel tick counter = %d\n\r",superduel_ticks);
    send_to_char(buf,ch);
    return;
  }
  if (IS_NPC(ch))
  {
    send_to_char ("BAD NPC NO!\n\r",ch);
    return;
  }
  if (ch->in_room->vnum != ROOM_VNUM_SD_START)
  {
    send_to_char ("The entrance to the super duel arena is not here..\n\r",ch);
    return;
  }

  if (ch->position == POS_MOUNTED)
  {
    send_to_char ("Please dismount before entering the super duel arena.\n\r",ch);
    return;
  }
	        
  if ((time (NULL) - ch->pcdata->last_fight < 120))
  {
    send_to_char ("You can't enter the super duel right now.\n\r", ch);
    return;
  }
  
  if (superduel_ticks < 0 || superduel_ticks > 3)
  {
    send_to_char("A super duel is already in progress, please wait until it is over.\n\r",ch);
    return;
  }
  if (battle_royale)
  {
    send_to_char("No super dueling during Battle Royale.  There is enough carnage already.\n\r",ch);
    return;
  }
  //IF FIGHT_LAG, don't let them do it
//  do_goto(ch,"23028");

    ch->pcdata->sd_team = SD_NO_TEAM;
    if (!strcmp(argument,"red"))
      ch->pcdata->sd_team = SD_TEAM_RED;
    else if (!strcmp(argument,"blue"))
      ch->pcdata->sd_team = SD_TEAM_BLUE;
    else if (!strcmp(argument,"green"))
      ch->pcdata->sd_team = SD_TEAM_GREEN;
    else if (!strcmp(argument,"yellow"))
      ch->pcdata->sd_team = SD_TEAM_YELLOW;
    if (superduel_ticks != 0 && superduel_teams && ch->pcdata->sd_team == SD_NO_TEAM)
    {
       send_to_char("`oThis is a team superduel.  You must join a team via `ksuperduel TEAM`` where TEAM is\n\r",ch);
       send_to_char("`bred`o, `eblue`o, `cgreen`o, or `kyellow`o.\n\r",ch);
       return;
    }
       
  act ("$n is transported to the waiting room, awaiting $s chance to fight in a super duel.", ch, NULL, NULL, TO_ROOM);
  char_from_room (ch);
  char_to_room (ch, find_location (ch, "23055"));
  trip_triggers(ch, OBJ_TRIG_ENTER_ROOM, NULL, NULL, OT_SPEC_NONE);
  trap_check(ch,"room",ch->in_room,NULL);
  sprintf(buf,"%d",ch->in_room->vnum);
  trip_triggers_arg(ch, OBJ_TRIG_CHAR_TO_ROOM, NULL, NULL, OT_SPEC_NONE,buf);
//  check_aggression(ch);
  //MAKE THE ABOVE room noquit, norecall, noteleport, and have a down path to DSC
  //set some flag saying they're waiting to go in
  //changed that..made it so after 5 ticks everyone in the room is transfered into the arena..
  //If only one person is transfered in, they are made fun of on OOC
  if (superduel_ticks == 0)
  {
    superduel_ticks = 3;
    if (ch->pcdata->sd_team != SD_NO_TEAM)
    {
      superduel_teams = TRUE;
      sprintf(buf,"A new TEAM superduel has been announced by `l%s``!",ch->name);
      arena_chan(buf);
    }
    else 
    {
      superduel_teams = FALSE;
      sprintf(buf,"A new superduel has been announced by `l%s``!",ch->name);
      arena_chan(buf);
    } 
  }
  else if (ch->pcdata->sd_team == SD_NO_TEAM) 
  {
    sprintf(buf,"`l%s`o has joined the superduel.",ch->name);
    arena_chan(buf);
  }
  if (ch->pcdata->sd_team != SD_NO_TEAM)
  {
    switch (ch->pcdata->sd_team)
    {
      case SD_TEAM_BLUE:
        sprintf(buf, "`l%s`o has joined the superduel for team `eBlue`o.",ch->name);
	break;
      case SD_TEAM_YELLOW:
        sprintf(buf, "`l%s`o has joined the superduel for team `kYellow`o.",ch->name);
        break;
      case SD_TEAM_RED:
        sprintf(buf, "`l%s`o has joined the superduel for team `bRed`o.",ch->name);
        break;
      case SD_TEAM_GREEN:
        sprintf(buf, "`l%s`o has joined the superduel for team `cGreen`o.",ch->name);
        break;
    }
    arena_chan(buf);
  }
  sprintf(buf,"There are %i ticks remaining til the superduel begins.\n\r",superduel_ticks);
  send_to_char(buf,ch);
}

//Iblis - Called when someone super dueling gets killed
void superduel_ends(CHAR_DATA *winner, CHAR_DATA *loser)
{
  char buf[MAX_STRING_LENGTH];
  char lteam[MAX_STRING_LENGTH], wteam[MAX_STRING_LENGTH];
  CHAR_DATA* chpointer;
  bool teams_done;
  int counter;
  if (superduel_teams)
  {
    if (!IS_NPC(loser))
    {
      switch (loser->pcdata->sd_team)
      {
        case SD_TEAM_BLUE: sprintf(lteam,"`e%s of team Blue",loser->name);break;
        case SD_TEAM_RED: sprintf(lteam,"`b%s of team Red",loser->name);break;
        case SD_TEAM_YELLOW: sprintf(lteam,"`k%s of team Yellow",loser->name);break;
        case SD_TEAM_GREEN: sprintf(lteam,"`c%s of team Green",loser->name);break;
      }
    }
    else sprintf(lteam, "`f%s of team NPC",loser->short_descr);

    if (!IS_NPC(winner))
    {
      switch (winner->pcdata->sd_team)
      {
        case SD_TEAM_BLUE: sprintf(wteam,"`e%s of team Blue",winner->name);break;
        case SD_TEAM_RED: sprintf(wteam,"`b%s of team Red",winner->name);break;
        case SD_TEAM_YELLOW: sprintf(wteam,"`k%s of team Yellow",winner->name);break;
        case SD_TEAM_GREEN: sprintf(wteam,"`c%s of team Green",winner->name);break;
      }
    }
    else sprintf(wteam, "`f%s of team NPC",winner->short_descr);
  }
  else
  {
    sprintf(lteam,"%s",(IS_NPC(loser))?loser->short_descr:loser->name);
    sprintf(wteam,"%s",(IS_NPC(winner))?winner->short_descr:winner->name);
  }
/*  counter = number_range(1,6);
  switch (counter)
  {
    case 1 : sprintf(buf,"`l%s `ojust `bslaughtered `a%s `oduring a super duel!``",wteam,lteam); break;
    case 2 : sprintf(buf,"`l%s `ohas just been `btoasted`o by `a%s `oduring a super duel!``",lteam,wteam); break;
    case 3 : sprintf(buf,"`l%s `ojust `bmurdered `a%s `oduring a super duel!``",wteam,lteam); break;
    case 4 : sprintf(buf,"`oSeek vengeance! `l%s `ojust `bdestroyed `a%s `oduring a super duel!``",wteam,lteam); break;
    case 5 : sprintf(buf,"`oALAS!  `l%s `ohas just removed `a%s `ofrom the super duel!``",wteam,lteam); break;
    default : sprintf(buf,"`l%s `ojust got `bcreamed`o by `a%s `oduring a super duel!``",lteam,wteam); break;
  }
  counter = 0;*/
  if (winner->hit >= winner->max_hit)
    sprintf(buf,"`oSeek vengeance!  `l%s `ojust performed a FLAWLESS victory over `a%s`o in a super duel!``",wteam,lteam);
  else if (winner->hit >= winner->max_hit*.75)
    sprintf(buf,"`l%s `ojust `bcreamed `a%s`o during a super duel!``",wteam,lteam);
  else if (winner->hit >= winner->max_hit*.5)
    sprintf(buf,"`l%s `ojust `bslaughtered `a%s`o during a super duel!``",wteam,lteam);
  else if (winner->hit >= winner->max_hit*.4)
    sprintf(buf,"`l%s `ohas `bdestroyed `a%s`o during a super duel!``",wteam,lteam);	   
  else if (winner->hit >= winner->max_hit*.3)
    sprintf(buf,"`l%s `ojust `bmurdered `a%s`o during a super duel!``",wteam,lteam);
  else if (winner->hit >= winner->max_hit*.2)
    sprintf(buf,"`l%s `ohas toasted `a%s`o during a super duel!``",wteam,lteam);
  else if (winner->hit >= winner->max_hit*.1)
    sprintf(buf,"`l%s `ohas just removed `a%s`o from the super duel!``",wteam,lteam);
  else sprintf(buf,"`l%s `ojust barely beat `a%s`o during a super duel.``",wteam,lteam);
  counter = 0; 
  arena_chan(buf);
  if (IS_NPC(loser))
  {
    loser->hit = loser->max_hit;
    loser->mana = loser->max_mana;
    loser->move = loser->max_move;
  }
  else
  {
    loser->pcdata->sd_team = SD_NO_TEAM;
    loser->hit = loser->pcdata->backup_hit;
    loser->mana = loser->pcdata->backup_mana;
    loser->move = loser->pcdata->backup_move;
  }
   
  loser->position = POS_RESTING;
  if (!IS_NPC(loser))
  {
    if (loser->pcdata->condition[COND_HUNGER] < 0)
      loser->pcdata->condition[COND_HUNGER] = 0;
    if (loser->pcdata->condition[COND_THIRST] < 0)
      loser->pcdata->condition[COND_THIRST] = 0;
    if (loser->pcdata->familiar)
    {
	    char_from_room(loser->pcdata->familiar);
            char_to_room(loser->pcdata->familiar,winner->in_room);
	    familiar_poof(loser);
    }
    loser->pcdata->aggression = 0;
  }
  do_stripaffects(loser,loser->name);
  sprintf(buf,"%d",ROOM_VNUM_SD_END);
  do_goto(loser,buf);
  loser->dueler = FALSE;
  teams_done = TRUE;
  winner = NULL;
  for (chpointer = char_list;chpointer != NULL;chpointer = chpointer->next)
    {
      if (!IS_NPC(chpointer))
      {
        if (chpointer->dueler)
	{
	  if (superduel_teams && winner != NULL && chpointer->pcdata->sd_team != winner->pcdata->sd_team)
	  {
            teams_done = FALSE;
	  }
  	  winner = chpointer;
//	  do_ooc(chpointer,"MMMMMEEEEE!");
//	  log_string(chpointer->name);
  	  counter++;
	}
      }
    }
  if (superduel_teams && teams_done)
  {
    //extract and clean all the winners
    if (!IS_NPC(winner))
    {
      switch (winner->pcdata->sd_team)
      {
        case SD_TEAM_BLUE: sprintf(wteam,"`eTeam Blue");break;
        case SD_TEAM_RED: sprintf(wteam,"`bTeam Red");break;
        case SD_TEAM_YELLOW: sprintf(wteam,"`kTeam Yellow");break;
        case SD_TEAM_GREEN: sprintf(wteam,"`cTeam Green");break;
      }
    }
    else sprintf(wteam,"`fTeam NPC");
    sprintf(buf,"`oAnd the grand winner of the most recent super duel is -> `b%s`o!",wteam);
    arena_chan(buf);
    if (IS_NPC(winner))
      return;
    for (chpointer = char_list;chpointer != NULL;chpointer = chpointer->next)
    {
      if (!IS_NPC(chpointer))
      {
	if (chpointer->dueler)
	{
          sprintf(buf,"`l%s `owas still alive for %s`o.",chpointer->name,wteam);
	  arena_chan(buf);
	  sprintf(buf,"%d",ROOM_VNUM_SD_END);
	  do_goto(chpointer,buf);
	  superduel_ticks = 0;
	  chpointer->pcdata->events_won[TEAM_SD_WON]++;
          chpointer->hit = chpointer->pcdata->backup_hit;
          chpointer->mana = chpointer->pcdata->backup_mana;
	  chpointer->move = chpointer->pcdata->backup_move;
          if (chpointer->pcdata->condition[COND_HUNGER] < 0)
            chpointer->pcdata->condition[COND_HUNGER] = 0;
          if (chpointer->pcdata->condition[COND_THIRST] < 0)
            chpointer->pcdata->condition[COND_THIRST] = 0;
          if (chpointer->pcdata->familiar)
          {
		  char_from_room(chpointer->pcdata->familiar);
                  char_to_room(chpointer->pcdata->familiar,winner->in_room);
		  familiar_poof(chpointer);
          }
          chpointer->pcdata->aggression = 0;
	  do_stripaffects(chpointer,chpointer->name);
	  if (chpointer != winner)
   	    chpointer->pcdata->sd_team = SD_NO_TEAM;
	  chpointer->dueler = FALSE;
	}
      }
    }
    winner->pcdata->sd_team = SD_NO_TEAM;
  }
  else if (!superduel_teams && counter == 1)
  {
    winner->dueler = FALSE;
    if (!IS_NPC(winner))
      winner->pcdata->sd_team = SD_NO_TEAM;
    sprintf(buf,"%d",ROOM_VNUM_SD_END);
    do_goto(winner,buf);
    sprintf(buf,"`oAnd the grand winner of the most recent super duel is -> `b%s`o!",
		    IS_NPC(winner)?winner->short_descr:winner->name);
    arena_chan(buf);
    superduel_ticks = 0;
    if (!IS_NPC(winner) && winner->pcdata)
      winner->pcdata->events_won[SD_WON]++;
    if (IS_NPC(winner))
    {
      winner->hit = winner->max_hit;
      winner->mana = winner->max_mana;
      winner->move = winner->max_move;
    }
    else
    {
      winner->hit = winner->pcdata->backup_hit;
      winner->mana = winner->pcdata->backup_mana;
      winner->move = winner->pcdata->backup_move;
    }
    if (!IS_NPC(winner))
     {
       if (winner->pcdata->condition[COND_HUNGER] < 0)
         winner->pcdata->condition[COND_HUNGER] = 0;
       if (winner->pcdata->condition[COND_THIRST] < 0)
         winner->pcdata->condition[COND_THIRST] = 0;
       if (winner->pcdata->familiar)
         {
		 char_from_room(winner->pcdata->familiar);
		 char_to_room(winner->pcdata->familiar,winner->in_room);
	   familiar_poof(winner);
         }
       winner->pcdata->aggression = 0;
       
     }
    /*if (IS_AFFECTED (winner, AFF_POISON))
     {
       REMOVE_BIT (winner->affected_by, AFF_POISON);
       affect_strip (winner, gsn_poison);
     }
    if (IS_AFFECTED (winner, AFF_PLAGUE))
     {
       REMOVE_BIT (winner->affected_by, AFF_PLAGUE);
       affect_strip (winner, gsn_plague);
     }
    if (IS_AFFECTED (winner, AFF_BLIND))
     {
       REMOVE_BIT (winner->affected_by, AFF_BLIND);
       affect_strip (winner, gsn_blindness);
     }
    affect_strip(winner,skill_lookup("pox"));
    if (is_affected(winner,skill_lookup("brain blisters")))
    {
      affect_strip(winner,skill_lookup("brain blisters"));
      affect_strip(winner,skill_lookup("disorientation"));
    }
    affect_strip(winner,skill_lookup("vomit"));
    affect_strip(winner,skill_lookup("atrophy"));*/
    do_stripaffects(winner,winner->name);
	    
  }
}