area/
/*
THE FOLLOWING ADDITIONAL MODIFICATIONS ARE REQUIRED TO USE THIS FILE:
1. in Makefile, add "freeze.o" to the list of files (name this
file "freeze.c").

2. in merc.h add the following at the bottom of struct char_data:
    long		tag_flags;

and then add the following lines:
#define TAG_PLAYING		(A)
#define TAG_FROZEN		(B)
#define TAG_RED			(C)
#define TAG_BLUE			(D)

3. in interp.h, add in the list of functions:
DECLARE_DO_FUN( do_ftag );
DECLARE_DO_FUN( do_tag );
DECLARE_DO_FUN( do_red );
DECLARE_DO_FUN( do_blue );

4. in interp.c, add in the list of miscellaneous commands:
{ "ftag",	do_ftag,	POS_SLEEPING,	 IM, LOG_NORMAL, 1 },
{ "tag",	do_tag,	POS_RESTING,	 0,  LOG_NORMAL, 1 },
{ "red",	do_red,	POS_RESTING,	 0,  LOG_NORMAL, 1 },
{ "blue",	do_blue,	POS_RESTING,	 0,  LOG_NORMAL, 1 },

5. in act_info.c modify the do_who and show_char_to_char_0
functions as required to display "RED" or "BLUE" tags on players.
For example, add an extra %s and the following in do_who:
	    IS_SET(wch->tag_flags,TAG_RED) ? "{R[RED] {x" : 
	    (IS_SET(wch->tag_flags,TAG_BLUE) ? "{B[BLUE] {x" : ""),
and extra if statements in show_char_to_char_0:
    if ( IS_SET(ch->tag_flags,TAG_RED) ) strcat( buf,"{R[RED] {x"  );
    if ( IS_SET(ch->tag_flags,TAG_BLUE)) strcat( buf,"{B[BLUE] {x" );

6. add the following in act_move.c in move_char(), between other
checks for reasons not to move the character
    if ( IS_SET(ch->tag_flags, TAG_FROZEN)
    &&   IS_SET(ch->tag_flags, TAG_PLAYING))
    {
	send_to_char( "You've been frozen, you can't move!\n\r", ch );
	return;
    }

7. other small changes may be needed for your MUD.  For example,
Clandestine has "shadowform" characters which cannot be seen by normal
mortals.  The can_see() function was edited to ensure that freeze tag
players can see each other.  Also, you should edit do_switch or any
other function which puts a player in a mob's body to remove that
player's TAG_PLAYING bit to avoid problems.

8. create an area to use for your tag game.  A 7 x 7 square grid works
well for teams of about 5 each.  Use consecutive room vnums and enter
them in the #define statements below.
*/

#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
#include "warlock.h"

/* 
9. set these VNUMs to the min/max room number to randomly locate players
in the freeze tag zone 
*/
#define FTAG_MIN_VNUM		30500
#define FTAG_MAX_VNUM		30524

DECLARE_DO_FUN( do_transfer );

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

#ifdef DEBUG
        Debug ("do_red");
#endif

    if ( argument[0] == '\0' )
    {
	send_to_char( "Syntax:  red <message>\n\r", ch );
	return;
    }

    if (!IS_IMMORTAL(ch) && !IS_SET(ch->tag_flags,TAG_PLAYING))
    {
	send_to_char( "You must be a freeze tag player to use this channel.\n\r", ch );
	return;
    }

    if (IS_SET(ch->tag_flags,TAG_RED) || IS_IMMORTAL(ch) )
    {
	sprintf(buf,"#1{RED}#4 %s#n: %s\n\r",ch->name,argument);
	send_to_char(buf, ch);
    }
    else	
    {
	stc( "You aren't on the red team.\n\r",ch);
	return;
    }

    for ( d = descriptor_list; d != NULL; d = d->next )
    {
	if ( (d->connected == CON_PLAYING)
      && (IS_SET(d->character->tag_flags,TAG_RED) || IS_IMMORTAL(d->character)) ) 
	{
	  send_to_char(buf, d->character);
	}
    }
}

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

#ifdef DEBUG
        Debug ("do_blue");
#endif

    if ( argument[0] == '\0' )
    {
	send_to_char( "Syntax:  blue <message>\n\r", ch );
	return;
    }

    if (!IS_IMMORTAL(ch) && !IS_SET(ch->tag_flags,TAG_PLAYING))
    {
	send_to_char( "You must be a freeze tag player to use this channel.\n\r", ch );
	return;
    }

    if (IS_SET(ch->tag_flags,TAG_BLUE) || IS_IMMORTAL(ch) )
    {
	sprintf(buf,"#4{BLUE}#1 %s#n: %s\n\r",ch->name,argument);
	send_to_char(buf, ch);
    }
    else	
    {
	stc( "You aren't on the blue team.\n\r",ch);
	return;
    }

    for ( d = descriptor_list; d != NULL; d = d->next )
    {
	if ( (d->connected == CON_PLAYING)
      && (IS_SET(d->character->tag_flags,TAG_BLUE) || IS_IMMORTAL(d->character)) ) 
	{
	  send_to_char(buf, d->character);
	}
    }
}

