/
Debug/
area/
data/
gods/
player/
player/skill/
/****************************************************************************
 *  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,			*
 *  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.	*
 *																			*
 *  Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael			*
 *  Chastain, Michael Quan, and Mitchell Tse.								*
 *																			*
 *  In order to use any part of this Merc Diku Mud, you must comply with	*
 *  both the original Diku license in 'license.doc' as well the Merc		*
 *  license in 'license.txt'.  In particular, you may not remove either of	*
 *  these copyright notices.												*
 *																			*
 *  Much time and thought has gone into this software and you are			*
 *  benefitting.  We hope that you share your changes too.  What goes		*
 *  around, comes around.													*
 ***************************************************************************/
 
/****************************************************************************
*	ROM 2.4 is copyright 1993-1998 Russ Taylor								*
*	ROM has been brought to you by the ROM consortium						*
*	    Russ Taylor (rtaylor@hypercube.org)									*
*	    Gabrielle Taylor (gtaylor@hypercube.org)							*
*	    Brian Moore (zump@rom.org)											*
*	By using this code, you have agreed to follow the terms of the			*
*	ROM license, in the file Rom24/doc/rom.license							*
***************************************************************************/
/****************************************************************************
*	Demon's Dance MUD, and source code are property of Eric Goetschalckx	*
*	By compiling this code, you agree to include the following in your		*
*	login screen:															*
*	    Derivative of Demon's Dance, by Enzo/Stan							*
***************************************************************************/

#if defined(macintosh)
#include <types.h>
#elif defined(WIN32)
#include <sys/types.h>
#include <time.h>
#define NOCRYPT
#else
#include <sys/types.h>
#include <sys/time.h>
#endif
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <time.h>
#include "merc.h"
#include "interp.h"
#include "magic.h"
#include "recycle.h"
#include "tables.h"
#include "lookup.h"
#include "arena.h"

int		red_leader;
int		blue_leader;
void	remove_teams	args( ( CHAR_DATA *ch ) );

