// Shamelessly stolen from RGA2

actor ExplosionSmall
{
  RenderStyle Add
  alpha 0.9
  +RANDOMIZE
  //+NOCLIP
  +NOINTERACTION
  PROJECTILE
  //-MISSILE
  Speed 1
  Damage 0
  Scale 0.7
  +FORCEXYBILLBOARD
  +CLIENTSIDEONLY
  states
  {
  Spawn:
    TNT1 A 1
    TNT1 A 0 A_Jump(256,"Spawn1","Spawn2","Spawn3","Spawn4","Spawn5")
  Spawn1:
    EXP1 ABCDEFGHIJ 3 bright
    stop
  Spawn2:
    EXP2 ABCDEFG 5 bright
    stop
  Spawn3:
    EXP3 ABCDEFG 5 bright
    stop
  Spawn4:
    EXP4 ABCDEFGH 4 bright
    stop
  Spawn5:
    EXP5 ABCDEFGHIJK 3 bright
    stop
  }
}
actor ExplosionSmall2 : ExplosionSmall
{
  Scale 0.5
}
actor ExplosionSmall3 : ExplosionSmall
{
  Scale 0.35
}

actor ExplosionSmokePuff
{
  RenderStyle Add
  alpha 0.95
  -RANDOMIZE
  //+NOCLIP
  +NOINTERACTION
  PROJECTILE
  Speed 2
  Damage 0
  Scale 4.0
  +FORCEXYBILLBOARD
  +CLIENTSIDEONLY
  states
  {
  Spawn:
    TNT1 A 1
    TNT1 A 0 A_Jump(256,"Spawn1","Spawn2","Spawn3","Spawn4","Spawn5","Spawn6")
  Spawn1:
    SMK1 ABCDEFGHIJKLMNOP 2 bright A_FadeOut(0.05)
    stop
  Spawn2:
    SMK2 ABCDEFGHIJKLMNOP 2 bright A_FadeOut(0.05)
    stop
  Spawn3:
    SMK3 ABCDEFGHIJKLMNOP 2 bright A_FadeOut(0.05)
    stop
  Spawn4:
    SMK4 ABCDEFGHIJKLMNOP 2 bright A_FadeOut(0.05)
    stop
  Spawn5:
    SMK5 ABCDEFGHIJKLMNOP 2 bright A_FadeOut(0.05)
    stop
  Spawn6:
    SMK6 ABCDEFGHIJKLMNOP 2 bright A_FadeOut(0.05)
    stop
  }
}
actor ExplosionSmokePuff2 : ExplosionSmokePuff
{
  alpha 0.85
  Scale 2.75
}


actor ExplosionMain
{
  RenderStyle Add
  alpha 0.9
  +RANDOMIZE
  +NOGRAVITY
  Scale 1.0
  Damage 0
  +FORCEXYBILLBOARD
  DamageType ExplosiveDamage
  states
  {
  Spawn:
    EXP1 AA 0 A_SpawnItemEx("ExplosionSmall",random(-8,8),random(-8,8),random(1,8),random(-2,2),random(-2,2),random(0,3),0,128,0)
    EXP1 A 0 A_PlayWeaponSound("grenade/boom")
    EXP1 A 0 A_PlaySoundEx("grenade/farboom","SoundSlot6")
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff",random(-8,8),random(-8,8),random(1,8),2,0,0,45,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff",random(-8,8),random(-8,8),random(1,8),2,0,0,90,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff",random(-8,8),random(-8,8),random(1,8),2,0,0,135,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff",random(-8,8),random(-8,8),random(1,8),2,0,0,180,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff",random(-8,8),random(-8,8),random(1,8),2,0,0,225,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff",random(-8,8),random(-8,8),random(1,8),2,0,0,270,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff",random(-8,8),random(-8,8),random(1,8),2,0,0,315,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff",random(-8,8),random(-8,8),random(1,8),2,0,0,360,128,0)
    EXP1 AB 1 bright
    EXP1 BB 0 A_SpawnItemEx("ExplosionSmall",random(-8,8),random(-8,8),random(1,8),random(-2,2),random(-2,2),random(0,3),0,128,0)
    EXP1 CDEF 1 bright
    EXP1 FF 0 A_SpawnItemEx("ExplosionSmall",random(-8,8),random(-8,8),random(1,8),random(-2,2),random(-2,2),random(0,3),0,128,0)
    EXP1 GHIJ 1 bright
    EXP3 AB 1 bright
    EXP3 BB 0 A_SpawnItemEx("ExplosionSmall",random(-8,8),random(-8,8),random(1,8),random(-2,2),random(-2,2),random(0,3),0,128,0)
    EXP3 CDEF 1 bright
    EXP3 FF 0 A_SpawnItemEx("ExplosionSmall",random(-8,8),random(-8,8),random(1,8),random(-2,2),random(-2,2),random(0,3),0,128,0)
    EXP3 GHI 1 bright
    stop
  }
}

