ACTOR ThunderSpawner : FastProjectile
{
	Radius 3
	Height 3
	Projectile
	Damage 0
	Speed 300
	+EXPLODEONWATER
	+NOGRAVITY
	+THRUACTORS
	+SKYEXPLODE
	+DONTREFLECT
	States
	{
	Spawn:
	TNT1 A 1
	Loop
	Death:
	TNT1 A 0 A_PlaySound("Thunderstruck/Bolt")
	TNT1 A 1 A_CustomMissile("ThunderFromSky",0,0,0,CMF_AIMDIRECTION|CMF_TRACKOWNER) //Each time I use custommissile to spawn anything makes me feel like I am slaughtering poor code... it just ain't right, but if I want to make this thing spawn properly on goddamn ceiling... I have no other choice, I guess.
	Stop
	}
}

ACTOR ThunderFromSky
{
	Radius 2
	Height 2
	Projectile
	Damage 0
	Speed 0
	+SPAWNCEILING
	+CEILINGHUGGER //Just in case.
	+NOINTERACTION
	+NOCLIP
	States
	{
	Spawn:
	TNT1 A 0
	TNT1 A 1 A_CustomMissile("LightningFall",0,0,0,CMF_AIMDIRECTION|CMF_TRACKOWNER) //I'd use spawnitemex here, but I don't trust the transferpointers in concjuction with custommissiles...
	Stop
	}
}