void do_startwar(CHAR_DATA *ch, char *argument)
{
	char buf[MAX_STRING_LENGTH];
	char arg1[MAX_INPUT_LENGTH];
	char arg2[MAX_INPUT_LENGTH];
	char arg3[MAX_INPUT_LENGTH];
	DESCRIPTOR_DATA *d;
	int nMatch;
	char warshow[MSL];
  
	argument = one_argument(argument, arg1);
	argument = one_argument(argument, arg2);
	argument = one_argument(argument, arg3);
	/*make sure enough characters are on*/
    nMatch = 0;
    
	for ( d = descriptor_list; d != NULL; d = d->next )
    {
        CHAR_DATA *wch;
        if ( d->connected != CON_PLAYING)
            continue;
		if ( !d->character ) 
			continue; 
        wch   = ( d->original != NULL ) ? d->original : d->character;
		if (wch->level <= 101)
			nMatch++;
		else continue;
	}

	if (nMatch < 2)
	{
		send_to_char("Sorry, but there arent enough people on to have a war.", ch);
		return;
	}

	if (arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0')
	{
		send_to_char("Syntax: startwar <type> <min_level> <max_level>\n\r", ch);
		return;
	}

	if ( atoi(arg1) < 1 || atoi(arg1) > 3)
	{
		send_to_char("The type either has to be 1, or 2.\n\r", ch);
		return;
	}

	if ( atoi(arg2) <= 0 || atoi(arg2) > 110)
	{
		send_to_char("Level must be between 1 and 110.\n\r", ch);
		return;
	}

	if (atoi(arg3) <= 0 || atoi(arg3) > 110)
	{
		send_to_char("Level must be between 1 and 110.\n\r", ch);
		return;
	}

	if (atoi(arg3) < atoi(arg2))
	{
		send_to_char("Max level must be greater than the min level.\n\r", ch);
		return;
	}

	if (iswar == TRUE)
	{
		send_to_char("There is already a war going!\n\r", ch);
		return;
	}

	iswar = TRUE;
	wartype = atoi(arg1);
	switch (wartype)
	{
	default:
		sprintf(warshow,"{GSingle{x");
		break;
	case 1:
		sprintf(warshow,"{GSingle{x");
		break;
	case 2:
		sprintf(warshow,"{BT{be{Ra{rm{x");
		break;
	break;
	}
	min_level = atoi(arg2);
	max_level = atoi(arg3);
	sprintf(buf, "{W{c%s {Wwar started for levels {c%d {Wto {C%d{W.  Type {R'{YWAR{R'{W to kill or be killed{x", warshow, min_level, max_level);
	do_wartalk(ch,buf);
	time_left = 3;
	wartimer = 0;
	red_leader = FALSE;
	blue_leader = FALSE;
	red_num = 0;
	blue_num = 0;
	check_red = 0;
	check_blue = 0;
}

void do_petition(CHAR_DATA *ch, char *argument)
{
	char buf[MAX_STRING_LENGTH];
	char arg1[MAX_INPUT_LENGTH];
	DESCRIPTOR_DATA *d;
	int nMatch;
	char warshow[MSL];
  
	argument = one_argument(argument, arg1);
	/*make sure enough characters are on*/
    nMatch = 0;
    
	for ( d = descriptor_list; d != NULL; d = d->next )
    {
        CHAR_DATA *wch;
        if ( d->connected != CON_PLAYING)
            continue;
		if ( !d->character ) 
			continue; 
        wch   = ( d->original != NULL ) ? d->original : d->character;
		if (wch->level <= 101)
			nMatch++;
		else continue;
	}

	if (nMatch < 2)
	{
		send_to_char("Sorry, but there arent enough people on to have a war.", ch);
		return;
	}

	if (arg1[0] == '\0')
	{
		send_to_char("Syntax: petition <type>\n\r", ch);
		return;
	}

	if (iswar == TRUE)
	{
		send_to_char("There is already a war going!\n\r", ch);
		return;
	}

	iswar = TRUE;
	wartype = atoi(arg1);
	switch (wartype)
	{
	default:
		sprintf(warshow,"{GSingle{x");
		break;
	case 1:
		sprintf(warshow,"{GSingle{x");
		break;
	case 2:
		sprintf(warshow,"{BT{be{Ra{rm{x");
		break;
	break;
	}
	min_level = 1;
	max_level = 101;
	sprintf(buf, "{W{c%s {Wwar started for levels {c%d {Wto {C%d{W.  Type {R'{YWAR{R'{W to kill or be killed{x", warshow, min_level, max_level);
	do_wartalk(ch,buf);
	time_left = 3;
	wartimer = 0;
	red_leader = FALSE;
	blue_leader = FALSE;
	red_num = 0;
	blue_num = 0;
	check_red = 0;
	check_blue = 0;
}

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

	if (iswar != TRUE) 
	{
		send_to_char("There is no war going!\n\r", ch);
		return;
	}

	if (ch->level < min_level || ch->level > max_level)
	{
		send_to_char("Sorry, you can't join this war.\n\r", ch);
		return;
	}

	if (IS_SET(ch->plr2, PLR2_ARENA))
	{
		send_to_char("I don't think so.\n\r", ch);
		return;
	}

	if (time_left <= 0)
	{
		send_to_char("{RThat war has already begun{x\n\r",ch);
		return;
	}

	if (wartype == 1)
	{
		if ((location = get_room_index(SINGLE_WAR_WAITING_ROOM)) == NULL)
		{
		send_to_char("Arena is not yet completed, sorry.\n\r", ch);
		return;
		}
		else
		{
		  act("{g$n{W joins the war!{x",ch, NULL, NULL, TO_ROOM); 
		  char_from_room(ch);
		  char_to_room(ch, location);
		  SET_BIT(ch->plr2, PLR2_ARENA);
		  SET_BIT(ch->plr2, PLR2_SINGLE_WAR);
		  sprintf(buf, "{G%s {D({R%d{D) {Wjoins the war!", ch->name, ch->level);
		  do_wartalk(ch,buf);
		  warprize += ch->level;
		  sprintf(buf, "{WWarprize is up to {B%d{x",warprize);
		  do_wartalk(ch,buf);
		  sprintf(buf, "{WTime left to join: {Y%d{x",time_left);
		  do_wartalk(ch,buf);
		  act("$n arrives to do battle", ch, NULL, NULL, TO_ROOM);
		  inwar++;
		  do_look(ch, "auto");
		  return;
		}
	}

	if (wartype == 2)
	{
		location = get_room_index(SINGLE_WAR_WAITING_ROOM);
		if (red_leader == FALSE)
		{
			act("{g$n{W joins the war!{x", ch, NULL, NULL, TO_ROOM); 
			char_from_room(ch);
			char_to_room(ch, location);
			sprintf(buf, "{G%s {D({R%d{D) {Wjoins the war!", ch->name, ch->level);
			do_wartalk(ch,buf);
			sprintf(buf, "{G%s{W is now leader of the {RR{re{Rd{W team.",ch->name);
			do_wartalk(ch,buf);
			SET_BIT(ch->plr2, PLR2_ARENA);
			SET_BIT(ch->plr2, PLR2_RED_LEADER);
			SET_BIT(ch->plr2, PLR2_RED_TEAM);
			red_leader = TRUE;
			warprize += ch->level;
			sprintf(buf, "{WWarprize is up to {B%d{x",warprize);
			do_wartalk(ch,buf);
			sprintf(buf, "{WTime left to join: {Y%d{x",time_left);
			do_wartalk(ch,buf);
			act("$n arrives to do battle", ch, NULL, NULL, TO_ROOM);
			inwar++;
			do_look(ch, "auto");
			next_team = 1;
			red_num ++;
			return;
		}
		if (blue_leader == FALSE && red_leader == TRUE)
		{
			act("{g$n{W joins the war!{x", ch, NULL, NULL, TO_ROOM); 
			char_from_room(ch);
			char_to_room(ch, location);
			sprintf(buf, "{G%s {D({R%d{D) {Wjoins the war!", ch->name, ch->level);
			do_wartalk(ch,buf);
			sprintf(buf, "{G%s{W is now leader of the {BB{bl{Bu{be{W team.",ch->name);
			do_wartalk(ch,buf);
			SET_BIT(ch->plr2, PLR2_ARENA);
			SET_BIT(ch->plr2, PLR2_BLUE_LEADER);
			SET_BIT(ch->plr2, PLR2_BLUE_TEAM);
			blue_leader = TRUE;
			warprize += ch->level;
			sprintf(buf, "{WWarprize is up to {B%d{x",warprize);
			do_wartalk(ch,buf);
			sprintf(buf, "{WTime left to join: {Y%d{x",time_left);
			do_wartalk(ch,buf);
			act("$n arrives to do battle", ch, NULL, NULL, TO_ROOM);
			inwar++;
			do_look(ch, "auto");
			next_team = 0;
			blue_num ++;
			return;
		}
		if ((red_leader == TRUE) && (blue_leader == TRUE))
		{
			assign_red_team(ch);
			return;
		}
	}
	if (wartype == 3)
	{
		if ((location = get_room_index(SINGLE_WAR_WAITING_ROOM)) == NULL)
		{
		send_to_char("Arena is not yet completed, sorry.\n\r", ch);
		return;
		}
		else
		{
		  act("{g$n{W joins the war!{x", ch, NULL, NULL, TO_ROOM); 
		  char_from_room(ch);
		  char_to_room(ch, location);
		  SET_BIT(ch->plr2, PLR2_ARENA);
		  SET_BIT(ch->plr2, PLR2_SINGLE_WAR);
		  sprintf(buf, "{G%s {D({R%d{D) {Wjoins the war!", ch->name, ch->level);
		  do_wartalk(ch,buf);
		  warprize += ch->level;
		  sprintf(buf, "{WWarprize is up to {B%d{x",warprize);
		  do_wartalk(ch,buf);
		  sprintf(buf, "{WTime left to join: {Y%d{x",time_left);
		  do_wartalk(ch,buf);
		  act("$n arrives to do battle", ch, NULL, NULL, TO_ROOM);
		  inwar++;
		  do_look(ch, "auto");
		  return;
		}
	}
}