actor ExplosionMain2 : ExplosionMain
{
  Scale 0.8
  states
  {
  Spawn:
	EXP1 A 0
	TNT1 A 0 A_Explode((100),170)
    EXP1 AA 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP1 A 0 A_PlayWeaponSound("type97/explode")
    EXP1 A 0 A_PlaySoundEx("type97/distant","SoundSlot6")
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,45,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,90,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,135,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,180,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,225,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,270,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,315,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,360,128,0)
    EXP1 AB 1 bright
    EXP1 BB 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP1 CDEF 1 bright
    EXP1 FF 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP1 GHIJ 1 bright
    EXP3 AB 1 bright
    EXP3 BB 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP3 CDEF 1 bright
    EXP3 FF 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP3 GHI 1 bright
    stop
  }
}

actor M79Explosion : ExplosionMain
{
  Scale 0.8
  states
  {
  Spawn:
	EXP1 A 0
	TNT1 A 0 A_Explode(200,80)
	EXP1 A 0 A_SpawnItemEx("QExplosion",0,0,0)
    //EXP1 AA 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP1 A 0 A_PlayWeaponSound("type97/explode")
    EXP1 A 0 A_PlaySoundEx("type97/distant","SoundSlot6")
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,45,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,90,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,135,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,180,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,225,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,270,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,315,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,360,128,0)
    EXP1 ABCDEFGHIJ 1 bright
    stop
  }
}

actor DynamiteExplosion : ExplosionMain
{
  Scale 0.8
  states
  {
  Spawn:
	EXP1 A 0
	TNT1 A 0 A_Explode(500,120)
	EXP1 A 0 A_SpawnItemEx("QExplosion",0,0,0)
    EXP1 AA 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP1 A 0 A_PlayWeaponSound("dynamite/boom")
    EXP1 A 0 A_PlaySoundEx("dynamite/distant","SoundSlot6")
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,45,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,90,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,135,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,180,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,225,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,270,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,315,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,360,128,0)
    EXP1 AB 1 bright
    EXP1 BB 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP1 CDEF 1 bright
    EXP1 FF 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP1 GHIJ 1 bright
    EXP3 AB 1 bright
    EXP3 BB 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP3 CDEF 1 bright
    EXP3 FF 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP3 GHI 1 bright
    stop
  }
}

actor C4Explosion : ExplosionMain
{
  Scale 0.8
  states
  {
  Spawn:
	EXP1 A 0
	TNT1 A 0 Radius_Quake(6,90,0,16,0)
	TNT1 A 0 A_Explode(400,80)
	EXP1 A 0 A_SpawnItemEx("QExplosion",0,0,0)
    EXP1 AA 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP1 A 0 A_PlayWeaponSound("c4/boom")
    EXP1 A 0 A_PlaySoundEx("type97/distant","SoundSlot6")
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,45,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,90,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,135,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,180,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,225,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,270,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,315,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,360,128,0)
    EXP1 AB 1 bright
    EXP1 BB 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP1 CDEF 1 bright
    EXP1 FF 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP1 GHIJ 1 bright
    EXP3 AB 1 bright
    EXP3 BB 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP3 CDEF 1 bright
    EXP3 FF 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP3 GHI 1 bright
    stop
  }
}

