area/
build/testing/
log/
player/
player/backup/
/***************************************************************************
 *  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-1996 Russ Taylor			   *
*       ROM has been brought to you by the ROM consortium		   *
*           Russ Taylor (rtaylor@efn.org)				   *
*           Gabrielle Taylor						   *
*           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			   *
***************************************************************************/
#include <glib.h>

#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <merc.h>
#include <interp.h>

/* Local functions... */
void do_notag(CHAR_DATA *ch, char *argument);
void game_in_play(CHAR_DATA *ch, char *name);

void do_tag( CHAR_DATA *ch, char *argument )
{
	
	CHAR_DATA *victim;
	char      name[MAX_STRING_LENGTH];
	char      buf[MAX_STRING_LENGTH];
	
	name[0]='\0';
	game_in_play(ch, name);
	
	if (IS_NPC(ch))
		return;
	
	if ( argument[0] == '\0' )
	{
		send_to_char("Who do you want to tag?\n\r", ch);
		return;
	}
	
	if ( strcmp(argument,"show")==0 )
	{
		if ( name[0] == '\0' )
		{
			send_to_char("There is no game of tag in progress.\n\r", ch);
			return;
		}
		else
		{
			sprintf(buf, "%s is currently IT!\n\r", name);
			send_to_char(buf, ch);
			return;
		}
	}
	
	victim = get_char_world(ch,argument);
	
	if ( victim == NULL )
	{
		send_to_char( "They aren't playing!\n\r", ch);
		return;
	}
	
	if ( victim->level < 2 )
	{
		send_to_char("You can't tag submortals.\n\r",ch);
		return;
	}
	
	if ( IS_NPC(victim) )
	{
		send_to_char("Sorry! NPC's can't play tag!\n\r", ch);
		return;
	}
	
	if (IS_SET(victim->act, PLR_NOTAG) )
	{
		send_to_char("They don't want to play tag... Spoil sports!\n\r", ch);
		return;
	}
	
	if ( (name[0] == '\0' ) ) /* No Game in progress... */
	{
		if ( ch->name == victim->name && IS_IMMORTAL(ch)) /* Player tags self... */
		{
			SET_BIT(victim->act, PLR_TAG);
			
			send_to_char("You tag yourself, Now go get someone!\n\r", ch);
			do_info(ch,"The game of tag has started!\n\r");
			return;
		}
		else /* Player tags someone else... */
		{
			if (IS_IMMORTAL(ch))
			{
				if ((ch->in_room->vnum == victim->in_room->vnum) && can_see(ch, victim)) /* Players can see eachother... */
				{
					SET_BIT(victim->act, PLR_TAG );
					
					sprintf(buf, "%s Pounces on you shouting 'TAG! You're IT!'\n\r", ch->name->str);
					send_to_char(buf, victim);
					
					sprintf(buf, "You pounce on %s and shout 'TAG! You're IT!'\n\r", victim->name->str);
					send_to_char(buf, ch);
					
					sprintf(buf, "%s has started a game of TAG, and %s is IT!\n\r", ch->name->str, victim->name->str);
					do_info(ch,buf); /* Voltecs info channel */
					
					return;
				}
				else /* Players can't see eachother! */
				{
					send_to_char("You can't see anyone by that name...\n\r", ch);
					return;
				}
				
			}
			else
			{
				send_to_char("There is no game of tag in progress, why not start one!\n\r", ch);
				return;
			}	
		}
	}
	else /* There is a game in play... */
	{
		if (!IS_SET(ch->act, PLR_TAG) ) /* The player calling tag isn't IT */
		{
			sprintf(buf, "There is already a game in play, and %s is IT!\n\r", name);
			send_to_char(buf, ch);
			return;
		}
		else /* The player calling tag is IT */
		{
			if (ch->name == victim->name ) /* Player tags self... */
			{
				send_to_char("Tagging yourself won't get you anywhere!\n\r", ch);
				return;
			}
			else /* Player Tags someone else... */
			{
				if ((ch->in_room->vnum == victim->in_room->vnum) && can_see(ch, victim)) /* Players can see eachother... */
				{
					if (IS_IMMORTAL(victim))
					{
						REMOVE_BIT(ch->act, PLR_TAG );
						
						sprintf(buf, "%s Pounces on you shouting 'TAG! You're IT!'\n\r", ch->name->str);
						send_to_char(buf, victim);
						sprintf(buf, "You pounce on %s and shout 'TAG! You're IT!'\n\r", victim->name->str);
						send_to_char(buf, ch);
						sprintf(buf, "TAG Game update: %s has just Ended it\n\r", ch->name->str);
						do_info(ch,buf); /* Voltecs info channel */
						return;
					}
					else
					{
						SET_BIT(victim->act, PLR_TAG );
						REMOVE_BIT(ch->act, PLR_TAG );
						
						sprintf(buf, "%s Pounces on you shouting 'TAG! You're IT!'\n\r", ch->name->str);
						send_to_char(buf, victim);
						sprintf(buf, "You pounce on %s and shout 'TAG! You're IT!'\n\r", victim->name->str);
						send_to_char(buf, ch);
						sprintf(buf, "TAG Game update:- %s has just tagged %s, so %s is IT!\n\r", ch->name->str, victim->name->str, victim->name->str);
						do_info(ch,buf); /* Voltecs info channel */
						return;
					}
				} 
				else    /* Players can't see eachother... */
				{
					send_to_char("You can't see anyone by that name...\n\r", ch);
					return;
				}
			} /* End of Player Tags someone else... */ 
		} /* End of Player calling tag is IT */
	} /* End of there is a game in play */
} /* End of do_tag */