void war_update( int sn, int level, CHAR_DATA *ch, void *vo,int target )
{
	char buf[MAX_STRING_LENGTH];
	DESCRIPTOR_DATA *d;
	CHAR_DATA *fch;
	
	bool found = FALSE;
   
	if (time_left >= 2)
	{
	time_left--;
	sprintf(buf, "{W{G%d {Wtick%s left to join the war.{x", time_left, time_left == 1 ? "" : "s");
	do_wartalk(ch,buf);
    sprintf(buf, "{R%d {W%s %s fighting in the war, so far.{x", inwar, inwar == 1 ? "person" : "people", inwar == 1 ? "is" : "are");
	do_wartalk(ch,buf);
    sprintf(buf, "{WType of war: {c%d {R- {C%d{R, {C%s {Wwar.{x", min_level, max_level, wartype == 1 ? "{GSingle" : "{BT{be{Ra{rm");
	do_wartalk(ch,buf);
    return;
	}
	
	if ((time_left <= 1) && (iswar == TRUE) && (wartimer == 0))
	{
		time_left = 0;
		if (inwar == 0 || inwar == 1)
		{
			sprintf(buf, "{W{WNot enough people for war.  {RWar {YR{ye{Ws{ye{Yt{W.{x");
			do_wartalk(ch,buf);
			inwar = 0;
			warprize = 0;
			iswar = FALSE;
			time_left = 0;
			wartimer = 0;
			min_level = 0;
			max_level = 0;
			wartype = 0;
			for(d = descriptor_list; d != NULL; d = d->next)
			{
				fch = d->original ? d->original : d->character;
				if ( !fch || !fch->plr2) 
					continue; 
				remove_teams(fch);
				if (IS_SET(fch->plr2, PLR2_ARENA))
				{
					char_from_room(fch);
					char_to_room(fch, (get_room_index(ROOM_VNUM_TEMPLE)));
					do_look(fch, "auto");
					REMOVE_BIT(fch->plr2, PLR2_ARENA);
				}
			}
			return;
		}
		else if ((wartype == 1) || (wartype == 3))
		{
			sprintf(buf, "{W{WThe battle begins! {R%d {Wplayers are fighting!{x", inwar);
			do_wartalk(ch,buf);
			wartimer = 20;
			for ( d = descriptor_list; d != NULL; d = d->next )
			{
				fch = d->original ? d->original : d->character;
				if ( !fch || !fch->plr2) 
					continue; 
				if (IS_SET(fch->plr2, PLR2_ARENA))        
				{
					move_char_war(fch);
				}
			}
			return;
		}
		else
		{
			sprintf(buf, "{W{WThe battle begins! {R%d {Wplayers are fighting!{x", inwar);
			do_wartalk(ch,buf);
			wartimer = 20;
			for ( d = descriptor_list; d != NULL; d = d->next )
			{
				fch = d->original ? d->original : d->character;
				if ( !fch || !fch->plr2) 
					continue; 
				if (IS_SET(fch->plr2, PLR2_NO_TEAM) 
					&& IS_SET(fch->plr2, PLR2_ARENA))
				{
					if (next_team == 0)
					{
						sprintf(buf,"{G%s {Wjoins the {RR{re{Rd{W team{x",d->character->name);
						do_wartalk(ch,buf);
						SET_BIT(fch->plr2, PLR2_RED_TEAM);
						red_num ++;
						next_team = 1;
						move_char_war(fch);
					}
					else if (next_team == 1)
					{
						sprintf(buf,"{G%s {Wjoins the {BB{bl{Bu{be{W team{x",d->character->name);
						do_wartalk(ch,buf);
						SET_BIT(fch->plr2, PLR2_BLUE_TEAM);
						blue_num ++;
						next_team = 0;
						move_char_war(fch);
					}
				}
				else if (IS_SET(fch->plr2, PLR2_ARENA) 
					&& (IS_SET(fch->plr2, PLR2_RED_TEAM) 
					|| IS_SET(fch->plr2, PLR2_BLUE_TEAM)))
				{
				move_char_war(fch);
				}
			}
			return;
		}
		return;
	}
	return;
}