actor ExplosionRoast : ExplosionMain
{
  Obituary "%o let \cIGeneral Roasterock \c-get %h."
  Scale 0.8
  states
  {
  Spawn:
	EXP1 A 0
	TNT1 A 0 A_Explode((100),170)
    EXP1 AA 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP1 A 0 A_PlayWeaponSound("roaster/boom")
    EXP1 A 0 A_PlaySoundEx("roaster/distant","SoundSlot6")
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,45,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,90,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,135,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,180,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,225,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,270,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,315,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,360,128,0)
    EXP1 AB 1 bright
    EXP1 BB 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP1 CDEF 1 bright
    EXP1 FF 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP1 GHIJ 1 bright
    EXP3 AB 1 bright
    EXP3 BB 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP3 CDEF 1 bright
    EXP3 FF 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP3 GHI 1 bright
    stop
  }
}

actor ExplosionRoast2 : ExplosionRoast
{
  Scale 0.8
  Obituary "%o let \cIGeneral Roasterock \c-get %h."
  states
  {
  Spawn:
	EXP1 A 0
	TNT1 A 0 A_Explode((100),170)
    EXP1 AA 0 A_SpawnItemEx("ExplosionSmall3",random(-2,2),random(-2,2),random(1,2),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP1 A 0 A_PlayWeaponSound("roaster/boom")
    EXP1 A 0 A_PlaySoundEx("roaster/distant","SoundSlot6")
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,45,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,90,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,135,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,180,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,225,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,270,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,315,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,360,128,0)
    EXP1 AB 1 bright
    EXP1 BB 0 A_SpawnItemEx("ExplosionSmall3",random(-2,2),random(-2,2),random(1,2),random(-1,1),random(-1,1),random(0,2),0,128,0)
    EXP1 CDEF 1 bright
    EXP1 FF 0 A_SpawnItemEx("ExplosionSmall3",random(-2,2),random(-2,2),random(1,2),random(-1,1),random(-1,1),random(0,2),0,128,0)
    EXP1 GHIJ 1 bright
    EXP3 AB 1 bright
    EXP3 BB 0 A_SpawnItemEx("ExplosionSmall3",random(-2,2),random(-2,2),random(1,2),random(-1,1),random(-1,1),random(0,2),0,128,0)
    EXP3 CDEF 1 bright
    EXP3 FF 0 A_SpawnItemEx("ExplosionSmall3",random(-2,2),random(-2,2),random(1,2),random(-1,1),random(-1,1),random(0,2),0,128,0)
    EXP3 GHI 1 bright
    stop
  }
}

actor WeakExplosionMain2 : ExplosionMain
{
  Scale 0.8
  states
  {
  Spawn:
	EXP1 A 0
	TNT1 A 0 A_Explode((20),170)
    EXP1 AA 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP1 A 0 A_PlayWeaponSound("grenade/boom")
    EXP1 A 0 A_PlaySoundEx("grenade/farboom","SoundSlot6")
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,45,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,90,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,135,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,180,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,225,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,270,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,315,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,360,128,0)
    EXP1 AB 1 bright
    EXP1 BB 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP1 CDEF 1 bright
    EXP1 FF 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP1 GHIJ 1 bright
    EXP3 AB 1 bright
    EXP3 BB 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP3 CDEF 1 bright
    EXP3 FF 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP3 GHI 1 bright
    stop
  }
}