void check_team_frozen ( CHAR_DATA *ch )
{
    DESCRIPTOR_DATA *d;

#ifdef DEBUG
        Debug ("check_team_frozen");
#endif

    if (IS_SET(ch->tag_flags,TAG_BLUE))
    {
	for ( d = descriptor_list; d != NULL; d = d->next )
	{
	  if ( (d->connected == CON_PLAYING)
        &&   IS_SET(d->character->tag_flags,TAG_PLAYING)
        &&   IS_SET(d->character->tag_flags,TAG_BLUE)
	  &&   !IS_NPC(d->character)
        &&   !IS_SET(d->character->tag_flags,TAG_FROZEN)) 
	  {
	    return;
	  }
	}
	do_info(ch,"The #1RED#n team has won FREEZE TAG!!!");
    return;
    }

    if (IS_SET(ch->tag_flags,TAG_RED))
    {
	for ( d = descriptor_list; d != NULL; d = d->next )
	{
	  if ( (d->connected == CON_PLAYING)
        &&   IS_SET(d->character->tag_flags,TAG_PLAYING)
        &&   IS_SET(d->character->tag_flags,TAG_RED)
	  &&   !IS_NPC(d->character)
        &&   !IS_SET(d->character->tag_flags,TAG_FROZEN)) 
	  {
	    return;
	  }
	}
	do_info(ch,"The #4BLUE#n team has won FREEZE TAG!!!");
    return;
    }
}

