class HellShellLauncher : SquareWeapon
{
	Default
	{
		+WEAPON.NOAUTOFIRE;
		Weapon.SelectionOrder 950;
		Weapon.AmmoType "HellShellAmmo";
		Weapon.AmmoGive 5;
		Weapon.AmmoUse 1;
		Tag "$TAG_HELLSHELL";
		Inventory.PickupMessage "$GOTHELLSHELLGUN";
		Obituary "$OB_HELLSHELL";
	}
	States
	{
	Spawn:
		HLSL A -1;
		Stop;
	Ready:
		HELL A 0 A_JumpIfInventory("HellShellAmmo", 2, "NormalReady");
		Goto LastReady;
	NormalReady:
		HELL A 1 A_WeaponReady;
		HELL A 0 A_JumpIfInventory("HellShellAmmo", 2, "NormalReady");
		// Fall Through
	LastReady:
		HELL I 0 A_JumpIfInventory("HellShellAmmo", 2, "AlmostNormalReady");
		HELL I 1 A_WeaponReady();
		Loop;
	AlmostNormalReady:
		HELL J 0 A_PlaySound("weapons/shotreload");
		HELL J 1 Offset(0,36);
		HELL J 1 Offset(0,41);
		HELL J 1 Offset(0,39);
		HELL J 1 Offset(0,36);
		HELL K 1 Offset(0,35);
		HELL K 1 Offset(0,34);
		HELL K 1 Offset(0,33);
		HELL K 1 Offset(0,32);
		Goto NormalReady;
	Deselect:
		HELL A 0 A_JumpIfInventory("HellShellAmmo", 2, "NormalDeselect");
		Goto LastDeselect;
	NormalDeselect:
		HELL A 1 A_Lower();
		HELL A 0 A_Lower();
		Loop;
	LastDeselect:
		HELL I 1 A_Lower();
		HELL I 0 A_Lower();
		Loop;
	Select:
		HELL A 0 A_JumpIfInventory("HellShellAmmo", 2, "NormalSelect");
		Goto LastSelect;
	NormalSelect:
		HELL A 1 A_Raise();
		HELL A 0 A_Raise();
		Loop;
	LastSelect:
		HELL I 1 A_Raise();
		HELL I 0 A_Raise();
		Loop;
	Fire:
		HELL A 0 A_JumpIfInventory("HellShellAmmo", 2, "NormalFire");
		Goto LastFire;
	NormalFire:
		HELL A 1 Offset(0,32);
		HELL A 1 Offset(0,33);
		HELL A 1 Offset(0,34);
		HELL A 1 Offset(0,35);
		HELL A 1 Offset(0,36);
		HELL B 0 A_GunFlash();
		HELL B 1 Bright Offset(0,34) A_FireProjectile("HellShell", 0, 1, 0, 1, -15);
		HELL B 1 Bright Offset(0,36);
		HELL C 1 Bright Offset(0,39);
		HELL C 0 A_CheckReload();
		HELL C 1 Bright Offset(0,44);
		HELL D 1 Bright Offset(0,50);
		HELL D 1 Bright Offset(0,49);
		HELL A 1 Offset(0,47);
		HELL A 0 A_JumpIfInventory("HellShellAmmo", 2, "NormalLoadShell");
		Goto LastLoadShell;
	LastFire:
		HELL I 1 Offset(0,32);
		HELL I 1 Offset(0,33);
		HELL I 1 Offset(0,34);
		HELL I 1 Offset(0,35);
		HELL I 1 Offset(0,36);
		HELL L 0 A_GunFlash();
		HELL L 1 Bright Offset(0,34) A_FireProjectile("HellShell", 0, 1, 0, 1, -15);
		HELL L 1 Bright Offset(0,36);
		HELL M 1 Bright Offset(0,39);
		HELL M 0 A_CheckReload();
		HELL M 1 Bright Offset(0,44);
		HELL N 1 Bright Offset(0,50);
		HELL N 1 Bright Offset(0,49);
		HELL I 1 Offset(0,47);
		HELL I 0 A_JumpIfInventory("HellShellAmmo", 2, "NormalLoadShell");
		Goto LastLoadShell;
	NormalLoadShell:
		HELL A 0 A_PlaySound("weapons/shotreload");
		HELL E 1 Offset(0,44);
		HELL E 1 Offset(0,41);
		HELL E 1 Offset(0,39);
		HELL E 1 Offset(0,36);
		HELL F 1 Offset(0,35);
		HELL F 1 Offset(0,34);
		HELL F 1 Offset(0,33);
		HELL F 1 Offset(0,32);
		HELL AAAAA 2;
		HELL A 0 A_Refire();
		Goto Ready;
	LastLoadShell:
		HELL A 0 A_PlaySound("weapons/shotreload");
		HELL G 1 Offset(0,44);
		HELL G 1 Offset(0,41);
		HELL G 1 Offset(0,39);
		HELL G 1 Offset(0,36);
		HELL H 1 Offset(0,35);
		HELL H 1 Offset(0,34);
		HELL H 1 Offset(0,33);
		HELL H 1 Offset(0,32);
		HELL IIIII 2;
		HELL I 0 A_Refire();
		Goto Ready;
	ResetSprite:
		HELL A 0;
		Goto Reraise;
	}
}

class HellShell : SquareActor
{
	Default
	{
		Projectile;
		-NOGRAVITY;
		Radius 8;
		Height 16;
		Speed 30;
		Damage 20;
		SeeSound "weapons/hellshot";
		DeathSound "weapons/rocklx";
		Decal 'ShellScorch';
		Gravity 0.17;
		DamageType 'HellDamage';
	}
	States
	{
	Spawn:
		TNT1 A 2; // Blank for a tick for presentation purposes.
		EXPS A -1;
		Stop;
	Death:
		MISL B 0 A_Quake(1, 25, 0, 500, "blank");
		MISL B 0 A_SetTranslucent(1.0,1);
		MISL B 0 A_NoGravity;
		MISL B 0 Bright A_PlaySound("weapons/rocklx");
		MISL B 4 Bright A_Explode(90, 90, XF_HURTSOURCE);
		MISL CDEF 4 Bright A_SpawnProjectile("HellShellExploder", 8, 0, random(0,360), CMF_AIMDIRECTION | CMF_TRACKOWNER, random(-50,50));
		Stop;
	}
}

class HellShellExploder : SquareActor
{
	Default
	{
		Radius 4;
		Height 8;
		Speed 20;
		Damage 0;
		DamageType 'HellDamage';
		ReactionTime 1;
		Alpha 1.0;
		RenderStyle 'Add';

		Projectile;
		+THRUACTORS;
		+NODAMAGETHRUST;
	}
	States
	{
	Spawn:
		TNT1 A 2 A_CountDown();
		Loop;
	Death:
		MISL B 1 Bright;
		MISL B 3 Bright A_PlaySound("weapons/rocklx");
		MISL C 3 Bright A_Explode(90, 90, XF_HURTSOURCE);
		MISL D 4 Bright A_SpawnItemEx("LightSmokeRandom", random(-15,15), random(-15,15), 0, 0, 0, random(1, 4) * 0.5, 0, 0, 96);
		MISL E 4 Bright A_SpawnItemEx("LightSmokeRandom", random(-15,15), random(-15,15), 0, 0, 0, random(1, 4) * 0.5, 0, 0, 96);
		MISL F 4 Bright A_SpawnItemEx("LightSmokeRandom", random(-15,15), random(-15,15), 0, 0, 0, random(1, 4) * 0.5, 0, 0, 96);
		Stop;
	}
}
