//Sandman
class SandmanPuff : Actor
{
	Default
	{
		DamageType "Matriarch";
		Decal "Scorch";
		+NOBLOCKMAP
		+PUFFGETSOWNER
		+PUFFONACTORS
		+ALWAYSPUFF
		+FORCERADIUSDMG
		//+BLOODLESSIMPACT
		+SKYEXPLODE
		+EXTREMEDEATH
	}
	
	States
	{
	Spawn:
		TNT1 A 20 NoDelay {
			A_QuakeEx(3, 3, 3, 10, 0, 128, "none", QF_SCALEDOWN);
			A_QuakeEx(2, 2, 2, 15, 0, 256, "none", QF_SCALEDOWN);
			A_QuakeEx(1, 1, 1, 20, 0, 384, "none", QF_SCALEDOWN);
			A_PlaySound("Matriarch/Hit",5,0.6);
			A_PlaySound("Matriarch/Exp",6,0.7);
			A_Explode((60+random(0,20)),64,1);
			A_AlertMonsters();
			A_SpawnItemEx("SandmanHit",0,0,0,0,0,0,0,SXF_CLIENTSIDE,0);
			A_SpawnItemEx("SandmanGL",0,0,0,0,0,0,0,SXF_CLIENTSIDE,0);
		}
		Stop;
	}
}

//Rest
class SandmanGL : Actor
{
	Default
	{
		+NOINTERACTION
		+NOTONAUTOMAP
	}
	
    States
    {
    Spawn:
		TNT1 A 22;
		Stop;
    }
}

class SandmanBase : Actor
{
	Default
	{
		Renderstyle "Add";
		+NOINTERACTION
		+FORCEXYBILLBOARD
	}
}

class SandmanCloud : SandmanBase
{
	Default
	{
		Alpha 0.65;
	}
	
	States
	{
		Spawn:
			TNT1 A 0 NoDelay A_Jump(256, "SpriteA", "SpriteB", "SpriteC", "SpriteD",
										 "SpriteE", "SpriteF", "SpriteG", "SpriteH");
		SpriteA:
			CLOD A 0 A_Jump(256, "FadeIn");
		SpriteB:
			CLOD B 0 A_Jump(256, "FadeIn");
		SpriteC:
			CLOD C 0 A_Jump(256, "FadeIn");
		SpriteD:
			CLOD D 0 A_Jump(256, "FadeIn");
		SpriteE:
			CLOD E 0 A_Jump(256, "FadeIn");
		SpriteF:
			CLOD F 0 A_Jump(256, "FadeIn");
		SpriteG:
			CLOD G 0 A_Jump(256, "FadeIn");
		SpriteH:
			CLOD H 0 A_Jump(256, "FadeIn");
		FadeIn:
			"####" "#" 0 Bright A_SetScale(frandom(0.8, 1.0));
			Goto Idle;
		Idle:
			"####" "#" 2 Bright A_Jump(190, "FadeOut");
			Loop;
		FadeOut:
			"####" "#" 1 Bright {
				A_FadeOut(0.035);
				A_ScaleVelocity(frandom(0.96, 0.97));
				A_SetScale(Scale.X - frandom(0.02, 0.03));
				Return A_JumpIf(Scale.X <= 0, "Null");
			}
			Loop;
	}
}

class SandmanSmoke : SandmanBase
{
	Default
	{
		Alpha 0.0;
		RenderStyle "Translucent";
	}
	
	States
	{
		Spawn:
		    TNT1 A 6;
			TNT1 A 0 A_Jump(256, "SpriteA", "SpriteB", "SpriteC", "SpriteD");
		SpriteA:
			DYMI A 0 A_Jump(256, "FadeIn");
		SpriteB:
			DYMI B 0 A_Jump(256, "FadeIn");
		SpriteC:
			DYMI C 0 A_Jump(256, "FadeIn");
		SpriteD:
			DYMI D 0 A_Jump(256, "FadeIn");
		FadeIn:
			"####" "#" 0 A_SetScale(frandom(0.6, 0.8));
			Goto RealFadeIn;
		RealFadeIn:
			"####" "#" 1 {
				A_FadeIn(frandom(0.01, 0.03));
				Return A_JumpIf(Alpha >= 0.25, "FadeOut");
			}
			Loop;
		FadeOut:
			"####" "#" 1 {
				A_FadeOut(frandom(0.02,0.015));
				A_ScaleVelocity(0.96);
				A_SetScale(Scale.X + frandom(0.02, 0.025));
			}
			Loop;
	}
}

