//=============================================================================
// KFWeapAttach_HuskCannon
//=============================================================================
//
//=============================================================================
// Killing Floor 2
// Copyright (C) 2017 Tripwire Interactive LLC
//=============================================================================
class KFWeapAttach_HuskCannon extends KFWeaponAttachment;

var transient ParticleSystemComponent ChargingPSC;
var ParticleSystem ChargingEffect;
var ParticleSystem ChargedEffect;
var bool bIsCharging;
var bool bIsFullyCharged;

var float StartFireTime;

var int ChargeLevel;

var const ParticleSystem MuzzleFlashEffectL1;
var const ParticleSystem MuzzleFlashEffectL2;
var const ParticleSystem MuzzleFlashEffectL3;

simulated function StartFire()
{
	StartFireTime = WorldInfo.TimeSeconds;
	bIsCharging = true;

	if (ChargingPSC == none)
	{
		ChargingPSC = new(self) class'ParticleSystemComponent';

		if (WeapMesh != none)
		{
			WeapMesh.AttachComponentToSocket(ChargingPSC, 'MuzzleFlash');
		}
		else
		{
			AttachComponent(ChargingPSC);
		}
	}
	else
	{
		ChargingPSC.ActivateSystem();
	}

	if (ChargingPSC != none)
	{
		ChargingPSC.SetTemplate(ChargingEffect);
	}
}

simulated event Tick(float DeltaTime)
{
	local float ChargeRTPC;

	if(bIsCharging && !bIsFullyCharged)
	{
		ChargeRTPC = FMin(class'KFWeap_HuskCannon'.default.MaxChargeTime, WorldInfo.TimeSeconds - StartFireTime) / class'KFWeap_HuskCannon'.default.MaxChargeTime;

		if (ChargeRTPC >= 1.f)
		{
			bIsFullyCharged = true;
			ChargingPSC.SetTemplate(ChargedEffect);
		}
	}

	Super.Tick(DeltaTime);
}

simulated function FirstPersonFireEffects(Weapon W, vector HitLocation)
{
	super.FirstPersonFireEffects(W, HitLocation);

	if (ChargingPSC != none)
	{
		ChargingPSC.DeactivateSystem();
	}
}

simulated function bool ThirdPersonFireEffects(vector HitLocation, KFPawn P, byte ThirdPersonAnimRateByte)
{
	bIsCharging = false;
	bIsFullyCharged = false;

	ChargeLevel = GetChargeFXLevel();

	if (ChargingPSC != none)
	{
		ChargingPSC.DeactivateSystem();
	}

	return Super.ThirdPersonFireEffects(HitLocation, P, ThirdPersonAnimRateByte);
}

simulated function CauseMuzzleFlash(byte FiringMode)
{
	if (MuzzleFlash == None && MuzzleFlashTemplate != None)
	{
		AttachMuzzleFlash();
	}

	switch (ChargeLevel)
	{
	case 1:
		MuzzleFlash.MuzzleFlash.ParticleSystemTemplate = MuzzleFlashEffectL1;
		MuzzleFlash.MuzzleFlash.PSC.SetTemplate(MuzzleFlashEffectL1);
		break;
	case 2:
		MuzzleFlash.MuzzleFlash.ParticleSystemTemplate = MuzzleFlashEffectL2;
		MuzzleFlash.MuzzleFlash.PSC.SetTemplate(MuzzleFlashEffectL2);
		break;
	case 3:
		MuzzleFlash.MuzzleFlash.ParticleSystemTemplate = MuzzleFlashEffectL3;
		MuzzleFlash.MuzzleFlash.PSC.SetTemplate(MuzzleFlashEffectL3);
		break;
	}

	Super.CauseMuzzleFlash(FiringMode);
}

// Should generally match up with KFWeap_HuskCannon::GetChargeFXLevel
function int GetChargeFXLevel()
{
	local int MaxCharges;
	local int Charges;

	MaxCharges = int(class'KFWeap_HuskCannon'.default.MaxChargeTime / class'KFWeap_HuskCannon'.default.ValueIncreaseTime);
	Charges = Min((WorldInfo.TimeSeconds - StartFireTime) / class'KFWeap_HuskCannon'.default.ValueIncreaseTime, MaxCharges);

	if (Charges <= 1)
	{
		return 1;
	}
	else if (Charges < MaxCharges)
	{
		return 2;
	}
	else
	{
		return 3;
	}
}

defaultproperties
{
	MuzzleFlashTemplate=KFMuzzleFlash'WEP_HuskCannon_ARCH.Wep_HuskCannon_MuzzleFlash_3P'

	MuzzleFlashEffectL1=ParticleSystem'WEP_HuskCannon_EMIT.FX_Huskcannon_MuzzleFlash_L1_3P'
	MuzzleFlashEffectL2=ParticleSystem'WEP_HuskCannon_EMIT.FX_Huskcannon_MuzzleFlash_L2_3P'
	MuzzleFlashEffectL3=ParticleSystem'WEP_HuskCannon_EMIT.FX_Huskcannon_MuzzleFlash_L3_3P'

	ChargingEffect=ParticleSystem'WEP_HuskCannon_EMIT.FX_Huskcannon_Charging_01'
	ChargedEffect=ParticleSystem'WEP_HuskCannon_EMIT.FX_Huskcannon_Charged_01'
}