ACTOR LightningFall
{
	Radius 2
	Height 2
	Projectile
	Obituary "%o was violently zapped by %k's call for thunder."
	Damage 5
	-NOGRAVITY
	+RIPPER
	+BLOODLESSIMPACT
	+DONTREFLECT
	Gravity 12
	DamageType Lightning
	States
	{
	Spawn:
	TNT1 AAA 0 A_SpawnItemEx("LightningEffect1",random(4,-4),random(4,-4),random(15,-15),frandom(0.025,0.05),frandom(0.025,0.05),frandom(-1.0,0.0),frandom(0.0,360.0),SXF_CLIENTSIDE,20)
	TNT1 AA 0 A_SpawnItemEx("LightningEffect2",random(4,-4),random(4,-4),random(15,-15),frandom(0.025,0.05),frandom(0.025,0.05),frandom(-1.0,0.0),frandom(0.0,360.0),SXF_CLIENTSIDE,20)
	TNT1 A 1
	Loop
	Death:
	TNT1 A 0 A_CheckFloor("Watercheck")
	TNT1 A 0 A_Explode(250,192,0)
	TNT1 AA 0 A_SpawnItemEx("TheLightning2",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
	TNT1 AAA 0 A_SpawnItemEx("LightningEffect1",random(4,-4),random(4,-4),random(15,-15),frandom(0.025,0.05),frandom(0.025,0.05),frandom(-1.0,0.0),frandom(0.0,360.0),SXF_CLIENTSIDE,20)
	TNT1 AAA 0 A_SpawnItemEx("LightningEffect2",random(4,-4),random(4,-4),random(15,-15),frandom(0.025,0.05),frandom(0.025,0.05),frandom(-1.0,0.0),frandom(0.0,360.0),SXF_CLIENTSIDE,20)
	TNT1 A 0 A_SpawnItemEx("LightningCloudSpawner",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
	TNT1 A 0 A_SpawnItemEx("LightningParticleSpawner",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
	TNT1 A 0 A_SpawnItemEx("LightningBlast1",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
	TNT1 A 0 A_SpawnItemEx("LightningBlast2",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
	Stop
	Watercheck:
	TNT1 A 0 A_JumpIf(CallACS("WaterBollocks") == true, "Supercharge")
	Goto Death+1
	Supercharge:
	TNT1 A 0 A_Explode(400,256,0)
	TNT1 AAAAAAA 0 A_SpawnItemEx("TheLightning",random(25,-25),random(25,-25),random(25,-25),0,0,0,0,SXF_CLIENTSIDE)
	TNT1 AAA 0 A_SpawnItemEx("LightningEffect1",random(4,-4),random(4,-4),random(15,-15),frandom(0.025,0.05),frandom(0.025,0.05),frandom(-1.0,0.0),frandom(0.0,360.0),SXF_CLIENTSIDE,20)
	TNT1 AAA 0 A_SpawnItemEx("LightningEffect2",random(4,-4),random(4,-4),random(15,-15),frandom(0.025,0.05),frandom(0.025,0.05),frandom(-1.0,0.0),frandom(0.0,360.0),SXF_CLIENTSIDE,20)
	TNT1 A 0 A_SpawnItemEx("LightningCloudSpawnerSupercharged",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
	TNT1 A 0 A_SpawnItemEx("LightningParticleSpawnerSupercharged",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
	TNT1 A 0 A_SpawnItemEx("LightningBlast1",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
	TNT1 A 0 A_SpawnItemEx("LightningBlast2",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
	TNT1 AAAA 2 A_SpawnItemEx("LightningBlast3",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
	Stop
	}
}

ACTOR LightningEffect1
{
	+NOINTERACTION
	+NOGRAVITY
	+FORCEYBILLBOARD
	+NOTONAUTOMAP
	Scale 0
	Alpha 0.9
	Renderstyle Add
	States
	{
	Spawn:
	TNT1 AA 0 A_SetScale(ScaleX + frandom(0.6,1.0))
	TNT1 A 0 A_Jump(256,"SpriteA","SpriteB","SpriteC","SpriteD")
	SpriteA:
	LITA A 0 A_Jump(256,"Main")
	SpriteB:
	LITA B 0 A_Jump(256,"Main")
	SpriteC:
	LITA C 0 A_Jump(256,"Main")
	SpriteD:
	LITA D 0 A_Jump(256,"Main")
	Main:
	"####" "#" 1 Bright A_FadeOut(frandom(0.08,0.05))
	Loop
	}
}

ACTOR LightningEffect2
{
	+NOINTERACTION
	+NOGRAVITY
	+FORCEYBILLBOARD
	+NOTONAUTOMAP
	Scale 0
	Alpha 0.9
	Renderstyle Add
	States
	{
	Spawn:
	TNT1 AA 0 A_SetScale(ScaleX + frandom(0.6,1.0))
	Main:
	LITA ABCD 2 Bright A_FadeOut(frandom(0.08,0.05))
	Loop
	}
}

ACTOR LightningBlast1
{
	+NOINTERACTION
	+NOGRAVITY
	+NOTONAUTOMAP
	var int user_count;
	States
	{
	Spawn:
	TNT1 BB 0 A_SetUserVar("user_count",10)
	Main:
	TNT1 B 0 A_SetUserVar("user_count", user_count - 1)
	TNT1 B 0 A_JumpIf(user_count <= 0,"Dopefish")
	TNT1 B 0 A_SpawnItemEx("LightningEffect3",random(30,-30),random(30,-30),random(45,0),frandom(0.5,0.7),frandom(0.5,0.7),frandom(0.5,0.7),random(0,359),SXF_CLIENTSIDE)
	Loop
	Dopefish:
	TNT1 A 15
	Stop
	}
}

ACTOR LightningBlast2
{
	+NOINTERACTION
	+NOGRAVITY
	+NOTONAUTOMAP
	var int user_count;
	States
	{
	Spawn:
	TNT1 AA 0 A_SetUserVar("user_count",15)
	Main:
	TNT1 A 0 A_SetUserVar("user_count", user_count - 1)
	TNT1 A 0 A_JumpIf(user_count <= 0,"NULL")
	TNT1 A 1 A_SpawnItemEx("LightningEffect3",random(15,-15),random(15,-15),random(25,0),frandom(0.5,0.7),frandom(0.5,0.7),frandom(0.5,0.7),random(0,359),SXF_CLIENTSIDE)
	Loop
	}
}

ACTOR LightningBlast3
{
	+NOINTERACTION
	+NOGRAVITY
	+NOTONAUTOMAP
	var int user_count;
	States
	{
	Spawn:
	TNT1 BB 0 A_SetUserVar("user_count",50)
	Main:
	TNT1 B 0 A_SetUserVar("user_count", user_count - 1)
	TNT1 B 0 A_JumpIf(user_count <= 0,"Dopefish")
	TNT1 B 0 A_SpawnItemEx("LightningEffect3",random(40,-40),random(40,-40),random(25,0),frandom(6.5,7.0),frandom(6.5,7.0),frandom(2.5,1.7),random(0,359),SXF_CLIENTSIDE)
	Loop
	Dopefish:
	TNT1 A 1
	Stop
	}
}

ACTOR LightningEffect3
{
	+NOINTERACTION
	+NOGRAVITY
	+NOTONAUTOMAP
	Scale 0
	Alpha 0.8
	Renderstyle Add
	States
	{
	Spawn:
	TNT1 AA 0 A_SetScale(ScaleX + frandom(1.5,1.0))
	Main:
	LITP AABBCCDDEEFF 1 Bright A_FadeOut(frandom(0.025,0.075))
	Stop
	}
}

ACTOR ThunderSpawner2
{
	Radius 6
	Height 6
	Projectile
	Damage 0
	Speed 300
	+EXPLODEONWATER
	+NOGRAVITY
	States
	{
	Spawn:
	TNT1 A 1
	Loop
	Death:
	TNT1 A 0 A_PlaySound("Thunderstruck/Bolt")
	TNT1 AAAAAA random(1,3) A_CustomMissile("ThunderizerFromSky",0,0,random(0,360),CMF_AIMDIRECTION|CMF_TRACKOWNER) //Each time I use custommissile to spawn anything makes me feel like I am slaughtering poor code... it just ain't right, but if I want to make this thing spawn properly on goddamn ceiling... I have no other choice, I guess.
	Stop
	}
}

ACTOR ThunderizerFromSky
{
	Radius 4
	Height 4
	Projectile
	Damage 0
	Speed 15
	+SPAWNCEILING
	+CEILINGHUGGER //Just in case.
	+NOINTERACTION
	+NOCLIP
	States
	{
	Spawn:
	TNT1 A random(3,6)
	TNT1 A 1 A_CustomMissile("LightningFall",0,0,0,CMF_AIMDIRECTION|CMF_TRACKOWNER) //I'd use spawnitemex here, but I don't trust the transferpointers in concjuction with custommissiles...
	Stop
	}
}

//Supercharge stuff

ACTOR TheLightning
{
	+NOTONAUTOMAP
	+NOINTERACTION
	+NOGRAVITY
	Renderstyle Add
	Alpha 0.99
	States
	{
	Spawn:
	TNT1 AA 0 A_SetScale(ScaleX + frandom(0.4,0.6))
	TNT1 A 0 A_Jump(256,"SpriteA","SpriteB","SpriteC","SpriteD","SpriteE","SpriteF","SpriteG","SpriteH")
	SpriteA:
	BLIT I 0 A_Jump(256,"Main")
	SpriteB:
	BLIT J 0 A_Jump(256,"Main")
	SpriteC:
	BLIT K 0 A_Jump(256,"Main")
	SpriteD:
	BLIT L 0 A_Jump(256,"Main")
	SpriteE:
	BLIT M 0 A_Jump(256,"Main")
	SpriteF:
	BLIT N 0 A_Jump(256,"Main")
	SpriteG:
	BLIT O 0 A_Jump(256,"Main")
	SpriteH:
	BLIT P 0 A_Jump(256,"Main")
	Main:
	"####" "#" 2 Bright A_Jump(92,"Fade")
	Loop
	Fade:
	"####" "#" 1 Bright A_FadeOut(frandom(0.1,0.15))
	Loop
	}
}

ACTOR TheLightning2 : TheLightning
{
	Scale 0
	States
	{
	Spawn:
	TNT1 AA 0 A_SetScale(ScaleX + frandom(1.0,0.7))
	TNT1 A 0 A_Jump(256,"SpriteA","SpriteB","SpriteC","SpriteD","SpriteE","SpriteF","SpriteG","SpriteH")
	Loop
	}
}

ACTOR LightningCloud : TheLightning
{
	Scale 0
	States
	{
	Spawn:
	TNT1 AA 0 A_SetScale(ScaleX + frandom(1.0,1.1))
	Sprite:
	YPRT A 0 //BPRT C 0
	Main:
	"####" "#" 0 A_JumpIf(ScaleX <= 0,"NULL")
	"####" "#" 0 A_SetScale(ScaleX - frandom(0.005,0.003))
	"####" "#" 0 A_Jump(64,"Main")
	"####" "#" 1 Bright A_FadeOut(frandom(0.03,0.02))
	Loop
	}
}

ACTOR LightningCloudSpawner
{
	+NOINTERACTION
	+NOGRAVITY
	+NOTONAUTOMAP
	var int user_count;
	States
	{
	Spawn:
	TNT1 BB 0 A_SetUserVar("user_count",20)
	Main:
	TNT1 B 0 A_SetUserVar("user_count", user_count - 1)
	TNT1 B 0 A_JumpIf(user_count <= 0,"Dopefish")
	TNT1 A 0 A_SpawnItemEx("LightningCloud",random(30,-30),random(30,-30),random(35,0),frandom(-1.0,1.0),frandom(1.0,1.0),frandom(0.3,1.0),random(0,359),SXF_CLIENTSIDE,40)
	Loop
	Dopefish:
	TNT1 A 15
	Stop
	}
}

ACTOR LightningCloudSpawnerSupercharged
{
	+NOINTERACTION
	+NOGRAVITY
	+NOTONAUTOMAP
	var int user_count;
	States
	{
	Spawn:
	TNT1 BB 0 A_SetUserVar("user_count",70)
	Main:
	TNT1 B 0 A_SetUserVar("user_count", user_count - 1)
	TNT1 B 0 A_JumpIf(user_count <= 0,"Dopefish")
	TNT1 B 0 A_SpawnItemEx("LightningCloud",random(70,-70),random(70,-70),random(55,-15),frandom(-1.7,1.7),frandom(1.7,1.7),frandom(0.3,1.5),random(0,359),SXF_CLIENTSIDE,40)
	Loop
	Dopefish:
	TNT1 A 15
	Stop
	}
}

ACTOR LightningParticle : TheLightning
{
	var int user_count;
	Scale 0
	States
	{
	Spawn:
	TNT1 AA 0 A_SetScale(ScaleX + frandom(0.1,0.08))
	TNT1 A 0 A_SetUserVar("user_count",70)
	Sprite:
	YPRT A 0 //BPRT C 0
	Main:
	"####" "#" 0 A_JumpIf(ScaleX <= 0,"NULL")
	"####" "#" 0 A_Jump(128,2)
	"####" "#" 0 A_SetUserVar("user_count",user_count - 1)
	"####" "#" 0 A_ChangeVelocity(0,0,frandom(-0.1,-0.15),0)
	"####" "#" 0 A_SetScale(ScaleX - frandom(0.001,0.002))
	"####" "#" 0 A_JumpIf(user_count <= 0, "Sparta")
	"####" "#" 1 Bright
	Loop
	Sparta:
	"####" "#" 1 Bright A_FadeOut(frandom(0.02,0.05))
	Loop
	}
}

ACTOR LightningParticleSpawner
{
	+NOINTERACTION
	+NOGRAVITY
	+NOTONAUTOMAP
	var int user_count;
	States
	{
	Spawn:
	TNT1 BB 0 A_SetUserVar("user_count",20)
	Main:
	TNT1 B 0 A_SetUserVar("user_count", user_count - 1)
	TNT1 B 0 A_JumpIf(user_count <= 0,"Dopefish")
	TNT1 B 0 A_SpawnItemEx("LightningParticle",random(10,-10),random(10,-10),random(10,-30),frandom(2.2,2.0),frandom(2.2,2.0),frandom(2.2,5.0),random(0,359),SXF_CLIENTSIDE,40)
	Loop
	Dopefish:
	TNT1 A 1
	Stop
	}
}

ACTOR LightningParticleSpawnerSupercharged
{
	+NOINTERACTION
	+NOGRAVITY
	+NOTONAUTOMAP
	var int user_count;
	States
	{
	Spawn:
	TNT1 BB 0 A_SetUserVar("user_count",60)
	Main:
	TNT1 B 0 A_SetUserVar("user_count", user_count - 1)
	TNT1 B 0 A_JumpIf(user_count <= 0,"Dopefish")
	TNT1 B 0 A_SpawnItemEx("LightningParticle",random(20,-20),random(20,-20),random(10,-30),frandom(2.7,2.7),frandom(2.7,2.7),frandom(2.9,5.7),random(0,359),SXF_CLIENTSIDE,40)
	Loop
	Dopefish:
	TNT1 A 1
	Stop
	}
}

//Tomed

ACTOR TomedThunderSpawner : ThunderSpawner
{
	States
	{
	Spawn:
	TNT1 A 1
	Loop
	Death:
	TNT1 A 0 A_PlaySound("Thunderstruck/Bolt")
	TNT1 A 1 A_CustomMissile("TomedThunderFromSky",0,0,0,CMF_AIMDIRECTION|CMF_TRACKOWNER) //Each time I use custommissile to spawn anything makes me feel like I am slaughtering poor code... it just ain't right, but if I want to make this thing spawn properly on goddamn ceiling... I have no other choice, I guess.
	Stop
	}
}

ACTOR TomedThunderFromSky : ThunderFromSky
{
	States
	{
	Spawn:
	TNT1 A 0
	TNT1 A 1 A_CustomMissile("TomedLightningFall",0,0,0,CMF_AIMDIRECTION|CMF_TRACKOWNER) //I'd use spawnitemex here, but I don't trust the transferpointers in concjuction with custommissiles...
	Stop
	}
}

ACTOR TomedLightningFall : LightningFall
{
	Damage 10
	Gravity 9
	States
	{
	Spawn:
	TNT1 AA 0 A_SpawnItemEx("LightningEffect1",40,0,0,frandom(0.025,0.05),frandom(0.025,0.05),frandom(-1.0,0.0),240,SXF_CLIENTSIDE,0)
	TNT1 AA 0 A_SpawnItemEx("LightningEffect1",40,0,0,frandom(0.025,0.05),frandom(0.025,0.05),frandom(-1.0,0.0),120,SXF_CLIENTSIDE,0)
	TNT1 AA 0 A_SpawnItemEx("LightningEffect1",40,0,0,frandom(0.025,0.05),frandom(0.025,0.05),frandom(-1.0,0.0),0,SXF_CLIENTSIDE,0)
	TNT1 AA 0 A_SpawnItemEx("LightningEffect2",40,0,0,frandom(0.025,0.05),frandom(0.025,0.05),frandom(-1.0,0.0),240,SXF_CLIENTSIDE,0)
	TNT1 AA 0 A_SpawnItemEx("LightningEffect2",40,0,0,frandom(0.025,0.05),frandom(0.025,0.05),frandom(-1.0,0.0),120,SXF_CLIENTSIDE,0)
	TNT1 AA 0 A_SpawnItemEx("LightningEffect2",40,0,0,frandom(0.025,0.05),frandom(0.025,0.05),frandom(-1.0,0.0),0,SXF_CLIENTSIDE,0)
	TNT1 A 0 A_SetAngle(20 + angle)
	TNT1 A 1 A_SpawnItemEx("TheLightning3",random(5,-5),random(5,-5),random(5,-5),frandom(0.05,0.075),frandom(0.05,0.075),frandom(0.05,0.075),frandom(0.0,360.0),SXF_CLIENTSIDE,0)
	Loop
	Death:
	TNT1 A 0 A_CheckFloor("Watercheck")
	TNT1 A 0 A_Explode(500,256,0)
	TNT1 AAAAAAA 0 A_SpawnItemEx("TheLightning",random(25,-25),random(25,-25),random(25,-25),0,0,0,0,SXF_CLIENTSIDE)
	TNT1 A 0 A_SpawnItemEx("LightningCloudSpawnerSupercharged",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
	TNT1 A 0 A_SpawnItemEx("LightningParticleSpawnerSupercharged",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
	TNT1 AA 0 A_SpawnItemEx("LightningBlast1",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
	TNT1 AA 0 A_SpawnItemEx("LightningBlast2",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
	TNT1 AAAA 2 A_SpawnItemEx("LightningBlast3",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
	Stop
	Watercheck:
	TNT1 A 0 A_JumpIf(CallACS("WaterBollocks") == true, "Ultracharge")
	Goto Death+1
	Ultracharge:
	TNT1 A 0 A_Explode(800,384,0)
	TNT1 AAAAAAAAAAA 0 A_SpawnItemEx("TheLightning",random(55,-45),random(55,-55),random(55,-55),0,0,0,0,SXF_CLIENTSIDE)
	TNT1 A 0 A_SpawnItemEx("LightningCloudSpawnerUltracharged",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
	TNT1 A 0 A_SpawnItemEx("LightningParticleSpawnerUltracharged",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
	TNT1 AA 0 A_SpawnItemEx("LightningBlast1",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
	TNT1 AA 0 A_SpawnItemEx("LightningBlast2",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
	TNT1 AAAA 2 A_SpawnItemEx("LightningBlast3",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
	Stop
	}
}

ACTOR TheLightning3 : TheLightning
{
	States
	{
	Spawn:
	TNT1 AA 0 A_SetScale(ScaleX + frandom(0.3,0.4))
	TNT1 A 0 A_Jump(256,"SpriteA","SpriteB","SpriteC","SpriteD","SpriteE","SpriteF","SpriteG","SpriteH")
	Goto SpriteA
	Main:
	"####" "#" 2 Bright A_Jump(92,"Fade")
	Loop
	Fade:
	"####" "#" 0 A_SetScale(ScaleX - 0.05, ScaleX)
	"####" "#" 1 Bright A_FadeOut(frandom(0.1,0.15))
	"####" "#" 0 A_JumpIf(ScaleX <= 0, "NULL")
	Loop
	}
}

ACTOR LightningCloudSpawnerUltracharged
{
	+NOINTERACTION
	+NOGRAVITY
	var int user_count;
	States
	{
	Spawn:
	TNT1 BB 0 A_SetUserVar("user_count",130)
	Main:
	TNT1 B 0 A_SetUserVar("user_count", user_count - 1)
	TNT1 B 0 A_JumpIf(user_count <= 0,"Dopefish")
	TNT1 B 0 A_SpawnItemEx("LightningCloud",random(110,-110),random(110,-110),random(75,-15),frandom(-1.7,1.7),frandom(1.7,1.7),frandom(0.3,1.5),random(0,359),SXF_CLIENTSIDE,40)
	Loop
	Dopefish:
	TNT1 A 15
	Stop
	}
}

ACTOR LightningParticleSpawnerUltracharged
{
	+NOINTERACTION
	+NOGRAVITY
	var int user_count;
	States
	{
	Spawn:
	TNT1 BB 0 A_SetUserVar("user_count",80)
	Main:
	TNT1 B 0 A_SetUserVar("user_count", user_count - 1)
	TNT1 B 0 A_JumpIf(user_count <= 0,"Dopefish")
	TNT1 B 0 A_SpawnItemEx("LightningParticle",random(35,-35),random(35,-35),random(20,-30),frandom(2.7,2.7),frandom(2.7,2.7),frandom(2.9,5.7),random(0,359),SXF_CLIENTSIDE,40)
	Loop
	Dopefish:
	TNT1 A 1
	Stop
	}
}