/********************************************************************/

void do_notag(CHAR_DATA *ch, char *argument) /*Removes a players TAG flag if set... */
{
	if (IS_SET (ch->act, PLR_NOTAG ) )
	{
		send_to_char("You now allow people to tag you. (YAY!)\n\r", ch);
		REMOVE_BIT( ch->act, PLR_NOTAG );
		return;
	}
	else
	{
		send_to_char("You no longer let people tag you... (Spoil Sport!)\n\r", ch);
		SET_BIT( ch->act, PLR_NOTAG );
		return;
	}
}

/********************************************************************/

void game_in_play(CHAR_DATA *ch, char *name)
{
	CHAR_DATA       *on_it;
	DESCRIPTOR_DATA *d;
	GSList *desc_list = descriptor_list;
	
	while ( desc_list != NULL )
	{
		d = (DESCRIPTOR_DATA*)desc_list->data;
		if ( d->connected == CON_PLAYING && IS_SET(d->character->act, PLR_TAG) )
		{
			on_it = d->character;
			str_cpy(name, d->character->name->str);
		}
		desc_list = g_slist_next(desc_list);
	}
	g_slist_free(desc_list);
	return;
}

bool is_ignoring(CHAR_DATA *ch, CHAR_DATA *victim)
{
	int pos;
	CHAR_DATA *rch;
	
	if (IS_NPC(ch) || IS_NPC(victim))
		return FALSE;
	
	if (ch->desc == NULL)
		rch = ch;
	else
		rch = ch->desc->original ? ch->desc->original : ch;
	
	for (pos = 0; pos < MAX_IGNORE; pos++)
	{
		if (rch->pcdata->ignore[pos] == NULL)
			break;
		
		if (!str_cmp(rch->pcdata->ignore[pos]->str, victim->name->str))
			return TRUE;
	}
	
	return FALSE;
}

void do_ignore(CHAR_DATA *ch, char *argument)
{
	CHAR_DATA *victim, *rch;
	char arg[MAX_INPUT_LENGTH], buf[MAX_STRING_LENGTH];
	int pos;
	
	argument = one_argument(argument, arg);
	
	if (ch->desc == NULL)
		rch = ch;
	else
		rch = ch->desc->original ? ch->desc->original : ch;
	
	if (IS_NPC(rch))
		return;
	
	if (arg[0] == '\0')
	{
		send_to_char("Who do you want to ignore?\n\r", ch);
		return;
	}
	
	if ((victim = get_char_world(rch, argument)) == NULL)
	{
		send_to_char("They aren't here.\n\r", ch);
		return;
	}
	
	if (IS_NPC(victim))
	{
		send_to_char("Ignore a mob?  I don't think so.\n\r", ch);
		return;
	}
	
	if (ch == victim)
	{
		send_to_char("I don't think you really want to ignore yourself.\n\r", ch);
		return;
	}
	
	if (IS_IMMORTAL(victim))
	{
		send_to_char("Don't even think you can ignore immortals!\n\r", ch);
		return;
	}
	
	for (pos = 0; pos < MAX_IGNORE; pos++)
	{
		if (rch->pcdata->ignore[pos] == NULL)
			break;
		
		
		if (!str_cmp(arg, rch->pcdata->ignore[pos]->str))
		{
			rch->pcdata->ignore[pos] = g_string_assign(rch->pcdata->ignore[pos],"");
			sprintf(buf, "You stop ignoring %s.\n\r", victim->name->str);
			send_to_char(buf, ch);
			sprintf(buf, "%s stops ignoring you.\n\r", ch->name->str);
			send_to_char(buf, victim);
			return;
		}
	}
	
	if (pos >= MAX_IGNORE)
	{
		send_to_char("You can't ignore anymore people.\n\r", ch);
		return;
	}
	
	rch->pcdata->ignore[pos] = g_string_assign(rch->pcdata->ignore[pos],arg);
	sprintf(buf, "You now ignore %s.\n\r", victim->name->str);
	send_to_char(buf, ch);
	sprintf(buf, "%s ignores you.\n\r", ch->name->str);
	send_to_char(buf, victim);
	return;
	
}