actor LAWExplosion : ExplosionMain
{
  Scale 1.2
  states
  {
  Spawn:
	EXP1 A 0
	EXP1 A 0 A_Explode((100),170)
    EXP1 AA 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP1 A 0 A_PlayWeaponSound("law/explode")
    EXP1 A 0 A_PlaySoundEx("grenade/farboom","SoundSlot6")
	EXP1 A 0 A_SpawnItemEx("LAWBoomShake",0,0,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,45,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,90,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,135,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,180,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,225,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,270,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,315,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,360,128,0)
    EXP1 AB 1 bright
    EXP1 BB 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP1 CDEF 1 bright
    EXP1 FF 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP1 GHIJ 1 bright
    EXP3 AB 1 bright
    EXP3 BB 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP3 CDEF 1 bright
    EXP3 FF 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP3 GHI 1 bright
    stop
  }
}

actor SeekerExplosion : ExplosionMain
{
  states
  {
  Spawn:
	EXP1 A 0
	EXP1 A 0 A_Explode((100),170)
    EXP1 AA 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP1 A 0 A_PlayWeaponSound("seeker/explode")
	EXP1 A 0 A_SpawnItemEx("SeekerBoomShake",0,0,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,45,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,90,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,135,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,180,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,225,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,270,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,315,128,0)
    EXP1 A 0 A_SpawnItemEx("ExplosionSmokePuff2",random(-5,5),random(-5,5),random(1,5),2,0,0,360,128,0)
    EXP1 AB 1 bright
    EXP1 BB 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP1 CDEF 1 bright
    EXP1 FF 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP1 GHIJ 1 bright
    EXP3 AB 1 bright
    EXP3 BB 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP3 CDEF 1 bright
    EXP3 FF 0 A_SpawnItemEx("ExplosionSmall2",random(-5,5),random(-5,5),random(1,5),random(-2,2),random(-2,2),random(0,2),0,128,0)
    EXP3 GHI 1 bright
    stop
  }
}

//==============================================================================
//
// COMPONENTS OF OUR ULTRA SUPER COOL EXPLOSION
//
//==============================================================================

// The actual explosion
ACTOR UltraExplosion
{
	+NOGRAVITY
	+NOBLOCKMAP
	+CLIENTSIDEONLY
	DamageType "ExplosiveDamage"
	States
	{
		Spawn:
			TNT1 A 0
			Goto DoDamage
		DoDamage:
			TNT1 A 0 A_Explode(400,80)
			Goto SpawnFX
		SpawnFX:
			TNT1 A 0 A_SpawnItemEx("ShakeItGigantic",0,0,0)
			TNT1 A 0 A_PlayWeaponSound("type97/explode")
			TNT1 A 0 A_PlaySoundEx("c4/boom","SoundSlot5")
			TNT1 A 0 A_PlaySoundEx("type97/distant","SoundSlot6")
			
			// Main explosion
			TNT1 A 0 A_SpawnItemEx("UltraBoomHuge",0,0,0)
			// Large sparks
			TNT1 AA 0 A_SpawnItemEx("UltraSpark",random(-4,4),random(-4,4),random(-1,1),random(2,8),random(2,8),random(1,9))
			TNT1 AA 0 A_SpawnItemEx("UltraSpark",random(-4,4),random(-4,4),random(-1,1),random(-8,-2),random(-8,-2),random(1,9))
			
			// Fog
			TNT1 AAAAAA 0 A_SpawnItemEx("UltraFog",random(-64,64),random(-64,64),random(-64,64),random(-1,1),random(-1,1),0)
			
			// Fragments
			TNT1 AAAAAAAAAAAAAAAA 0 A_SpawnItemEx("UltraFragment",random(-16,16),random(-16,16),random(-16,16),random(-30,30),random(-30,30),random(-30,30))
			
			// Small sparks
			TNT1 AAAAAAAAAAAAAAAA 0 A_SpawnItemEx("UltraSparkSmall",random(-16,16),random(-16,16),random(-16,16),random(-30,30),random(-30,30),random(-30,30))
			
			// Long-lasting Sparks
			TNT1 AAAAAAAAAA 0 A_SpawnItemEx("UltraSparkLong",random(-16,16),random(-16,16),random(-16,16),random(-15,15),random(-15,15),random(-15,15))
			
			// Deadly black fog
			TNT1 AAAAAA 0 A_SpawnItemEx("UltraFogBlack",random(-32,32),random(-32,32),random(-32,32),random(-8,8),random(-8,8),random(-8,8))
			
			// Flare
			TNT1 A 0 A_SpawnItemEx("UltraFlare",0,0,0)
			
		Stop
	}
}

