
// Ice Guy ------------------------------------------------------------------

class IceGuy : Actor
{
	Default
	{
		Health 120;
		PainChance 144;
		Speed 14;
		Radius 22;
		Height 75;
		Mass 150;
		DamageType "Ice";
		Monster;
		+NOBLOOD
		+TELESTOMP
		+NOICEDEATH
		SeeSound "IceGuySight";
		AttackSound "IceGuyAttack";
		ActiveSound "IceGuyActive";
		Obituary "$OB_ICEGUY";
	}


	States
	{
	Spawn:
		ICEY A 10 A_IceGuyLook;
		Loop;
	See:
		ICEY A 4 A_Chase;
		ICEY B 4 A_IceGuyChase;
		ICEY CD 4 A_Chase;
		Loop;
	Pain:
		ICEY A 1 A_Pain;
		Goto See;
	Missile:
		ICEY EF 3 A_FaceTarget;
		ICEY G 8 Bright A_IceGuyAttack;
		ICEY F 4 A_FaceTarget;
		Goto See;
	Death:
		ICEY A 1 A_IceGuyDie;
		Stop;
	Inactive:
		ICEY A -1;
		Goto See;
	}
	
	//============================================================================
	//
	// SpawnWisp
	//
	//============================================================================

	private void SpawnWisp()
	{
		static const class<Actor> WispTypes[] = { "IceGuyWisp1", "IceGuyWisp2" };

		double dist = (random[IceGuyLook]() - 128) * radius / 128.;
		double an = angle + 90;
		Actor mo = Spawn(WispTypes[random[IceGuyLook]() & 1], Vec3Angle(dist, an, 60.), ALLOW_REPLACE);
		if (mo)
		{
			mo.Vel = Vel;
			mo.target = self;
		}
	}
	
	//============================================================================
	//
	// A_IceGuyLook
	//
	//============================================================================

	// [BB] clientsafe
	clientsafe void A_IceGuyLook()
	{
		A_Look();
		if (random[IceGuyLook]() < 64) SpawnWisp();
	}

	//============================================================================
	//
	// A_IceGuyChase
	//
	//============================================================================

	// [BB] clientsafe
	clientsafe void A_IceGuyChase()
	{
		A_Chase();
		if (random[IceGuyLook]() < 128) SpawnWisp();
	}

	//============================================================================
	//
	// A_IceGuyAttack
	//
	//============================================================================

	void A_IceGuyAttack()
	{
		if(!target) 
		{
			return;
		}
		SpawnMissileXYZ(Vec3Angle(radius / 2, angle + 90, 40.), target, "IceGuyFX");
		SpawnMissileXYZ(Vec3Angle(radius / 2, angle - 90, 40.), target, "IceGuyFX");
		A_PlaySound (AttackSound, CHAN_WEAPON);
	}
}

extend class Actor
{
	//============================================================================
	//
	// A_IceGuyDie (globally accessible)
	//
	//============================================================================

	// [BB] clientsafe
	clientsafe void A_IceGuyDie()
	{
		Vel = (0,0,0);
		Height = Default.Height;
		A_FreezeDeathChunks();
	}

}

// Ice Guy Projectile -------------------------------------------------------

class IceGuyFX : Actor
{
	Default
	{
		Speed 14;
		Radius 8;
		Height 10;
		Damage 1;
		DamageType "Ice";
		Projectile;
		-ACTIVATEIMPACT -ACTIVATEPCROSS
		DeathSound "IceGuyMissileExplode";
	}

	States
	{
	Spawn:
		ICPR ABC 3 Bright A_SpawnItemEx("IceFXPuff", 0,0,2);
		Loop;
	Death:
		ICPR D 4 Bright;
		ICPR E 4 Bright A_IceGuyMissileExplode;
		ICPR FG 4 Bright;
		ICPR H 3 Bright;
		Stop;
	}
	

	//============================================================================
	//
	// A_IceGuyMissileExplode
	//
	//============================================================================

	void A_IceGuyMissileExplode()
	{
		for (int i = 0; i < 8; i++)
		{
			Actor mo = SpawnMissileAngleZ (pos.z+3, "IceGuyFX2", i*45., -0.3);
			if (mo)
			{
				mo.target = target;
			}
		}
	}
}

// Ice Guy Projectile's Puff ------------------------------------------------

class IceFXPuff : Actor
{
	Default
	{
		Radius 1;
		Height 1;
		+NOBLOCKMAP +NOGRAVITY +DROPOFF +SHADOW
		+NOTELEPORT
		RenderStyle "Translucent";
		Alpha 0.4;
	}
	States
	{
	Spawn:
		ICPR IJK 3;
		ICPR LM 2;
		Stop;
	}
}

// Secondary Ice Guy Projectile (ejected by the primary projectile) ---------

class IceGuyFX2 : Actor
{
	Default
	{
		Speed 10;
		Radius 4;
		Height 4;
		Damage 1;
		DamageType "Ice";
		Gravity 0.125;
		+NOBLOCKMAP +DROPOFF +MISSILE
		+NOTELEPORT
		+STRIFEDAMAGE
	}
	States
	{
	Spawn:
		ICPR NOP 3 Bright;
		Loop;
	}
}

// Ice Guy Bit --------------------------------------------------------------

class IceGuyBit : Actor
{
	Default
	{
		Radius 1;
		Height 1;
		Gravity 0.125;
		+NOBLOCKMAP +DROPOFF
		+NOTELEPORT
	}
	States
	{
	Spawn:
		ICPR Q 50 Bright;
		Stop;
		ICPR R 50 Bright;
		Stop;
	}
}

// Ice Guy Wisp 1 -----------------------------------------------------------

class IceGuyWisp1 : Actor
{
	Default
	{
		+NOBLOCKMAP +NOGRAVITY +DROPOFF +MISSILE
		+NOTELEPORT
		RenderStyle "Translucent";
		Alpha 0.4;
	}
	States
	{
	Spawn:
		ICWS ABCDEFGHI 2;
		Stop;
	}
}

// Ice Guy Wisp 2 -----------------------------------------------------------

class IceGuyWisp2 : IceGuyWisp1
{
	States
	{
	Spawn:
		ICWS JKLMNOPQR 2;
		Stop;
	}
}

