//=============================================================================
// KFAIController_HansFriendlyTest
//=============================================================================
// Hans's AIController that will target zeds not players - for testing
//=============================================================================
// Killing Floor 2
// Copyright (C) 2015 Tripwire Interactive LLC
//=============================================================================

class KFAIController_HansFriendlyTest extends KFAIController_Hans;

/** Hans doesn't get SeePlayer calls on monsters, so check occasionally if he can see his enemy */
var float EnemyVisionCheckInterval;

/** Hans doesn't get SeePlayer calls on monsters, so check occasionally if he can see his enemy */
var float LastEnemyVisionCheckTime;

/** Don't create a benchmarking PRI for the test Hans */
function InitPlayerReplicationInfo(){}

/** Make sure test Hans is on the human team */
simulated event byte ScriptGetTeamNum()
{
	return 0;
}

/** Timer function called during latent moves that determines whether NPC should sprint or stop sprinting */
function bool ShouldSprint()
{
    local float RangeToEnemy;

	if( Enemy != none && MyHansPawn != none && !MyHansPawn.bIsHeadless && !MyHansPawn.bEmpPanicked )
	{
		// Always sprint if we're trying to track down players to heal from
        if( MyHansPawn.bInHuntAndHealMode )
		{
			//`log(self@GetFuncName()$" bInHuntAndHealMode should sprint!");
            return true;
		}

        // Hack, since Hans doesn't get SeePlayer calls on zeds, check here to see if we can see our enemy
        if( LastEnemySightedTime == 0 && (LastEnemyVisionCheckTime == 0 ||
            (`TimeSince(LastEnemyVisionCheckTime) > EnemyVisionCheckInterval)) )
        {
            LastEnemyVisionCheckTime = WorldInfo.TimeSeconds;
            if( CanSee(Enemy) )
            {
                LastEnemySightedTime = WorldInfo.TimeSeconds;
            }
        }

		// Sprint if we can't see our enemy
		if( LastEnemySightedTime == 0 || `TimeSince(LastEnemySightedTime) > LostSightSprintDelay )
		{
            // Hack, since Hans doesn't get SeePlayer calls on zeds, check here to see if we can see our enemy
            if( LastEnemyVisionCheckTime == 0 || (`TimeSince(LastEnemyVisionCheckTime) > EnemyVisionCheckInterval) )
            {
                LastEnemyVisionCheckTime = WorldInfo.TimeSeconds;
                if( CanSee(Enemy) )
                {
                    LastEnemySightedTime = WorldInfo.TimeSeconds;
                    return false;
                }
            }

			//`log(self@GetFuncName()$" don't see any enemy should sprint = true! LastEnemySightedTime: "$LastEnemySightedTime$" TimeSince(LastEnemySightedTime): "$`TimeSince(LastEnemySightedTime));
            return true;
		}

        // No sprinting with the guns out!
        if( MyHansPawn.bGunsEquipped )
        {
            RangeToEnemy = VSize( Enemy.Location - Pawn.Location );

            // Sprint if we're too close to shoot
            if( RangeToEnemy > StartShootingRange || rangeToEnemy < MinShootingRange )
            {
                //`log(self@GetFuncName()$" guns out but enemy not in gun range. Should sprint = true!");
                return true;
            }
            else
            {
                //`log(self@GetFuncName()$" guns out enemy not in gun range. Should sprint = false!");
                return false;
            }
        }

        //`log(self@GetFuncName()$" Generic should sprint depending on phase: "$MyHansPawn.DesireSprintingInThisPhase());
        return MyHansPawn.DesireSprintingInThisPhase();
	}
	//`log(self@GetFuncName()$" Generic should sprint = false!");
	return false;
}


// Below is code to turn on if we want to use Hans with "bIsPlayer=true".
// It simulates "SeePlayer" calls for "SeeMonster" calls so Hans will properly
// get vision calls for seeing monster enemies

/*********************************************************************************************
*  Action_Idle State - default state this controller uses while pawn is active
********************************************************************************************* */

//state Action_Idle
//{
//	event BeginState(Name PreviousStateName)
//	{
//		Super.BeginState( PreviousStateName );
//
//		Enable( 'SeeMonster' );
//	}
//}
//
///** Called when this controller has possessed inPawn */
//event Possess( Pawn inPawn, bool bVehicleTransition )
//{
//	// Currently only enabling SeePlayer during latent moves in AICommand_MoveToGoal
//	Disable( 'SeeMonster' );
//
//	super.Possess( inPawn, bVehicleTransition );
//}
//
///** Timer which re-enables SeePlayer event polling */
//event EnableSeePlayer()
//{
//	Super.EnableSeePlayer();
//	if( !bHasDebugCommand )
//	{
//		Enable( 'SeeMonster' );
//	}
//}
//
///** Disable this NPC's SeePlayer polling for DisabledTime seconds */
//event DisableSeePlayer( optional float DisabledTime )
//{
//    Super.DisableSeePlayer( DisabledTime );
//	Disable( 'SeeMonster' );
//
//}
//
//
///* epic ===============================================
//* ::SeeMonster
//*
//* Called whenever Seen is within of our line of sight
//* if Seen.bIsPlayer==false.
//*
//* =====================================================
//*/
//event SeeMonster( Pawn Seen )
//{
//    SeePlayer( Seen );
//}

/* epic ===============================================
* ::NotifyTakeHit
*
* Notification from pawn that it has received damage
* via TakeDamage().
*
* =====================================================
*/
function NotifyTakeHit(Controller InstigatedBy, vector HitLocation, int Damage, class<DamageType> damageType, vector Momentum)
{
    // Don't heal with a friendly test Hans
//    if( MyHansPawn != none && !MyHansPawn.bHealedThisPhase && MyHansPawn.CurrentBattlePhase < 4 )
//    {
//	   	if( GetHealthPercentage() < 0.35 )
//	   	{
//	       	MyHansPawn.SetHuntAndHealMode( true );
//			NextBattlePhase();
//	   	}
//	}

    Super(KFAIController_ZedBoss).NotifyTakeHit(InstigatedBy, HitLocation, Damage, DamageType, Momentum);
}

defaultproperties
{
    bAllowScriptTeamCheck=true
    MinShootingRange=100
    MaxGunAttackLength=30
    ShootingCooldown=3.0
    EnemyVisionCheckInterval=0.1
    //bIsPlayer=true
}

