// Thanks to AKMDM for helping with netcode-related things

// Spawned on the SERVER end
// This spawns the "real" clinger
ACTOR FlameClingerServer
{
	RenderStyle None
	+NOINTERACTION
	+NOCLIP
	+THRUACTORS
	Radius 2
	Height 2
	States
	{
		Spawn:
			TNT1 A 2
			TNT1 A 0 A_SpawnItemEx("FlameClinger",0,0,0,0,0,0,0,SXF_TRANSFERPOINTERS | SXF_NOCHECKPOSITION | SXF_CLIENTSIDE)
			TNT1 A 2
			Stop
	}
}

// This is the real visual clinger
// Clinger follows its target desperately and
// spawns flame particles as long as they're Burning
ACTOR FlameClinger : FlameClingerServer
{
	+CLIENTSIDEONLY
	States
	{
		Spawn:
			TNT1 A 1
			TNT1 A 0 ACS_NamedExecuteAlways("FlameLatch",0)
			TNT1 A 0 A_PlaySoundEx("flame/crispy", "Body", true)
			TNT1 A 3
			Goto BurnCheck
			
		BurnCheck:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("FlameContinue",0), "SpawnFX")
			TNT1 A 3
			TNT1 A 0 A_StopSoundEx("Body")
			TNT1 A 0 A_PlaySoundEx("flame/crispystop", "Body")
			Stop
			
		SpawnFX:
			TNT1 A 0 A_Warp(AAPTR_TARGET, 0, 0, scaley/2, 0, WARPF_NOCHECKPOSITION)
			TNT1 AAAA 0 A_SpawnItemEx("SmallFlamePuff",random(-(scalex/2),scalex/2),random(-(scalex/2),scalex/2),random(-(scaley/2),scaley/2))
			TNT1 A 3
			Goto BurnCheck
	}
}

// We are forcing ourselves to ignite from a radius!
ACTOR FlameForceDamage : Inventory { Inventory.MaxAmount 1000 }
ACTOR FlameForce : CustomInventory
{
	States
	{
		Pickup:
			TNT1 A 2
			TNT1 A 0 ACS_NamedExecuteAlways("FlameRadial",0)
			TNT1 A 0
			Fail
	}
}

ACTOR SmallFlamePuff
{
	+NOCLIP
	+NOINTERACTION
	Radius 2
	Height 2
	RenderStyle Add
	Scale 0.25
	States
	{
		Spawn:
			FLPF A 0
			FLPF A 0 A_ChangeVelocity(0,0,random(1,3))
			FLPF A 0 A_SetScale(scalex + (0.03 * random(-4,4)))
			Goto PickSprite
			
		PickSprite:
			FLPF A 0 A_Jump(128,"DoAnim")
			FLPG A 0
			Goto DoAnim
		DoAnim:
			"####" ABCDEFGH 1 bright A_FadeOut(0.05)
			Stop
	}
}

ACTOR BigFlamePuff : SmallFlamePuff { Scale 0.35 }

ACTOR TinyFlamePuff : SmallFlamePuff
{
	Scale 0.12
	States
	{
		Spawn:
			FLPF A 0
			FLPF A 0 A_ChangeVelocity(0,0,random(1,2))
			FLPF A 0 A_SetScale(scalex + (0.01 * random(-8,4)))
			Goto PickSprite
	}
}

// Flame explosion!
ACTOR FlameBoom : ZTFX
{
	RenderStyle Add
	States
	{
		Spawn:
			IXPL ABCDEFGHIJKLMN 1 bright
			Stop
	}
}

// Lingering flame
ACTOR FlameLinger : ZTFX
{
	var int user_duration;
	
	RenderStyle Add
	Scale 0.15
	+FLOORCLIP
	+MOVEWITHSECTOR
	States
	{
		Spawn:
			IFLM A 0
			IFLM A 0 A_FadeOut(0.1 * random(0,5))
			IFLM A 0 A_SetScale(scalex + (0.02 * random(-4,4)), 0.05 * random(2,4))
			Goto Looping
		
		Looping:
			IFLM ABCDEFGHIJKLMNOPQRST 1 bright
			IFLM A 0 A_SetUserVar("user_duration", user_duration+1)
			IFLM A 0 A_JumpIf(user_duration >= 3, "Vanish")
			Loop
			
		Vanish:
			IFLM ABCDEFGHIJKLMNOPQRST 1 bright A_FadeOut(0.08)
			Stop
	}
}

// Side puff
ACTOR FlameSide : ZTFX
{
	RenderStyle Add
	Scale 0.50
	States
	{
		Spawn:
			IFPF A 0
			IFPF A 0 A_SetScale(scalex - (0.05 * random(0,4)))
			IFPF ABCDEFGHIJKLMNOP 1 bright A_FadeOut(0.05)
			Stop
	}
}
