class MourningShell : FastProjectile
{
	Default
	{
		Radius 10;
		Height 14;
		Speed 150;
		DamageFunction (200*random(1,3));
		Projectile;
		ProjectileKickback 125;
		DamageType "Matriarch";
		Obituary "%o was obliterated by %k's ''Mourning Glory''.";
		DeathSound "";
		Scale 0.8;
		MissileType "MatriarchTrailSpawner";
		MissileHeight 14;
		Decal "MourningScorch";
		+NOGRAVITY
		+THRUGHOST
		+DONTSPLASH
		+EXPLODEONWATER
		+FORCERADIUSDMG //hurr.
		+DONTREFLECT
		+MTHRUSPECIES
		+FORCEXYBILLBOARD
	}
	
	int lifespan;
	
	States
	{
	Spawn:
		WINP A 0 NoDelay {
			A_ChangeVelocity(0,0,2.0);
			A_PlaySound("Matriarch/Fly",5,0.4,1);
		}
	Looplet:
		WINP A 1 {
			A_SpawnItemEx("MatriarchSlugTrail",0,0,0,0,0,0,0,SXF_TRANSFERSCALE|SXF_CLIENTSIDE);
			A_ChangeVelocity(0,0,-0.1);
		}
		Loop;
  Death:
		TNT1 A 0 {
			if(Target && Target.GetCvar("GC_Kaboom")) { A_PlaySound("Demoman/Kaboom",1); }
			A_Stop();
			lifespan = 14;
			A_PlaySound("TNT/Explosion",5,0.9);
			A_PlaySound("TNT/Add",7);
			A_PlaySound("TNT/Far",6,0.8);
			A_SpawnItemEx("TNTMain",0,0,0,0,0,0,0,SXF_CLIENTSIDE,0);
			A_SpawnItemEx("Mourning_Radiation_Field",0,0,0,0,0,0,0,SXF_TRANSFERPOINTERS);
			//A_SpawnItemEx("Mourning_Radiation_Field2",0,0,0,0,0,0,0,SXF_TRANSFERPOINTERS);
			A_QuakeEx(3,3,3,55,0,768,"none",QF_SCALEDOWN);
			A_QuakeEx(7,7,7,55,0,384,"none",QF_SCALEDOWN);
			A_QuakeEx(3,3,3,55,0,768,"none",QF_SCALEDOWN|QF_WAVE);
			A_QuakeEx(7,7,7,55,0,384,"none",QF_SCALEDOWN|QF_WAVE);
			A_AlertMonsters();
			A_Explode(150,364,0);
			A_Explode(150,364);
			bEXTREMEDEATH = 0;
		}
	DeathLoop:
		TNT1 A 4 {
			lifespan--;
			A_Explode(30,364);
			Return A_JumpIf(lifespan <= 0, 1);
		}
		Loop;
		TNT1 A 6;
		Stop;
	}
}

class MourningShell2 : MourningShell
{
	Default
	{
		Speed 200;
		DamageFunction (250*random(1,3));
	}
}

class MourningShell3 : MourningShell
{
	Default
	{
		Speed 275;
		DamageFunction (300*random(1,3));
	}
}

class MourningShell4 : MourningShell
{
	Default
	{
		Speed 350;
		DamageFunction (350*random(1,3));
	}
}

//Cannon cruft
class Mourning_Ember : Actor
{
	Default
	{
		Speed 8;
		Projectile;
		Renderstyle 'Add';
		Scale 0.0;
		Alpha 0.99;
		+NOINTERACTION
		+FORCEXYBILLBOARD
	}
	
	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 {
			A_ChangeVelocity(0,0,frandom(0.25, 1.25),CVF_RELATIVE);
			A_SetScale(frandom(0.035, 0.045));
			A_ScaleVelocity(frandom(0.6,1.4));
		}
	FadeOut:
		"####" "#" 1 Bright {
			A_ChangeVelocity(frandom(-0.2, 0.2),frandom(-0.2, 0.2),frandom(-0.05, -0.1),CVF_RELATIVE);
			A_SetScale(Scale.X - frandom(0.0015, 0.001));
			Return A_JumpIf(Scale.X <= 0.0, "Null");
		}
		Loop;
	}
}

class Mourning_Cloud : Mourning_Ember
{
	Default
	{
		Speed 6;
		Alpha 0.66;
	}
	
	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.7, 0.8));
				A_ScaleVelocity(frandom(0.5,1.5));
			}
		FadeOut:
			"####" "#" 1 Bright {
				A_FadeOut(0.025);
				A_ScaleVelocity(frandom(0.97, 0.98));
				A_SetScale(Scale.X - frandom(0.01, 0.02));
				Return A_JumpIf(Scale.X <= 0, "Null");
			}
			Loop;
	}
}

class Mourning_Flare : Mourning_Ember
{
	Default
	{
		Speed 4;
		Alpha 0.0;
		Scale 0.3;
		+ROLLSPRITE
		+ROLLCENTER
	}
	
	States
	{
		Spawn:
			FLER A 0 Bright NoDelay A_SetRoll(frandom(0.0,360.0));
		Looplet:
			FLER A 1 Bright {
				A_FadeIn(0.2);
				A_SetScale(Scale.X + 0.05);
				Return A_JumpIf(Alpha >= 1.0, "Looplet2");
			}
			Loop;
		Looplet2:
			FLER A 1 Bright {
				A_FadeOut(0.1);
				A_SetScale(Scale.X - frandom(0.015, 0.02));
				Return A_JumpIf(Scale.X <= 0.0, "Null");
			}
			Loop;
	}
}