void do_stopwar (CHAR_DATA *ch, char *argument)
{	  
	char buf[MAX_STRING_LENGTH];
	CHAR_DATA *fch;
	
	DESCRIPTOR_DATA *d;

	if (iswar = FALSE)
	{
		sprintf(buf, "Sorry bud, there's no war at the moment");
		send_to_char(buf, ch);
	}
	else
	sprintf(buf, "{RWar {WR{Re{Ys{Re{Wt {xby {C%s.{x", ch->name);
	do_wartalk(ch,buf);
	sprintf(buf, "You have stopped the war dead in its tracks\n\r");
	send_to_char(buf, ch);
	sprintf(buf, "");
	send_to_char(buf, ch);
    iswar = FALSE;
	inwar = 0;
    time_left = 0;
    wartimer = 0;
    min_level = 0;
    max_level = 0;
    wartype = 0;
	warprize = 0;
	red_leader = 0;
	blue_leader = 0;
	red_num = 0;
	blue_num = 0;
	check_red = 0;
	check_blue = 0;
	for(d = descriptor_list; d != NULL; d = d->next)
	{
		fch = d->original ? d->original : d->character;
		if ( !fch || !fch->plr2) 
			continue; 
		remove_teams(fch);
		if (IS_SET(fch->plr2, PLR2_ARENA))
		{
			char_from_room(fch);
			char_to_room(fch, (get_room_index(ROOM_VNUM_TEMPLE)));
			REMOVE_BIT(fch->plr2, PLR2_ARENA);
		}
	}
}