class SandmanEmber : SandmanBase
{
	Default
	{
		Alpha 0.99;
	}
	
	States
	{
		Spawn:
			TNT1 A 0 NoDelay A_Jump(256, "SpriteA", "SpriteB", "SpriteC");
		SpriteA:
			EMBR A 0 A_Jump(256, "FadeIn");
		SpriteB:
			EMBR B 0 A_Jump(256, "FadeIn");
		SpriteC:
			EMBR C 0 A_Jump(256, "FadeIn");
		FadeIn:
			"####" "#" 0 Bright A_SetScale(frandom(0.035, 0.065));
			Goto Idle;
		Idle:
			"####" "#" 2 Bright A_Jump(200, "FadeOut");
			Loop;
		FadeOut:
			"####" "#" 1 Bright {
				A_ChangeVelocity(Vel.X * frandom(0.93, 0.99),
								 Vel.Y * frandom(0.93, 0.99),
								 Vel.Z - frandom(0.2, 0.3),
								 CVF_REPLACE);
				A_SetScale(Scale.X - frandom(0.0025, 0.0015));
				Return A_JumpIf(Scale.X <= 0.0, "Null");
			}
			Loop;
	}
}

class SandmanShockwave : SandmanBase
{
	Default
	{
		Scale 0.25;
	}
	
	States
	{
		Spawn:
			SHCK A 1 Bright NoDelay {
				A_FadeOut(0.075);
				A_SetScale(Scale.X + frandom(0.04, 0.06));
			}
			Loop;
	}
}

class SandmanShockwave2 : SandmanShockwave
{
	Default
	{
		+FLATSPRITE
	}
	
	States
	{
		Spawn:
			SHCK A 1 Bright NoDelay {
				A_FadeOut(0.075);
				A_SetScale(Scale.X + frandom(0.04, 0.06));
			}
			Loop;
	}
}

class SandmanShockNewwave : Actor
{
	Default
	{
		Renderstyle "Add";
		Alpha 0;
		+FLATSPRITE
		+ROLLSPRITE
		+ROLLCENTER
		+DONTFLIP
		+SPRITEANGLE
		+NOINTERACTION
		//+NOTIMEFREEZE
	}
	
	States
	{
	Spawn:
		SHCK A 0;
	Setup:
		"####" "#" 0
		{
			A_SetAngle(frandom(0.0,360.0));
			A_SetSpriteAngle(frandom(0.0,360.0));
			A_SetScale(frandom(0.15,0.25));
			A_FadeIn(frandom(0.8,0.99));
			A_SetPitch(frandom(-90.0,90.0));
		}
	Main:
		"####" "#" 1 Bright {
			A_SetScale(Scale.X + frandom(0.05, 0.06));
			A_FadeOut(0.075);
			A_SetSpriteRotation(Angle + frandom(20.0,15.0));
		}
		Loop;
	}
}

class SandmanFlare : SandmanBase
{
	Default
	{
		Scale 1.5;
	}
	
	States
	{
		Spawn:
			FLER A 1 Bright NoDelay {
				A_FadeOut(0.05);
				A_SetScale(Scale.X - frandom(0.05, 0.06));
				Return A_JumpIf(Scale.X <= 0.0, "Null");
			}
			Loop;
	}
}

class SandmanBlast : SandmanBase
{
	Default
	{
		Scale 0.2;
		Alpha 0.99;
	}
	