ACTOR UltraExplosionM79 : UltraExplosion
{
	States
	{
		Spawn:
			TNT1 A 0
			Goto DoDamage
		DoDamage:
			TNT1 A 0 A_Explode(200,80)
			Goto SpawnFX
		SpawnFX:
			TNT1 A 0 A_SpawnItemEx("ShakeItGigantic",0,0,0)
			TNT1 A 0 A_PlayWeaponSound("type97/explode")
			TNT1 A 0 A_PlaySoundEx("c4/boom","SoundSlot5")
			TNT1 A 0 A_PlaySoundEx("type97/distant","SoundSlot6")
			
			// Main explosion
			TNT1 A 0 A_SpawnItemEx("UltraBoomHuge",0,0,0)
			// Large sparks
			TNT1 AA 0 A_SpawnItemEx("UltraSpark",random(-4,4),random(-4,4),random(-1,1),random(2,8),random(2,8),random(1,9))
			TNT1 AA 0 A_SpawnItemEx("UltraSpark",random(-4,4),random(-4,4),random(-1,1),random(-8,-2),random(-8,-2),random(1,9))
			
			// Fog
			TNT1 AAAAAA 0 A_SpawnItemEx("UltraFog",random(-64,64),random(-64,64),random(-64,64),random(-1,1),random(-1,1),0)
			
			// Fragments
			TNT1 AAAAAAAAAAAAAAAA 0 A_SpawnItemEx("UltraFragment",random(-16,16),random(-16,16),random(-16,16),random(-30,30),random(-30,30),random(-30,30))
			
			// Small sparks
			TNT1 AAAAAAAAAAAAAAAA 0 A_SpawnItemEx("UltraSparkSmall",random(-16,16),random(-16,16),random(-16,16),random(-30,30),random(-30,30),random(-30,30))
			
			// Long-lasting Sparks
			TNT1 AAAAAAAAAA 0 A_SpawnItemEx("UltraSparkLong",random(-16,16),random(-16,16),random(-16,16),random(-15,15),random(-15,15),random(-15,15))
			
			// Deadly black fog
			TNT1 AAAAAA 0 A_SpawnItemEx("UltraFogBlack",random(-32,32),random(-32,32),random(-32,32),random(-8,8),random(-8,8),random(-8,8))
			
			// Flare
			TNT1 A 0 A_SpawnItemEx("UltraFlare",0,0,0)
			
		Stop
	}
}

ACTOR UltraExplosionNade : UltraExplosion
{
	States
	{
		Spawn:
			TNT1 A 0
			Goto DoDamage
		DoDamage:
			TNT1 A 0 A_Explode(100,80)
			Goto SpawnFX
		SpawnFX:
			TNT1 A 0 A_SpawnItemEx("ShakeItGigantic",0,0,0)
			TNT1 A 0 A_PlayWeaponSound("type97/explode")
			TNT1 A 0 A_PlaySoundEx("c4/boom","SoundSlot5")
			TNT1 A 0 A_PlaySoundEx("type97/distant","SoundSlot6")
			
			// Main explosion
			TNT1 A 0 A_SpawnItemEx("UltraBoomHuge",0,0,0)
			// Large sparks
			TNT1 AA 0 A_SpawnItemEx("UltraSpark",random(-4,4),random(-4,4),random(-1,1),random(2,8),random(2,8),random(1,9))
			TNT1 AA 0 A_SpawnItemEx("UltraSpark",random(-4,4),random(-4,4),random(-1,1),random(-8,-2),random(-8,-2),random(1,9))
			
			// Fog
			TNT1 AAAAAA 0 A_SpawnItemEx("UltraFog",random(-64,64),random(-64,64),random(-64,64),random(-1,1),random(-1,1),0)
			
			// Fragments
			TNT1 AAAAAAAAAAAAAAAA 0 A_SpawnItemEx("UltraFragment",random(-16,16),random(-16,16),random(-16,16),random(-30,30),random(-30,30),random(-30,30))
			
			// Small sparks
			TNT1 AAAAAAAAAAAAAAAA 0 A_SpawnItemEx("UltraSparkSmall",random(-16,16),random(-16,16),random(-16,16),random(-30,30),random(-30,30),random(-30,30))
			
			// Long-lasting Sparks
			TNT1 AAAAAAAAAA 0 A_SpawnItemEx("UltraSparkLong",random(-16,16),random(-16,16),random(-16,16),random(-15,15),random(-15,15),random(-15,15))
			
			// Deadly black fog
			TNT1 AAAAAA 0 A_SpawnItemEx("UltraFogBlack",random(-32,32),random(-32,32),random(-32,32),random(-8,8),random(-8,8),random(-8,8))
			
			// Flare
			TNT1 A 0 A_SpawnItemEx("UltraFlare",0,0,0)
			
		Stop
	}
}