void do_stop_aff(CHAR_DATA *ch, char *argument)
{
	char arg[MAX_INPUT_LENGTH];
    CHAR_DATA *victim;

	one_argument( argument, arg );

	if ( ( victim = get_char_world( ch, arg ) ) == NULL )
    {
	send_to_char( "They aren't here.\n\r", ch );
	return;
    }
	while ( victim->affected )
		affect_remove( victim, victim->affected );
	victim->affected_by	= race_table[victim->race].aff;
}

void war_prize( CHAR_DATA *ch)
{
	char buf[MAX_STRING_LENGTH];
	
	int random;

	random = number_range(90,100);
	train_prize = (warprize * random)/20000;
	qp_prize	= (warprize * random)/500;
	gold_prize	= (warprize * random);
	qp_final	= qp_prize - (train_prize * 20);
	gold_final	= gold_prize - (qp_prize * 1000);
	sprintf(buf, "{G%s{W wins {Y%d{W gold",ch->name, gold_final);
	do_wartalk(ch,buf);
	if (qp_final > 0)
	{
		sprintf(buf, "{G%s{W wins {B%d{W QP's", ch->name, qp_final);
		do_wartalk(ch,buf);
	}
	if (train_prize > 0)
	{
		sprintf(buf, "{G%s{W wins {C%d{W trains", ch->name, train_prize);
		do_wartalk(ch,buf);
	}
	ch->gold += gold_final;
	add_qp(ch, qp_final);
	ch->train += train_prize;
	affect_strip(ch,gsn_fortify);
	REMOVE_BIT(ch->affected2_by,AFF_FORTIFY);
	ch->pcdata->arena_wins ++;
	return;
}