	States
	{
		Spawn:
			TNT1 A 0 NoDelay A_Jump(256, "SpriteA", "SpriteB", "SpriteC", "SpriteD",
										 "SpriteE", "SpriteF", "SpriteG", "SpriteH");
		SpriteA:
			EXBS A 0 A_Jump(256, "FadeIn");
		SpriteB:
			EXBS B 0 A_Jump(256, "FadeIn");
		SpriteC:
			EXBS C 0 A_Jump(256, "FadeIn");
		SpriteD:
			EXBS D 0 A_Jump(256, "FadeIn");
		SpriteE:
			EXBS E 0 A_Jump(256, "FadeIn");
		SpriteF:
			EXBS F 0 A_Jump(256, "FadeIn");
		SpriteG:
			EXBS G 0 A_Jump(256, "FadeIn");
		SpriteH:
			EXBS H 0 A_Jump(256, "FadeIn");
		FadeIn:
			"####" "#" 1 Bright {
				A_FadeOut(0.04);
				A_SetScale(Scale.X + frandom(0.02, 0.03));
			}
			Loop;
	}
}

class SandmanHit : SandmanBase
{
	Default
	{
		Renderstyle "Normal";
	}
	
	int User_SpawnCount;
	
	States
	{
	Spawn:
		TNT1 A 0 NoDelay {
			User_SpawnCount = 3;
			A_SpawnItemEx("SandmanBlast",0,0,0,0,0,0,0,SXF_CLIENTSIDE);
			A_SpawnItemEx("SandmanFlare",0,0,0,0,0,0,0,SXF_CLIENTSIDE);
			A_SpawnItemEx("SandmanShockwave",0,0,0,0,0,0,0,SXF_CLIENTSIDE);
			if(!GetCvar("GC_ToasterMode"))
			{
				for(int user_c = 0; user_c < 2; user_c++)
				{
					A_SpawnItemEx("SandmanShockNewwave",0,0,0,0,0,0,0,SXF_CLIENTSIDE);
				}
			}
		}
		TNT1 A random(2,3) {
			User_SpawnCount--;
			if(!GetCvar("User_ToasterMode"))
			{
				for(int user_c = 0; user_c < 5; user_c++)
				{
					A_SpawnItemEx("SandmanCloud", frandom(-15.0, 15.0),
						frandom(-15.0, 15.0), frandom(-15.0, 15.0),
						frandom(-5.0, 5.0), frandom(-5.0, 5.0),
						frandom(-5.0, 5.0), frandom(0.0,360.0), SXF_CLIENTSIDE, 10);
				}
				for(int user_c = 0; user_c < 2; user_c++)
				{
					A_SpawnItemEx("SandmanSmoke", frandom(-45.0, 45.0),
						frandom(-45.0, 45.0), frandom(-35.0, 35.0),
						frandom(1.5, -1.5), frandom(-1.5, 1.5),
						frandom(-1.5, 1.5), frandom(0.0,360.0), SXF_CLIENTSIDE, 10);
				}
				for(int user_c = 0; user_c < 2; user_c++)
				{
					A_SpawnItemEx("SandmanEmber", frandom(-35.0, 35.0),
						frandom(-35.0, 35.0), frandom(-35.0, 35.0),
						frandom(-3.0, -10.0), frandom(-6.0, 6.0),
						frandom(1.0, 6.0), frandom(0.0,360.0), SXF_CLIENTSIDE, 10);
				}
			}
			else
			{
				for(int user_c = 0; user_c < 3; user_c++)
				{
					A_SpawnItemEx("SandmanCloud", frandom(-15.0, 15.0),
						frandom(-15.0, 15.0), frandom(-15.0, 15.0),
						frandom(-5.0, -5.0), frandom(-5.0, 5.0),
						frandom(-5.0, 5.0), frandom(0.0,360.0), SXF_CLIENTSIDE, 64);
				}
				A_SpawnItemEx("SandmanSmoke", frandom(-45.0, 45.0),
					frandom(-45.0, 45.0), frandom(-35.0, 35.0),
					frandom(1.5, -1.5), frandom(-1.5, 1.5),
					frandom(-1.5, 1.5), frandom(0.0,360.0), SXF_CLIENTSIDE, 96);
				A_SpawnItemEx("SandmanEmber", frandom(-35.0, 35.0),
					frandom(-35.0, 35.0), frandom(-35.0, 35.0),
					frandom(-3.0, -10.0), frandom(-6.0, 6.0),
					frandom(1.0, 6.0), frandom(0.0,360.0), SXF_CLIENTSIDE, 32);
			}
			Return A_JumpIf(User_SpawnCount <= 0, "Null");
		}
		Wait;
	}
}