ACTOR UltraExplosionRPG : UltraExplosion
{
	DamageType "ExplosiveDamage"
	
	States
	{
		Spawn:
			TNT1 A 0
			Goto DoDamage
		DoDamage:
			TNT1 A 0 A_Explode(400,192)
			Goto SpawnFX
		SpawnFX:
			TNT1 A 0 A_SpawnItemEx("ShakeTheWorld",0,0,0)
			TNT1 A 0 A_PlaySoundEx("rpg/explode","SoundSlot5")
			EXP1 A 0 A_PlaySoundEx("dynamite/distant","SoundSlot6")
			
			// Main explosion
			TNT1 A 0 A_SpawnItemEx("UltraBoomHuge",0,0,0)
			// Large sparks
			TNT1 AA 0 A_SpawnItemEx("UltraSpark",random(-4,4),random(-4,4),random(-1,1),random(2,8),random(2,8),random(1,9))
			TNT1 AA 0 A_SpawnItemEx("UltraSpark",random(-4,4),random(-4,4),random(-1,1),random(-8,-2),random(-8,-2),random(1,9))
			
			// Fog
			TNT1 AAAAAA 0 A_SpawnItemEx("UltraFog",random(-64,64),random(-64,64),random(-64,64),random(-1,1),random(-1,1),0)
			
			// Fragments
			TNT1 AAAAAAAAAAAAAAAA 0 A_SpawnItemEx("UltraFragment",random(-16,16),random(-16,16),random(-16,16),random(-30,30),random(-30,30),random(-30,30))
			
			// Small sparks
			TNT1 AAAAAAAAAAAAAAAA 0 A_SpawnItemEx("UltraSparkSmall",random(-16,16),random(-16,16),random(-16,16),random(-30,30),random(-30,30),random(-30,30))
			
			// Long-lasting Sparks
			TNT1 AAAAAAAAAA 0 A_SpawnItemEx("UltraSparkLong",random(-16,16),random(-16,16),random(-16,16),random(-15,15),random(-15,15),random(-15,15))
			
			// Deadly black fog
			TNT1 AAAAAA 0 A_SpawnItemEx("UltraFogBlack",random(-32,32),random(-32,32),random(-32,32),random(-8,8),random(-8,8),random(-8,8))
			
			// Flare
			TNT1 A 0 A_SpawnItemEx("UltraFlare",0,0,0)
			
		Stop
	}
}