void assign_red_team(CHAR_DATA *ch)
{
	DESCRIPTOR_DATA *d;
	ROOM_INDEX_DATA *location;
	CHAR_DATA *fch;
	char buf[MSL];

	location = get_room_index(SINGLE_WAR_WAITING_ROOM);
	for ( d = descriptor_list; d != NULL; d = d->next )
	{
		fch = d->original ? d->original : d->character;
		if ( !fch || !fch->plr2) 
			continue; 
		if (IS_SET(fch->plr2,PLR2_RED_LEADER))
		{
			if ((ch->max_hit > fch->max_hit) && (check_red != 1))
			{
				act("{g$n{W joins the war!{x", ch, NULL, NULL, TO_ROOM); 
				char_from_room(ch);
				char_to_room(ch, location);
				SET_BIT(ch->plr2, PLR2_ARENA);
				sprintf(buf, "{G%s {D({R%d{D) {Wjoins the war!", ch->name, ch->level);
				do_wartalk(ch,buf);
				sprintf(buf, "{G%s{W is longer the leader of the {RR{re{Rd{W team.",fch->name);
				do_wartalk(ch,buf);
				sprintf(buf, "{G%s{W is now leader of the {RR{re{Rd{W team.",ch->name);
				do_wartalk(ch,buf);
				SET_BIT(ch->plr2,PLR2_RED_LEADER);
				SET_BIT(ch->plr2, PLR2_RED_TEAM);
				REMOVE_BIT(fch->plr2,PLR2_RED_LEADER);
				REMOVE_BIT(fch->plr2,PLR2_RED_TEAM);
				SET_BIT(fch->plr2, PLR2_NO_TEAM);
				warprize += ch->level;
				sprintf(buf, "{WWarprize is up to {B%d{x",warprize);
				do_wartalk(ch,buf);
				sprintf(buf, "{WTime left to join: {Y%d{x",time_left);
				do_wartalk(ch,buf);
				act("$n arrives to do battle", ch, NULL, NULL, TO_ROOM);
				inwar++;
				do_look(ch, "auto");
				next_team = 1;
				return;
			}
			else if (check_blue != 1)
			{
				check_red = 1;
				assign_blue_team(ch);
				return;
			}
			else
			{
				act("{g$n{W joins the war!{x", ch, NULL, NULL, TO_ROOM); 
				char_from_room(ch);
				char_to_room(ch, location);
				SET_BIT(ch->plr2, PLR2_ARENA);
				sprintf(buf, "{G%s {D({R%d{D) {Wjoins the war!", ch->name, ch->level);
				do_wartalk(ch,buf);
				SET_BIT(ch->plr2, PLR2_NO_TEAM);
				warprize += ch->level;
				sprintf(buf, "{WWarprize is up to {B%d{x",warprize);
				do_wartalk(ch,buf);
				sprintf(buf, "{WTime left to join: {Y%d{x",time_left);
				do_wartalk(ch,buf);
				act("$n arrives to do battle", ch, NULL, NULL, TO_ROOM);
				inwar++;
				do_look(ch, "auto");
				next_team = 0;
				check_red = 0;
				check_blue = 0;
				return;
			}
		}
		else
		{
			continue;
		}
		return;
	}
}

void assign_blue_team(CHAR_DATA *ch)
{
	DESCRIPTOR_DATA *d;
	ROOM_INDEX_DATA *location;
	CHAR_DATA *fch;
	char buf[MSL];
	
	location = get_room_index(SINGLE_WAR_WAITING_ROOM);
	for ( d = descriptor_list; d != NULL; d = d->next )
	{
		fch = d->original ? d->original : d->character;
		if ( !fch || !fch->plr2) 
			continue; 
		if (IS_SET(fch->plr2,PLR2_BLUE_LEADER) )
		{
			if ((ch->max_hit > fch->max_hit) && (check_blue != 1))
			{
				act("{g$n{W joins the war!{x", ch, NULL, NULL, TO_ROOM); 
				char_from_room(ch);
				char_to_room(ch, location);
				SET_BIT(ch->plr2, PLR2_ARENA);
				sprintf(buf, "{G%s {D({R%d{D) {Wjoins the war!", ch->name, ch->level);
				do_wartalk(ch,buf);
				sprintf(buf, "{G%s{W is no longer the leader of the {BB{bl{Bu{be{W team.",fch->name);
				do_wartalk(ch,buf);
				sprintf(buf, "{G%s{W is now leader of the {BB{bl{Bu{be{W team.",ch->name);
				do_wartalk(ch,buf);
				SET_BIT(ch->plr2,PLR2_BLUE_LEADER);
				SET_BIT(ch->plr2, PLR2_BLUE_TEAM);
				REMOVE_BIT(fch->plr2,PLR2_BLUE_LEADER);
				REMOVE_BIT(fch->plr2,PLR2_BLUE_TEAM);
				SET_BIT(fch->plr2, PLR2_NO_TEAM);
				warprize += ch->level;
				sprintf(buf, "{WWarprize is up to {B%d{x",warprize);
				do_wartalk(ch,buf);
				sprintf(buf, "{WTime left to join: {Y%d{x",time_left);
				do_wartalk(ch,buf);
				act("$n arrives to do battle", ch, NULL, NULL, TO_ROOM);
				inwar++;
				do_look(ch, "auto");
				next_team = 0;
				return;
			}
			else if (check_red != 1)
			{
				check_blue = 1;
				assign_red_team(ch);
				return;
			}
			else
			{
				act("{g$n{W joins the war!{x", ch, NULL, NULL, TO_ROOM); 
				char_from_room(ch);
				char_to_room(ch, location);
				SET_BIT(ch->plr2, PLR2_ARENA);
				sprintf(buf, "{G%s {D({R%d{D) {Wjoins the war!", ch->name, ch->level);
				do_wartalk(ch,buf);
				SET_BIT(ch->plr2, PLR2_NO_TEAM);
				warprize += ch->level;
				sprintf(buf, "{WWarprize is up to {B%d{x",warprize);
				do_wartalk(ch,buf);
				sprintf(buf, "{WTime left to join: {Y%d{x",time_left);
				do_wartalk(ch,buf);
				act("$n arrives to do battle", ch, NULL, NULL, TO_ROOM);
				inwar++;
				do_look(ch, "auto");
				next_team = 0;
				check_red = 0;
				check_blue = 0;
				return;
			}
		}
		else
		{
			continue;
		}
		return;
	}
}