class Mourning_Radiation_Field : Actor
{
	Default
	{
		Projectile;
		ProjectileKickback 40;
		Obituary "%o got eaten by %k's radiation field.";
		DamageType "Matriarch";
		Renderstyle 'AddStencil';
		StencilColor "ffc403";
		Alpha 1.0;
		FloatBobStrength 0.2;
		FloatBobPhase 31;
		+BLOODLESSIMPACT
		+FORCERADIUSDMG
		+FLATSPRITE
		+NOINTERACTION
		+NODAMAGETHRUST
		+FLOATBOB
		+DONTBLAST
		+DONTSPLASH
	}

	int radtime;
	int fadeswitch;
	color radbomber;
	
	States
	{
	Spawn:
		TNT1 A 0 NoDelay {
			radtime = 700;
			A_PlaySound("MourningGlory/Radiation",5,0.4,1,1.3);
			fadeswitch = 0;
		}
	Looplet:
		RADF A 0 {
			//Switch.
			if(Alpha <= 0.5) {
				fadeswitch = 1;
			}
			if(Alpha >= 1.0)
			{
				fadeswitch = 0;
			}
		}
		RADF A 1 Bright {
			//Action.
			if(fadeswitch) {
				A_SetScale(Scale.X + 0.002);
				A_FadeIn(0.025);	
			}
			else {
				A_SetScale(Scale.X - 0.002);
				A_FadeOut(0.025);
			}
			
			//Rest.
			/*A_SpawnItemEx("Mourning_Radiation_Field_Trail",0,0,0,
				frandom(0.1,0.2),frandom(0.1,0.2),frandom(frandom(0.1,0.2),frandom(-0.1,-0.2)),
				frandom(0.0,360.0),SXF_CLIENTSIDE|SXF_TRANSFERSCALE);*/
			if(!GetCvar("GC_ToasterMode")) {
			for(int i = 0; i < 6; i++) {
			A_SpawnParticle("ffc403",	//color.
							SPF_FULLBRIGHT | SPF_RELATIVE, //flags
							random(15,50), //lifespan
							frandom(1.0,3.0), //size
							frandom(0.0,360.0), //angle
							frandom(-192.0,192.0), //x offset
							frandom(-192.0,192.0), //y offset
							frandom(-192.0,192.0), //z offset
							frandom(0.01,0.2),	//x velocity
							frandom(-0.1,0.1),	//y velocity
							frandom(-0.2,0.2),	//z velocity
							0,0,0, //x/y/z acceleration
							0.6, //alpha upon spawning
							-1); //fade step
			}
			}
			
			if(radtime % 35 == 0) {
				A_Explode(20,384,0);
			}
			
			//Clock.
			radtime--;
			if(radtime <= 0) { A_StopSound(5); Return ResolveState("Dissipate"); }
			return state(null);
		}
		Loop;
	Dissipate:
		RADF A 1 Bright {
			A_SetScale(Scale.X + 0.002);
			A_FadeOut(0.01);
		}
		Loop;
	}
}

class Mourning_Radiation_Field2 : Mourning_Radiation_Field
{
	Default
	{
		-FLATSPRITE
	}
	
	States
	{
	Spawn:
		TNT1 A 0 NoDelay {
			A_SetScale(Scale.X, Scale.Y - 0.75);
			radtime = 700;
			fadeswitch = 0;
		}
	Looplet:
		RADF A 0 {
			//Switch.
			if(Alpha <= 0.5) {
				fadeswitch = 1;
			}
			if(Alpha >= 1.0)
			{
				fadeswitch = 0;
			}
		}
		RADF A 1 Bright {
			//Action.
			if(fadeswitch) {
				A_SetScale(Scale.X + 0.002, Scale.Y + 0.002);
				A_FadeIn(0.025);	
			}
			else {
				A_SetScale(Scale.X - 0.002, Scale.Y - 0.002);
				A_FadeOut(0.025);
			}
			
			//Rest.
			/*A_SpawnItemEx("Mourning_Radiation_Field_Trail",0,0,0,
				frandom(0.1,0.2),frandom(0.1,0.2),frandom(frandom(0.1,0.2),frandom(-0.1,-0.2)),
				frandom(0.0,360.0),SXF_CLIENTSIDE|SXF_TRANSFERSCALE);*/
			if(radtime % 35 == 0) {
				A_Explode(10,384,0);
			}
			
			//Clock.
			radtime--;
			if(radtime <= 0) { Return ResolveState("Dissipate"); }
			return state(null);
		}
		Loop;
	Dissipate:
		RADF A 1 Bright {
			A_SetScale(Scale.X + 0.002, Scale.Y + 0.002);
			A_FadeOut(0.01);
		}
		Loop;
	}
}

class Mourning_Radiation_Field_Trail : Mourning_Radiation_Field
{
	Default
	{
		Alpha 0.3;
		-FLOATBOB
	}
	
	States
	{
	Spawn:
		RADF A 1 Bright {
			A_SetScale(Scale.X + 0.005);
			A_FadeOut(0.05);
		}
		Loop;
	}
}