//checked includes match cerberus output
#include maps/mp/zombies/_zm_audio;
#include maps/mp/zombies/_zm_stats;
#include maps/mp/zombies/_zm_weap_tomahawk;
#include maps/mp/zombies/_zm_zonemgr;
#include maps/mp/zombies/_zm_spawner;
#include maps/mp/zombies/_zm_net;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/_utility;
#include common_scripts/utility;

//#using_animtree( "fxanim_props" );

init() //checked matches cerberus output
{
	if ( isDefined( level.gamedifficulty ) && level.gamedifficulty == 0 )
	{
		spoon_easy_cleanup();
		return;
	}
	precachemodel( "t6_wpn_zmb_spoon_world" );
	precachemodel( "c_zom_inmate_g_rarmspawn" );
	level thread wait_for_initial_conditions();
	array_thread( level.zombie_spawners, ::add_spawn_function, ::zombie_spoon_func );
	level thread bucket_init();
	spork_portal = getent( "afterlife_show_spork", "targetname" );
	spork_portal setinvisibletoall();
	level.b_spoon_in_tub = 0;
	level.n_spoon_kill_count = 0;
	flag_init( "spoon_obtained" );
	flag_init( "charged_spoon" );
/#
	level thread debug_prison_spoon_quest();
#/
}

spoon_easy_cleanup() //checked matches cerberus output
{
	spork_portal = getent( "afterlife_show_spork", "targetname" );
	spork_portal delete();
	m_spoon_pickup = getent( "pickup_spoon", "targetname" );
	m_spoon_pickup delete();
	m_spoon = getent( "zap_spoon", "targetname" );
	m_spoon delete();
}

extra_death_func_to_check_for_splat_death() //checked matches cerberus output
{
	self thread maps/mp/zombies/_zm_spawner::zombie_death_animscript();
	if ( self.damagemod == "MOD_GRENADE" || self.damagemod == "MOD_GRENADE_SPLASH" )
	{
		if ( self.damageweapon == "blundersplat_explosive_dart_zm" )
		{
			if ( isplayer( self.attacker ) )
			{
				self notify( "killed_by_a_blundersplat" );
			}
		}
		else
		{
			if ( self.damageweapon == "bouncing_tomahawk_zm" )
			{
				if ( isplayer( self.attacker ) )
				{
					self.attacker notify( "got_a_tomahawk_kill" );
				}
			}
		}
	}
	if ( isDefined( self.attacker.killed_with_only_tomahawk ) )
	{
		if ( self.damageweapon != "bouncing_tomahawk_zm" && self.damageweapon != "none" )
		{
			self.attacker.killed_with_only_tomahawk = 0;
		}
	}
	if ( isDefined( self.attacker.killed_something_thq ) )
	{
		self.attacker.killed_something_thq = 1;
	}
	return 0;
}

zombie_spoon_func() //checked matches cerberus output
{
	self.deathfunction = ::extra_death_func_to_check_for_splat_death;
	self waittill( "killed_by_a_blundersplat", player );
	if ( flag( "charged_spoon" ) || !level.b_spoon_in_tub )
	{
		return;
	}
	if ( self maps/mp/zombies/_zm_zonemgr::entity_in_zone( "cellblock_shower" ) )
	{
		level.n_spoon_kill_count++;
	}
	else
	{
		return;
	}
	if ( level.n_spoon_kill_count >= 50 )
	{
/#
		iprintlnbold( "Spoon Charged" );
#/
		flag_set( "charged_spoon" );
	}
}

wait_for_initial_conditions() //checked changed to match cerberus output
{
	m_spoon_pickup = getent( "pickup_spoon", "targetname" );
	m_spoon_pickup ghost();
	m_spoon_pickup ghostindemo();
	while ( !isDefined( level.characters_in_nml ) || level.characters_in_nml.size == 0 )
	{
		wait 1;
	}
	flag_wait( "soul_catchers_charged" );
	m_poster = getent( "poster", "targetname" );
	m_poster.health = 5000;
	m_poster setcandamage( 1 );
	b_poster_knocked_down = 0;
	while ( !b_poster_knocked_down )
	{
		m_poster waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname );
		if ( weaponname != "frag_grenade_zm" || weaponname == "bouncing_tomahawk_zm" || weaponname == "upgraded_tomahawk_zm" )
		{
			b_poster_knocked_down = 1;
			playsoundatposition( "zmb_squest_spoon_poster", m_poster.origin );
			m_poster delete();
			if ( isDefined( attacker ) && isplayer( attacker ) )
			{
				attacker do_player_general_vox( "quest", "secret_poster", undefined, 100 );
			}
			wait 1;
			attacker thread do_player_general_vox( "quest", "pick_up_easter_egg" );
		}
	}
	spork_door = getent( "spork_door", "targetname" );
	spork_door.targetname = "afterlife_door";
	spork_portal = getent( "afterlife_show_spork", "targetname" );
	spork_portal.targetname = "afterlife_show";
	m_spoon = getent( "zap_spoon", "targetname" );
	m_spoon ghostindemo();
	m_spoon.health = 50000;
	m_spoon setcandamage( 1 );
	b_spoon_shocked = 0;
	while ( !b_spoon_shocked )
	{
		m_spoon waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname );
		m_spoon.health += damage;
		if ( weaponname == "lightning_hands_zm" )
		{
			b_spoon_shocked = 1;
			m_spoon delete();
			attacker playsound( "zmb_easteregg_laugh" );
		}
	}
	m_spoon_pickup show();
	m_spoon_pickup.health = 10000;
	m_spoon_pickup setcandamage( 1 );
	level.a_tomahawk_pickup_funcs[ level.a_tomahawk_pickup_funcs.size ] = ::tomahawk_the_spoon;
}