ACTOR UltraExplosionDynamite : UltraExplosion
{
	States
	{
		Spawn:
			TNT1 A 0
			Goto DoDamage
		DoDamage:
			TNT1 A 0 A_Explode(500,80)
			Goto SpawnFX
		SpawnFX:
			TNT1 A 0 A_SpawnItemEx("ShakeItGigantic",0,0,0)
			TNT1 A 0 A_PlaySoundEx("type97/explode","SoundSlot5")
			EXP1 A 0 A_PlayWeaponSound("dynamite/boom")
			EXP1 A 0 A_PlaySoundEx("dynamite/distant","SoundSlot6")
			
			// Main explosion
			TNT1 A 0 A_SpawnItemEx("UltraBoomHuge",0,0,0)
			// Large sparks
			TNT1 AA 0 A_SpawnItemEx("UltraSpark",random(-4,4),random(-4,4),random(-1,1),random(2,8),random(2,8),random(1,9))
			TNT1 AA 0 A_SpawnItemEx("UltraSpark",random(-4,4),random(-4,4),random(-1,1),random(-8,-2),random(-8,-2),random(1,9))
			
			// Fog
			TNT1 AAAAAA 0 A_SpawnItemEx("UltraFog",random(-64,64),random(-64,64),random(-64,64),random(-1,1),random(-1,1),0)
			
			// Fragments
			TNT1 AAAAAAAAAAAAAAAA 0 A_SpawnItemEx("UltraFragment",random(-16,16),random(-16,16),random(-16,16),random(-30,30),random(-30,30),random(-30,30))
			
			// Small sparks
			TNT1 AAAAAAAAAAAAAAAA 0 A_SpawnItemEx("UltraSparkSmall",random(-16,16),random(-16,16),random(-16,16),random(-30,30),random(-30,30),random(-30,30))
			
			// Long-lasting Sparks
			TNT1 AAAAAAAAAA 0 A_SpawnItemEx("UltraSparkLong",random(-16,16),random(-16,16),random(-16,16),random(-15,15),random(-15,15),random(-15,15))
			
			// Deadly black fog
			TNT1 AAAAAA 0 A_SpawnItemEx("UltraFogBlack",random(-32,32),random(-32,32),random(-32,32),random(-8,8),random(-8,8),random(-8,8))
			
			// Flare
			TNT1 A 0 A_SpawnItemEx("UltraFlare",0,0,0)
			
		Stop
	}
}

// A big-ass flare that's used for more FX
ACTOR UltraFlare
{
	+NOGRAVITY
	+NOBLOCKMAP
	+CLIENTSIDEONLY
	Renderstyle Add
	//Alpha 0.5
	States
	{
		Spawn:
			IGLO AAAAAAAAAAAAAAAAAAAA 1 bright A_FadeOut(0.05)
			stop
	}
}

// Some thick black fog that's spawned
ACTOR UltraFogBlack
{
	+NOGRAVITY
	+NOBLOCKMAP
	+CLIENTSIDEONLY
	Scale 0.5
	Alpha 0.3
	Renderstyle Translucent
	States
	{
		Spawn:
		BKSM AAAAA 1 A_FadeIn(0.1)
		BKSM AAAAAAAA 1 A_ScaleVelocity(0.7)
		Goto Fading
		
		Fading:
		BKSM A 0
		BKSM A 0 A_ScaleVelocity(0.7)
		BKSM A 1 A_FadeOut(0.05)
		Loop
	}
}


// Really tiny fragments that come out from the explosion
ACTOR UltraFragment
{
	+CLIENTSIDEONLY
	Radius 3
	Height 6
	BounceType "Doom"
	BounceCount 4
	Scale 0.2
	States
	{
		Spawn:
			TNT1 A 0
			TNT1 A 0 A_Jump(255,"Frag1","Frag2","Frag3")
			Goto Frag1
			
		Frag1:
			FRGM A 1 A_CheckFloor("Death")
			Loop
			
		Frag2:
			FRGM B 1 A_CheckFloor("Death")
			Loop
			
		Frag3:
			FRGM C 1 A_CheckFloor("Death")
			Loop
			
		Death:
			TNT1 A 0
			Stop
	}
}

// Some fog that stays for a bit after the explosion
ACTOR UltraFog
{
	+NOGRAVITY
	+NOBLOCKMAP
	+CLIENTSIDEONLY
	+NOCLIP
	Renderstyle Add
	Scale 3.0
	States
	{
		Spawn:
		SMOK ABCDEFGHIJKLMNOPQR 3 A_FadeOut(0.05)
		Stop
	}
}