void remove_teams(CHAR_DATA *ch)
{
	if (IS_SET(ch->plr2, PLR2_RED_LEADER))
		REMOVE_BIT(ch->plr2,PLR2_RED_LEADER);
	if (IS_SET(ch->plr2, PLR2_BLUE_LEADER))
		REMOVE_BIT(ch->plr2,PLR2_BLUE_LEADER);
	if (IS_SET(ch->plr2, PLR2_RED_TEAM))
		REMOVE_BIT(ch->plr2,PLR2_RED_TEAM);
	if (IS_SET(ch->plr2, PLR2_BLUE_TEAM))
		REMOVE_BIT(ch->plr2,PLR2_BLUE_TEAM);
	if (IS_SET(ch->plr2, PLR2_NO_TEAM))
		REMOVE_BIT(ch->plr2,PLR2_NO_TEAM);
	if (IS_SET(ch->plr2,PLR2_SINGLE_WAR))
		REMOVE_BIT(ch->plr2,PLR2_SINGLE_WAR);
	if (IS_SET(ch->plr2,PLR2_CHALLENGED));
		REMOVE_BIT(ch->plr2,PLR2_CHALLENGED);
	if (IS_SET(ch->plr2,PLR2_CHALLENGER));
		REMOVE_BIT(ch->plr2,PLR2_CHALLENGER);
	if (IS_SET(ch->plr2,PLR2_PRE_CHALLENGED));
		REMOVE_BIT(ch->plr2,PLR2_PRE_CHALLENGED);
}

void move_char_war(CHAR_DATA *ch)
{
	ROOM_INDEX_DATA *random;

	/*Function that removes affects and heals arena players*/
	ch->hit = ch->max_hit;
	ch->mana = ch->max_mana;
	ch->move = ch->max_move;
	do_stop_aff(ch,ch->name);
	random = get_room_index( number_range(12001, 12016));
	char_from_room(ch);
	char_to_room(ch, random);
	do_look(ch, "auto");
}

 /*
  * The colour version of the act_new( ) function, -Lope
  *	This is now what sends the act_new( )'s
  */