tomahawk_the_spoon( grenade, n_grenade_charge_power ) //checked matches cerberus output
{
	if ( self hasweapon( "spoon_zm_alcatraz" ) || self hasweapon( "spork_zm_alcatraz" ) )
	{
		return 0;
	}
	m_spoon = getent( "pickup_spoon", "targetname" );
	if ( distancesquared( m_spoon.origin, grenade.origin ) < 40000 )
	{
		m_tomahawk = maps/mp/zombies/_zm_weap_tomahawk::tomahawk_spawn( grenade.origin );
		m_tomahawk.n_grenade_charge_power = n_grenade_charge_power;
		m_player_spoon = spawn( "script_model", grenade.origin );
		m_player_spoon setmodel( "t6_wpn_zmb_spoon_world" );
		m_player_spoon linkto( m_tomahawk );
		self maps/mp/zombies/_zm_stats::increment_client_stat( "prison_ee_spoon_acquired", 0 );
		self thread maps/mp/zombies/_zm_weap_tomahawk::tomahawk_return_player( m_tomahawk );
		self thread give_player_spoon_upon_receipt( m_tomahawk, m_player_spoon );
		self thread dip_the_spoon();
		flag_set( "spoon_obtained" );
		self playsoundtoplayer( "vox_brutus_easter_egg_101_0", self );
		return 1;
	}
	return 0;
}

give_player_spoon_upon_receipt( m_tomahawk, m_player_spoon ) //checked changed to match cerberus output
{
	while ( isDefined( m_tomahawk ) )
	{
		wait 0.05;
	}
	m_player_spoon delete();
	if ( !self hasweapon( "spoon_zm_alcatraz" ) && !self hasweapon( "spork_zm_alcatraz" ) && !is_true( self.spoon_in_tub ) )
	{
		self giveweapon( "spoon_zm_alcatraz" );
		self set_player_melee_weapon( "spoon_zm_alcatraz" );
		level thread maps/mp/zombies/_zm_audio::sndmusicstingerevent( "spoon", self );
		weapons = self getweaponslist();
		for ( i = 0; i < weapons.size; i++ )
		{
			if ( issubstr( weapons[ i ], "knife" ) )
			{
				self takeweapon( weapons[ i ] );
			}
		}
	}
	weapons = self getweaponslist();
	wait 1;
	self thread do_player_general_vox( "quest", "pick_up_easter_egg" );
}

bucket_init() //checked matches cerberus output
{
	s_bathtub = getstruct( "tub_trigger_struct", "targetname" );
	level.t_bathtub = spawn( "trigger_radius_use", s_bathtub.origin, 0, 40, 150 );
	level.t_bathtub usetriggerrequirelookat();
	level.t_bathtub triggerignoreteam();
	level.t_bathtub sethintstring( "" );
	level.t_bathtub setcursorhint( "HINT_NOICON" );
}

wait_for_bucket_activated( player ) //checked matches cerberus output
{
	if ( isDefined( player ) )
	{
		while ( 1 )
		{
			level.t_bathtub waittill( "trigger", who );
			if ( who == player )
			{
				return;
			}
		}
	}
	else 
	{
		level.t_bathtub waittill( "trigger", who );
	}
}

dip_the_spoon()  //checked matches cerberus output
{
	self endon( "disconnect" );
	wait_for_bucket_activated( self );
	self takeweapon( "spoon_zm_alcatraz" );
	self giveweapon( "knife_zm_alcatraz" );
	self set_player_melee_weapon( "knife_zm_alcatraz" );
	self.spoon_in_tub = 1;
	self setclientfieldtoplayer( "spoon_visual_state", 1 );
	wait 5;
	level.b_spoon_in_tub = 1;
	flag_wait( "charged_spoon" );
	wait 1;
	level.t_bathtub playsound( "zmb_easteregg_laugh" );
	self thread thrust_the_spork();
}

thrust_the_spork() //checked matches cerberus output
{
	self endon( "disconnect" );
	wait_for_bucket_activated( self );
	self setclientfieldtoplayer( "spoon_visual_state", 2 );
	wait 5;
	wait_for_bucket_activated( self );
	self takeweapon( "knife_zm_alcatraz" );
	self giveweapon( "spork_zm_alcatraz" );
	self set_player_melee_weapon( "spork_zm_alcatraz" );
	level thread maps/mp/zombies/_zm_audio::sndmusicstingerevent( "spork", self );
	self.spoon_in_tub = undefined;
	self setclientfieldtoplayer( "spoon_visual_state", 3 );
	wait 1;
	self thread do_player_general_vox( "quest", "pick_up_easter_egg" );
}

debug_prison_spoon_quest() //dev call didn't check
{
	/*
/#
	while ( 1 )
	{
		a_players = getplayers();
		_a377 = a_players;
		_k377 = getFirstArrayKey( _a377 );
		while ( isDefined( _k377 ) )
		{
			player = _a377[ _k377 ];
			if ( player hasweapon( "bouncing_tomahawk_zm" ) )
			{
				flag_set( "soul_catchers_charged" );
				break;
			}
			else
			{
				_k377 = getNextArrayKey( _a377, _k377 );
			}
		}
		wait 1;
#/
	}
	*/
}