// The main explosion, drawn in the center
ACTOR UltraBoomHuge
{
	+NOGRAVITY
	+NOBLOCKMAP
	+CLIENTSIDEONLY
	Renderstyle Add
	Scale 1.5
	States
	{
		Spawn:
			TNT1 A 0
			TNT1 A 0 A_Jump(255,"Explode1","Explode2","Explode3")
			Goto Explode1
			
		Explode1:
			EXP1 ABCDEFGHIJ 1 bright A_FadeOut(0.02)
			Stop
			
		Explode2:
			EXP4 ABCDEFGH 1 bright A_FadeOut(0.02)
			Stop
			
		Explode3:
			EXP5 BCDEFGHIJK 1 bright A_FadeOut(0.02)
			Stop
	}
}

// Some long-lasting sparks that bounce around
ACTOR UltraSparkLong
{
	+THRUACTORS
	+CLIENTSIDEONLY
	-NOGRAVITY
	Renderstyle Add
	Scale 0.25
	BounceType "Doom"
	BounceCount 99
	States
	{
		Spawn:
			SPRK A 16 bright
			SPRK AAAAAAAAAAAAAAAAAAAA 1 bright A_FadeOut(0.05)
			Stop
	}
}

// Some pretty large spark fragments that'll have little trails
ACTOR UltraSpark
{
	+THRUACTORS
	+CLIENTSIDEONLY
	Gravity 0.5
	Renderstyle Add
	Scale 0.75
	
	States
	{
		Spawn:
			SPRK AAAAAAAAAA 1 bright A_SpawnItemEx("UltraSpark_Trail",0,0,0)
			SPRK A 0 A_SpawnItemEx("UltraSpark_Trail",0,0,0)
			SPRK A 1 bright A_FadeOut(0.1)
			SPRK A 0 A_SpawnItemEx("UltraSpark_Trail",0,0,0)
			SPRK A 1 bright A_FadeOut(0.1)
			SPRK A 0 A_SpawnItemEx("UltraSpark_Trail",0,0,0)
			SPRK A 1 bright A_FadeOut(0.1)
			SPRK A 0 A_SpawnItemEx("UltraSpark_Trail",0,0,0)
			SPRK A 1 bright A_FadeOut(0.1)
			SPRK A 0 A_SpawnItemEx("UltraSpark_Trail",0,0,0)
			SPRK A 1 bright A_FadeOut(0.1)
			SPRK A 0 A_SpawnItemEx("UltraSpark_Trail",0,0,0)
			SPRK A 1 bright A_FadeOut(0.1)
			SPRK A 0 A_SpawnItemEx("UltraSpark_Trail",0,0,0)
			SPRK A 1 bright A_FadeOut(0.1)
			SPRK A 0 A_SpawnItemEx("UltraSpark_Trail",0,0,0)
			SPRK A 1 bright A_FadeOut(0.1)
			SPRK A 0 A_SpawnItemEx("UltraSpark_Trail",0,0,0)
			SPRK A 1 bright A_FadeOut(0.1)
			SPRK A 0 A_SpawnItemEx("UltraSpark_Trail",0,0,0)
			SPRK A 1 bright A_FadeOut(0.1)
			Stop
	}
}

// Smaller version
ACTOR UltraSparkSmall : UltraSpark
{
	+THRUACTORS
	+CLIENTSIDEONLY
	Gravity 0.5
	Renderstyle Add
	Scale 0.12
	
	States
	{
		Spawn:
			SPRK A 8 bright
			SPRK AAAAAAAA 1 bright A_FadeOut(0.1)
			Stop
	}
}

// A smoke trail that the sparks have
ACTOR UltraSpark_Trail
{
	+NOGRAVITY
	+NOBLOCKMAP
	+CLIENTSIDEONLY
	Renderstyle Add
	Scale 0.05
	States
	{
		Spawn:
		TNT1 A 0
		SMKP ABCDEFGHIJK 1 A_FadeOut(0.08)
		Stop
	}
}