void send_to_war( const char *format, CHAR_DATA *ch, const void *arg1, 
 	      const void *arg2, int type, int min_pos )
  {
	static char * const he_she  [] = { "it",  "he",  "she" };
	static char * const him_her [] = { "it",  "him", "her" };
	static char * const his_her [] = { "its", "his", "her" };
	CHAR_DATA 		*to;
	CHAR_DATA 		*vch = ( CHAR_DATA * ) arg2;
	OBJ_DATA 		*obj1 = ( OBJ_DATA  * ) arg1;
	OBJ_DATA 		*obj2 = ( OBJ_DATA  * ) arg2;
	ROOM_INDEX_DATA		*room;
	const 	char 	*str;
	char 		*i = NULL;
	char 		*point;
	char 		*pbuff;
	char 		buffer[ MSL*2 ];
	char 		buf[ MSL   ];
	char 		fname[ MIL  ];
	bool		fColour = FALSE;

	/*
	 * Discard null and zero-length messages.
	 */
	if( !format || !*format )
		return;
  
	/* discard null rooms and chars */
    if( !ch || !ch->in_room )
  	return;
	room = get_room_index(3061);
	to = room->people;
	if( type == TO_VICT )
	{
		if( !vch )
		{
			bug( "Act: null vch with TO_VICT.", 0 );
			return;
		}
	}
	for( ; to ; to = to->next_in_room )
	{
		if( type == TO_CHAR )
			continue;
		if( type == TO_VICT)
			continue;
		point   = buf;
		str     = format;
		while( *str != '\0' )
		{
			if( *str != '$' )
			{
				*point++ = *str++;
				continue;
			}
   
			fColour = TRUE;
			++str;
			i = " <@@@> ";
			if( !arg2 && *str >= 'A' && *str <= 'Z' )
			{
				bug( "Act: missing arg2 for code %d.", *str );
				i = " <@@@> ";
			}
			else
			{
				switch ( *str )
				{
				default:  bug( "Act: bad code %d.", *str );
                          i = " <@@@> ";                                break;
				case 't': i = (char *) arg1;                            break;
				case 'T': i = (char *) arg2;                            break;
				case 'n': i = PERS( ch,  to  );                         break;
				case 'N': i = PERS( vch, to  );                         break;
				case 'e': i = he_she  [URANGE(0, ch  ->sex, 2)];        break;
				case 'E': i = he_she  [URANGE(0, vch ->sex, 2)];        break;
				case 'm': i = him_her [URANGE(0, ch  ->sex, 2)];        break;
				case 'M': i = him_her [URANGE(0, vch ->sex, 2)];        break;
				case 's': i = his_her [URANGE(0, ch  ->sex, 2)];        break;
				case 'S': i = his_her [URANGE(0, vch ->sex, 2)];        break;
 
				case 'p':
					i = can_see_obj( to, obj1 )
						? obj1->short_descr: "something";
					break;
 
				case 'P':
					i = can_see_obj( to, obj2 )
						? obj2->short_descr: "something";
					break;
 
				case 'd':
					if ( arg2 == NULL || ((char *) arg2)[0] == '\0' )
					{
						i = "door";
					}
					else
					{
						one_argument( (char *) arg2, fname );
						i = fname;
					}
				break;
			}
		}
		++str;
		while ( ( *point = *i ) != '\0' )
			++point, ++i;
	}
	*point++ = '\n';
	*point++ = '\r';
	*point   = '\0';
	buf[0]   = UPPER(buf[0]);
	pbuff	 = buffer;
	colourconv( pbuff, buf, to );
	if ( to->desc != NULL )
	{
	  write_to_buffer( to->desc, buffer, 0 );
	}
	else if ( MOBtrigger )
		p_act_trigger( buf, to, NULL, NULL, ch, arg1, arg2, TRIG_ACT );
	}
}

bool is_same_team( CHAR_DATA *ach, CHAR_DATA *bch )
{
	if ( ach == NULL || bch == NULL)
	{
		return FALSE;
	}

	if (IS_SET(ach->plr2,PLR2_RED_TEAM) 
		&& IS_SET(bch->plr2,PLR2_RED_TEAM) 
		&& IS_SET(ach->plr2,PLR2_ARENA))
	{
		return TRUE;
	}
	if (IS_SET(ach->plr2,PLR2_BLUE_TEAM)
		&& IS_SET(bch->plr2,PLR2_BLUE_TEAM) 
		&& IS_SET(ach->plr2,PLR2_ARENA))
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}

bool is_arena( CHAR_DATA *ch )
{
	if ( ch == NULL)
	{
		return FALSE;
	}

	if (IS_SET(ch->plr2,PLR2_ARENA))
	{
		return TRUE;
	}

	else
	{
		return FALSE;
	}
}

bool is_honor( CHAR_DATA *ch )
{
	if ( ch == NULL)
		return FALSE;
	
	if (IS_SET(ch->plr2,PLR2_CHALLENGED)
		&& (honor_has_started))
		return TRUE;

	if(IS_SET(ch->plr2,PLR2_CHALLENGER)
		&& (honor_has_started))
		return TRUE;

	else
		return FALSE;
}

bool in_single_war( CHAR_DATA *ch )
{
	if ( ch == NULL)
	{
		return FALSE;
	}

	if (IS_SET(ch->plr2,PLR2_ARENA) && IS_SET(ch->plr2,PLR2_SINGLE_WAR))
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}