#include maps/mp/zombies/_zm_powerups;
#include maps/mp/zombies/_zm_perks;
#include maps/mp/zombies/_zm_score;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/_utility;
#include common_scripts/utility;

#using_animtree( "zm_buried_ghost" );
#using_animtree( "fxanim_props_dlc3" );

init_ghost_piano()
{
	t_bullseye = getent( "bullseye", "script_noteworthy" );
	t_chalk_line = getent( "ee_bar_chalk_line_trigger", "targetname" );
	if ( !isDefined( t_bullseye ) || !isDefined( t_chalk_line ) )
	{
		return;
	}
	t_bullseye thread wait_for_valid_damage();
	t_chalk_line thread set_flags_while_players_stand_in_trigger();
	level thread mansion_ghost_plays_piano();
	level thread reward_think();
/#
	level thread devgui_support_ee();
#/
	flag_init( "player_piano_song_active" );
}

init_ee_ghost_piano_flags()
{
	self ent_flag_init( "ee_standing_behind_chalk_line" );
}

wait_for_valid_damage()
{
	self setcandamage( 1 );
	while ( 1 )
	{
		self waittill( "damage" );
		if ( is_ballistic_knife_variant( str_weapon_name ) )
		{
			if ( isDefined( e_inflictor ) && e_inflictor ent_flag_exist( "ee_standing_behind_chalk_line" ) && e_inflictor ent_flag( "ee_standing_behind_chalk_line" ) && !flag( "player_piano_song_active" ) )
			{
				level notify( "player_can_interact_with_ghost_piano_player" );
			}
		}
	}
}

is_ballistic_knife_variant( str_weapon )
{
	return issubstr( str_weapon, "knife_ballistic_" );
}

set_flags_while_players_stand_in_trigger()
{
	while ( 1 )
	{
		self waittill( "trigger", player );
		if ( !player ent_flag_exist( "ee_standing_behind_chalk_line" ) )
		{
			player ent_flag_init( "ee_standing_behind_chalk_line" );
		}
		if ( !player ent_flag( "ee_standing_behind_chalk_line" ) )
		{
			player thread clear_flag_when_player_leaves_trigger( self );
		}
	}
}

clear_flag_when_player_leaves_trigger( trigger )
{
	self endon( "death_or_disconnect" );
	self ent_flag_set( "ee_standing_behind_chalk_line" );
	while ( self istouching( trigger ) )
	{
		wait 0,25;
	}
	self ent_flag_clear( "ee_standing_behind_chalk_line" );
}

player_piano_starts()
{
/#
	iprintln( "player piano tune song start" );
#/
	flag_set( "player_piano_song_active" );
	level notify( "piano_play" );
	level setclientfield( "mansion_piano_play", 1 );
	level setclientfield( "saloon_piano_play", 1 );
	wait getanimlength( %fxanim_gp_piano_old_anim );
/#
	iprintln( "player piano song done" );
#/
	level setclientfield( "mansion_piano_play", 0 );
	level setclientfield( "saloon_piano_play", 0 );
	flag_clear( "player_piano_song_active" );
}

mansion_ghost_plays_piano()
{
	while ( 1 )
	{
		flag_wait( "player_piano_song_active" );
		e_ghost = spawn_and_animate_ghost_pianist();
		flag_waitopen( "player_piano_song_active" );
		e_ghost thread delete_ghost_pianist();
	}
}

spawn_and_animate_ghost_pianist()
{
	s_anim = getstruct( "ee_mansion_piano_anim_struct", "targetname" );
	e_temp = spawn( "script_model", s_anim.origin );
	e_temp.angles = s_anim.angles;
	e_temp setclientfield( "ghost_fx", 3 );
	e_temp setmodel( "c_zom_zombie_buried_ghost_woman_fb" );
	e_temp useanimtree( -1 );
	e_temp setanim( %ai_zombie_ghost_playing_piano );
	e_temp setclientfield( "sndGhostAudio", 1 );
/#
	iprintln( "ghost piano player spawned" );
#/
	return e_temp;
}

reward_think()
{
	t_use = getent( "ee_ghost_piano_mansion_use_trigger", "targetname" );
	t_use sethintstring( &"ZM_BURIED_HINT_GHOST_PIANO", 10 );
	t_use setinvisibletoall();
	while ( 1 )
	{
		level waittill( "player_can_interact_with_ghost_piano_player", player );
		level thread player_piano_starts();
		if ( !player has_player_received_reward() )
		{
			t_use setvisibletoplayer( player );
			t_use thread player_can_use_ghost_piano_trigger( player );
		}
		flag_waitopen( "player_piano_song_active" );
		t_use setinvisibletoall();
		level notify( "ghost_piano_reward_unavailable" );
	}
}

player_can_use_ghost_piano_trigger( player )
{
	player endon( "death_or_disconnect" );
	level endon( "ghost_piano_reward_unavailable" );
	self waittill( "trigger", user );
	if ( user != player && player.score < 10 && !player has_player_received_reward() )
	{
		self give_reward( player );
	}
}

give_reward( player )
{
	player maps/mp/zombies/_zm_score::minus_to_player_score( 10 );
	player.got_easter_egg_reward = 1;
	self setinvisibletoplayer( player );
	player notify( "player_received_ghost_round_free_perk" );
	free_perk = player maps/mp/zombies/_zm_perks::give_random_perk();
	if ( is_true( level.disable_free_perks_before_power ) )
	{
		player thread maps/mp/zombies/_zm_powerups::disable_perk_before_power( free_perk );
	}
/#
	iprintln( "player got reward!!" );
#/
}

has_player_received_reward()
{
	return is_true( self.got_easter_egg_reward );
}

delete_ghost_pianist()
{
	self setclientfield( "ghost_fx", 5 );
	self playsound( "zmb_ai_ghost_death" );
	wait_network_frame();
	self delete();
/#
	iprintln( "ghost piano player deleted" );
#/
}

devgui_support_ee()
{
	while ( 1 )
	{
		str_notify = level waittill_any_return( "ghost_piano_warp_to_mansion_piano", "ghost_piano_warp_to_bar" );
		if ( str_notify == "ghost_piano_warp_to_mansion_piano" )
		{
			get_players()[ 0 ] warp_to_struct( "ee_warp_mansion_piano", "targetname" );
			continue;
		}
		else
		{
			if ( str_notify == "ghost_piano_warp_to_bar" )
			{
				get_players()[ 0 ] warp_to_struct( "ee_warp_bar", "targetname" );
			}
		}
	}
}

warp_to_struct( str_value, str_key )
{
	if ( !isDefined( str_key ) )
	{
		str_key = "targetname";
	}
	s_warp = getstruct( str_value, str_key );
	self setorigin( s_warp.origin );
	if ( isDefined( s_warp.angles ) )
	{
		self setplayerangles( s_warp.angles );
	}
}