void do_ftag( CHAR_DATA *ch, char *argument )
{
    DESCRIPTOR_DATA *d;
    char arg1 [MAX_INPUT_LENGTH];
    char arg2 [MAX_INPUT_LENGTH];
    char buf [MAX_STRING_LENGTH];
    CHAR_DATA *victim;
    bool fRed = FALSE;

#ifdef DEBUG
        Debug ("do_ftag");
#endif

    argument = one_argument( argument, arg1 );

    if ( arg1[0] == '\0' )
    {
	send_to_char( "Syntax:  ftag reset\n\r", ch );
	send_to_char( "         ftag start\n\r", ch );
	send_to_char( "         ftag auto (splits everyone in room onto teams)\n\r", ch );
	send_to_char( "         ftag red <player>\n\r", ch );
	send_to_char( "         ftag blue <player>\n\r", ch );
	return;
    }

    if ( !str_cmp( arg1, "reset" ) )
    {
	for ( d = descriptor_list; d != NULL; d = d->next )
	{
	  if (d->connected != CON_PLAYING)
	    continue;

	  if ( IS_SET(d->character->tag_flags,TAG_PLAYING))
	  {
	    REMOVE_BIT(d->character->tag_flags,TAG_PLAYING);
	    if (!IS_NPC(d->character))
	    {
		sprintf(buf,"%s %d",d->character->name,ROOM_VNUM_TEMPLE);
		do_transfer(ch,buf);
	    }
	  }
	  if ( IS_SET(d->character->tag_flags,TAG_FROZEN))
	    REMOVE_BIT(d->character->tag_flags,TAG_FROZEN);
	  if ( IS_SET(d->character->tag_flags,TAG_RED))
	    REMOVE_BIT(d->character->tag_flags,TAG_RED);
	  if ( IS_SET(d->character->tag_flags,TAG_BLUE))
	    REMOVE_BIT(d->character->tag_flags,TAG_BLUE);
        send_to_char( "Freeze tag has been stopped!\n\r", d->character );
	}
	send_to_char( "All players reset.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg1, "start" ) )
    {
	for ( d = descriptor_list; d != NULL; d = d->next )
	{
	  if (d->connected != CON_PLAYING)
	    continue;

	  if ( IS_SET(d->character->tag_flags,TAG_PLAYING)
		 && !IS_NPC(d->character))
	  {
	    sprintf(buf,"%s %d",d->character->name,
		number_range(FTAG_MIN_VNUM,FTAG_MAX_VNUM));
	    REMOVE_BIT(d->character->tag_flags,TAG_FROZEN);
	    do_transfer(ch,buf);
	    send_to_char( "Freeze Tag has started!\n\r", d->character );
	  }
	}
	send_to_char( "You have started a game of Freeze Tag.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg1, "auto" ) )
    {
	for ( victim = ch->in_room->people; victim != NULL; 
			victim = victim->next_in_room )
	{
	  if ( victim == ch || IS_NPC(victim))
	    continue;

	  if ((fRed = !fRed))
	  {
	    sprintf(buf,"red %s",victim->name);
	  }
	  else
	  {
	    sprintf(buf,"blue %s",victim->name);
	  }

	  do_ftag(ch,buf);
	}
	return;
    }

    argument = one_argument( argument, arg2 );
    if ( arg2[0] == '\0' ||
	   (str_cmp( arg1, "red" ) &&
	    str_cmp( arg1, "blue" )))
    {
	send_to_char( "Syntax:  ftag reset\n\r", ch );
	send_to_char( "         ftag start\n\r", ch );
	send_to_char( "         ftag auto (splits everyone in room onto teams)\n\r", ch );
	send_to_char( "         ftag red <player>\n\r", ch );
	send_to_char( "         ftag blue <player>\n\r", ch );
	return;
    }

    if ( ( victim = get_char_room( ch, arg2 ) ) == NULL )
    {
	send_to_char( "They aren't here.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg1, "red" ) )
    {
	SET_BIT(victim->tag_flags,TAG_PLAYING);
	REMOVE_BIT(victim->tag_flags,TAG_FROZEN);
	SET_BIT(victim->tag_flags,TAG_RED);
	REMOVE_BIT(victim->tag_flags,TAG_BLUE);
	act( "You are on the #1RED#n team!", ch, NULL, victim, TO_VICT );
	act( "$N is on the #1RED#n team!",   ch, NULL, victim, TO_NOTVICT );
	act( "$N is on the #1RED#n team!",   ch, NULL, victim, TO_CHAR    );
    }
    else
    if ( !str_cmp( arg1, "blue" ) )
    {
	SET_BIT(victim->tag_flags,TAG_PLAYING);
	REMOVE_BIT(victim->tag_flags,TAG_FROZEN);
	SET_BIT(victim->tag_flags,TAG_BLUE);
	REMOVE_BIT(victim->tag_flags,TAG_RED);
	act( "You are on the #4BLUE#n team!", ch, NULL, victim, TO_VICT );
	act( "$N is on the #4BLUE#n team!",   ch, NULL, victim, TO_NOTVICT );
	act( "$N is on the #4BLUE#n team!",   ch, NULL, victim, TO_CHAR    );
    }

    return;
}

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

#ifdef DEBUG
        Debug ("do_tag");
#endif

    argument = one_argument( argument, arg );

    if (!IS_SET(ch->tag_flags,TAG_PLAYING))
    {
	send_to_char( "You're not playing freeze tag.\n\r", ch );
	return;
    }

    if ( arg[0] == '\0' )
    {
	send_to_char( "Tag whom?\n\r", ch );
	return;
    }

    if ( ( victim = get_char_room( ch, arg ) ) == NULL )
    {
	send_to_char( "They aren't here.\n\r", ch );
	return;
    }

    if ( victim == ch )
    {
	send_to_char( "You tag yourself.  How amusing.\n\r", ch );
	return;
    }

    if (!IS_SET(victim->tag_flags,TAG_PLAYING))
    {
	send_to_char( "They're not playing freeze tag.\n\r", ch );
	return;
    }

    if (IS_SET(ch->tag_flags,TAG_FROZEN))
    {
	send_to_char( "You can't tag, you're frozen!\n\r", ch );
	return;
    }

    act( "$n tags you.", ch, NULL, victim, TO_VICT );
    act( "$n tags $N.",  ch, NULL, victim, TO_NOTVICT );
    act( "You tag $N.",  ch, NULL, victim, TO_CHAR    );

    if ((IS_SET(ch->tag_flags,TAG_RED) &&
         IS_SET(victim->tag_flags,TAG_RED))
	||(IS_SET(ch->tag_flags,TAG_BLUE) &&
         IS_SET(victim->tag_flags,TAG_BLUE)))
    {
	if (IS_SET(victim->tag_flags,TAG_FROZEN))
	{
	  REMOVE_BIT(victim->tag_flags,TAG_FROZEN);
	  act( "You are no longer frozen!", ch, NULL, victim, TO_VICT );
	  act( "$N is no longer frozen!",   ch, NULL, victim, TO_NOTVICT );
	  act( "$N is no longer frozen!",   ch, NULL, victim, TO_CHAR    );
	}
	else
	{
	  act( "$N is not frozen!",   ch, NULL, victim, TO_CHAR    );
	}
    }
    else
    {
	if (IS_SET(victim->tag_flags,TAG_FROZEN))
	{
	  act( "$N is already frozen!",   ch, NULL, victim, TO_CHAR    );
	}
	else
	{
	  SET_BIT(victim->tag_flags,TAG_FROZEN);
	  act( "You are frozen!", ch, NULL, victim, TO_VICT );
	  act( "$N is frozen!",   ch, NULL, victim, TO_NOTVICT );
	  act( "$N is frozen!",   ch, NULL, victim, TO_CHAR    );
	  check_team_frozen( victim );
	}
    }

    return;
}