/
clans/
councils/
deity/
doc/mudprogs/
exchange/
guilds/
player/a/
src/dmalloc/
src/dmalloc/bin/
src/dmalloc/include/
src/dmalloc/lib/
src/utils/
watch/
web/public_html/
/*
 *  All Pkill Mode code (Helter Skelter day)
 *  Author: Cronel (cronel_kal@hotmail.com)
 *  of FrozenMUD (empire.digiunix.net 4000)
 *
 *  Permission to use and distribute this code is granted provided
 *  this header is retained and unaltered, and the distribution
 *  package contains all the original files unmodified.
 *  If you modify this code and use/distribute modified versions
 *  you must give credit to the original author(s).
 */
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include "mud.h"

#define HSKELTER_BACKUP ("HelterSkelter.tgz")
#define HSKELTER_AFTER ("HelterPlayer.tgz")

bool exists_file( char *filen );
void save_sysdata( SYSTEM_DATA sys );
void free_hpk_list( void );

#ifdef HISCORE_CODE
typedef struct hskelter_pkill HSKELTER_PKILL;
struct hskelter_pkill
{
	char *name;
	int pkills;

	HSKELTER_PKILL *next;
	HSKELTER_PKILL *prev;
};

HSKELTER_PKILL *first_hpk, *last_hpk;
#endif

void do_hskelter( CHAR_DATA *ch, char *argument )
{
	char cmd[ MAX_INPUT_LENGTH ];
	char buf[ MAX_STRING_LENGTH ];
	bool override;
	CHAR_DATA *victim;

	argument = one_argument( argument, cmd );
	override = !str_cmp( argument, "!" );

	set_char_color( AT_IMMORT, ch );

	if( cmd[0] == '\0' )
	{
		send_to_char( "Syntax: hskelter [start, end]\n\r", ch );
		return;
	}
	else if( !str_cmp( cmd, "start" ) )
	{
		if( sysdata.all_pkill_mode )
		{
			send_to_char( "Helter Skelter mode is already on.\n\r", ch );
			return;
		}

		if( exists_file( HSKELTER_BACKUP ) )
		{
			send_to_char( "An old Helter Skelter backup file exists.\n\r", ch );
			if( !override )
			{
				send_to_char( "Remove it, or use '!'.\n\r", ch );
				return;
			}
			else
			{
				send_to_char( "Removing...\n\r", ch );
				unlink( HSKELTER_BACKUP );
			}
		}
		send_to_char( "Creating new player base backup...\n\r", ch );
		sprintf( buf, "tar -zcf %s %s*", HSKELTER_BACKUP, PLAYER_DIR );
		system( buf );
		/* check for the file */
		if( !exists_file( HSKELTER_BACKUP ) )
		{
			send_to_char( "Cannot create player base backup!\n\r", ch );
			return;
		}

		sysdata.all_pkill_mode = TRUE;
		save_sysdata( sysdata );

		echo_to_all( AT_YELLOW | AT_BLINK, "Helter Skelter day has officialy STARTED!", ECHOTAR_PC );

#ifdef HISCORE_CODE
		first_hpk = last_hpk = NULL;
#endif
		set_char_color( AT_IMMORT, ch );
		send_to_char( "Ready.\n\r", ch );
	}
	else if ( !str_cmp( cmd, "end" ) )
	{
		if( !sysdata.all_pkill_mode )
		{
			send_to_char( "Helter Skelter mode is not on right now.\n\r", ch );
			return;
		}

		if( !exists_file(HSKELTER_BACKUP) )
		{
			send_to_char( "There's no player base backup!\n\r", ch );
			return;
		}

		echo_to_all( AT_YELLOW | AT_BLINK, "Helter Skelter day is officialy CLOSED.", ECHOTAR_PC );
		echo_to_all( AT_YELLOW | AT_BLINK, "You will all be forced to quit to restore the player base.", ECHOTAR_PC );
		echo_to_all( AT_YELLOW | AT_BLINK, "You should then wait a minute and reconnect.", ECHOTAR_PC );

		set_char_color( AT_IMMORT, ch );
		send_to_char( "Backing up post-helter skelter player base\n\r", ch );
		sprintf( buf, "tar -zcf %s %s*", HSKELTER_AFTER, PLAYER_DIR );
		system( buf );

		send_to_char( "Forcing everyone to quit.\n\r", ch );
		for( victim = first_char; victim ; victim = victim->next )
		{
			if( IS_NPC(victim) )
				continue;
			/* remove recent fight timer */
			if( get_timer( victim, TIMER_RECENTFIGHT ) )
				remove_timer( victim, TIMER_RECENTFIGHT);

			/* make everyone STANDING (for all peace, etc) */
			stop_fighting( victim, TRUE );
			victim->position = POS_SLEEPING;
		}
		do_force( ch, "all quit" );

		send_to_char( "Restoring pre-helter skelter player base backup.\n\r", ch );
		sprintf( buf, "tar -zvxf %s", HSKELTER_BACKUP );
		system( buf );

		sysdata.all_pkill_mode = FALSE;
		save_sysdata( sysdata );

		free_hpk_list( );

		send_to_char( "Ready.\n\r", ch );
	}
	else
	{
		send_to_char( "You can either manualy START or END helter skelter mode.\n\r", ch );
		return;
	}
}

bool exists_file( char *filen )
{
	struct stat fst;

	if( stat(filen, &fst) == -1 )
		return FALSE;
	else
		return TRUE;
}

void register_hskelter_pkill( CHAR_DATA *ch )
{
#ifdef HISCORE_CODE
	HSKELTER_PKILL *hpk;

	if( !sysdata.all_pkill_mode )
		return;

	for( hpk = first_hpk ; hpk ; hpk = hpk->next )
	{
		if( !str_cmp( hpk->name, ch->name ) )
			break;
	}

	if( hpk != NULL )
		hpk->pkills++;
	else
	{
		CREATE( hpk, HSKELTER_PKILL, 1 );
		hpk->name = STRALLOC( ch->name );
		hpk->pkills = 1;
		LINK( hpk, first_hpk, last_hpk, next, prev );
	}

	adjust_hiscore( "hskelter_pkill", ch, hpk->pkills );
#endif
}

void free_hpk_list( void )
{
#ifdef HISCORE_CODE
	HSKELTER_PKILL *hpk, *n_hpk;

	for( hpk = first_hpk ; hpk ; hpk = n_hpk )
	{
		n_hpk = hpk->next;
		UNLINK( hpk, first_hpk, last_hpk, next, prev );
		STRFREE( hpk->name );
		DISPOSE( hpk );
	}

	first_hpk = last_hpk = NULL;
#endif
}