


Actor SuperBFGBall : BFGBall //replaces BFGBall
{
    +EXTREMEDEATH
	Damage (random(1500, 1500))
  Decal BFGLightning
	DeathSound "BFGEXPLO"
    DamageType Desintegrate
	Scale 0.7
	Species "Marines"
	Height 1
	+THRUSPECIES
	+MTHRUSPECIES
  States
  {
 Spawn:
    BFGN A 0 A_SpawnItemEx("BFGFOG", 0, 0)
    BFS1 AB 1 BRIGHT A_SpawnItemEx("BFGTrailParticle", Random(-13, 13), Random(-13, 13), Random(0, 18), Random(1, 3), 0, (0.1)*Random(-10, 10), Random(-20, 20), 128)
    Loop
 
 Death:
    BFGN A 0
    BFGN A 0 Radius_Quake(4,34,0,12,0)
	BFGN A 0 Radius_Quake(1,34,0,32,0)
	BFGN A 0 A_SpawnItemEx ("ExplosionSplashSpawner", 0, 0, -20)
	BFGN A 0 A_SpawnItemEx ("UnderwaterExplosion",0,0,0,0,0,0,0,SXF_NOCHECKPOSITION,0)
    TNT1 AA 0 A_SpawnItemEx ("DetectFloorCrater",0,0,0,0,0,0,0,SXF_NOCHECKPOSITION,0)
	BFGN A 0 A_SpawnItemEx ("DetectCeilCrater",0,0,0,0,0,0,0,SXF_NOCHECKPOSITION,0)
	TNT1 A 0 A_PlaySOund("BFGEXPL2", 1)
	BFGN A 0 Bright A_SpawnItem("GreenShockWave",0,0,0)
    //BFE1 A 0 A_SpawnItemEx("BFGDeathParticleSpawner", 0, 0, 0, 0, 0, 0, 0, 128)
    //BFE1 A 0 A_SpawnItemEx("BFGSuperParticleSpawner", 0, 0, 0, 0, 0, 0, 0, 128)
	EXPL A 0 A_SpawnItemEx("BFGBigFlare", 0, 0, 0)
	EXPL A 0 A_SpawnItemEx("BFGBigFlare", 50, 0, 0)
	EXPL A 0 A_SpawnItemEx("BFGBigFlare", -50, 0, 0)
	EXPL A 0 A_SpawnItemEx("BFGBigFlare", 0, 50, 0)
	EXPL A 0 A_SpawnItemEx("BFGBigFlare", 0, -50, 0)
	EXPL A 0 A_SpawnItemEx("BFGBigFlare", 50, 50, 0)
	EXPL A 0 A_SpawnItemEx("BFGBigFlare", 50, -50, 0)
	EXPL A 0 A_SpawnItemEx("BFGBigFlare", -50, 50, 0)
	EXPL A 0 A_SpawnItemEx("BFGBigFlare", -50, -50, 0)
	EXPL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 0 A_CustomMissile ("BFGDeathParticleFast", 0, 0, random (0, 360), 2, random (0, 360))
	EXPL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 0 A_CustomMissile ("BFGDeathParticleSuperFast", 0, 0, random (0, 360), 2, random (0, 360))
	EXPL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 0 A_CustomMissile ("BFGDeathParticleFast", 0, 0, random (0, 360), 2, random (0, 360))
	EXPL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 0 A_CustomMissile ("BFGDeathParticleFast", 0, 0, random (0, 360), 2, random (0, 360))
    
	BFGN A 0 A_Explode(200,400,0)
	BFGB A 2 BRIGHT
    BFGB F 0 Bright A_BFGSpray("SuperBFGExtra", 50)
	BFGB BCDEFG 2 Bright
	BFGN A 0 A_SPawnItem("SuperBFGExtraGiant")
    TNT1 A 12
    Stop
  }
}

Actor BFGBallDM : SuperBFGBall
{

	Species "NOne"
	-THRUSPECIES
	-MTHRUSPECIES
}


Actor AlphaBFGBAll : SuperBFGBall
{

	Scale 0.3
	Species "Marines"
	+THRUSPECIES
	+MTHRUSPECIES
	DeathSound "Explosion"
	Damage (random(100, 150))
  States
  {
	DM:
		BFGN A 0
		BFGN A 0 A_ChangeFLag("THRUSPECIES", 0)
		BFGN A 0 A_ChangeFLag("MTHRUSPECIES", 0)
		Goto Spawn1
	
	Spawn:
		BFGN A 0
		BFGN A 0 ACS_NamedExecuteAlways("CheckIfDM", 0, 0, 0, 0)//Check if Coop

	Spawn1:
    BFS1 AB 1 BRIGHT A_SpawnItem("GreenFlareMedium",0,0)
    Loop
 
 Death:
    BFGN A 0
	BFGN A 0 A_Explode(35,100,0)
	Goto Death2
	
 Death2:	
    BFGN A 0 Radius_Quake(2,34,0,12,0)
        BFGN A 0 A_SpawnItemEx ("DetectFloorCrater",0,0,0,0,0,0,0,SXF_NOCHECKPOSITION,0)
	    BFGN A 0 A_SpawnItemEx ("DetectCeilCrater",0,0,0,0,0,0,0,SXF_NOCHECKPOSITION,0)
    //BFE1 A 0 A_SpawnItemEx("BFGDeathParticleSpawner", 0, 0, 0, 0, 0, 0, 0, 128)
    //BFE1 A 0 A_SpawnItemEx("BFGSuperParticleSpawner", 0, 0, 0, 0, 0, 0, 0, 128)
	EXPL AAAAAAAAAAAAAAAA 0 A_CustomMissile ("BFGDeathParticleSuperFast", 0, 0, random (0, 360), 2, random (0, 360))
	TNT1 AAAAAAAAA 0 A_CustomMissile ("GreenExplosionFire", 2, 0, random (0, 360), 2, random (0, 360))
    
	
	BFGB ABCDE 1 Bright A_SpawnItem("GreenFlare",0,0)
    BFGB GHIJK 1 Bright A_SpawnItem("GreenFlare",0,0)
    Stop
  }
}



Actor AlphaBFGBAll2 : AlphaBFGBAll
{

	Scale 0.15
	Speed 50
	Damagetype "Extreme"
	DeathSound "Explosion"
	Damage (random(200, 250))
	States
	{
	 Death:
    BFGN A 0
	BFGN A 0 A_Explode(100,200,0)
	Goto Death2
	}
}

Actor FriendlyBFGBAll : SuperBFGBall
{
    Damagetype "FriendBullet"
	+EXTREMEDEATH
  States
  {
 Death:
    BFGN A 0
    //BFGN A 0 Radius_Quake(4,34,0,12,0)
	
	BFGN A 0 Bright A_SpawnItem("GreenShockWave",0,0,0)
	BFGN A 0 A_SpawnItemEx ("ExplosionSplashSpawner", 0, 0, -20)
        BFGN A 0 A_SpawnItemEx ("DetectFloorCrater",0,0,0,0,0,0,0,SXF_NOCHECKPOSITION,0)
	    BFGN A 0 A_SpawnItemEx ("DetectCeilCrater",0,0,0,0,0,0,0,SXF_NOCHECKPOSITION,0)
    //BFE1 A 0 A_SpawnItemEx("BFGDeathParticleSpawner", 0, 0, 0, 0, 0, 0, 0, 128)
    //BFE1 A 0 A_SpawnItemEx("BFGSuperParticleSpawner", 0, 0, 0, 0, 0, 0, 0, 128)
	EXPL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 0 A_CustomMissile ("BFGBIGFOG", 0, 0, random (0, 360), 2, random (0, 360))
	EXPL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 0 A_CustomMissile ("BFGDeathParticleFast", 0, 0, random (0, 360), 2, random (0, 360))
	EXPL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 0 A_CustomMissile ("BFGDeathParticleSuperFast", 0, 0, random (0, 360), 2, random (0, 360))
	EXPL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 0 A_CustomMissile ("BFGDeathParticleFast", 0, 0, random (0, 360), 2, random (0, 360))
	EXPL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 0 A_CustomMissile ("BFGDeathParticleFast", 0, 0, random (0, 360), 2, random (0, 360))
    
	BFGN A 0 A_Explode(120,350,0)
	BFGB ABCDE 1 Bright A_SpawnItem("GreenFlare",0,0)
	BFGN A 0 A_SPawnItem("SuperBFGExtraGiant")
    BFGB GHIJK 1 Bright A_SpawnItem("GreenFlare",0,0)
    Stop
  }
}

Actor BFGTrailParticle
{
  Height 0
  Radius 0
  Mass 0
  Speed 3
  +Missile
  +NoBlockMap
  +NoGravity
  +DontSplash
  RenderStyle Add
  Scale 0.05
  States
  {
  Spawn:
    SPKG A 2 Bright A_FadeOut(0.02)
    Loop
  }
}



Actor BFGDeathParticle
{
  Height 0
  Radius 0
  Mass 0
  +Missile
  +NoBlockMap
  -NoGravity
  +LowGravity
  +DontSplash
  +DoomBounce
  BounceFactor 0.5
  RenderStyle Add
  Scale 0.04
  States
  {
  Spawn:
  Death:
    SPKG A 2 Bright A_FadeOut(0.02)
    Loop
  }
}



Actor BFGDeathParticleFast: BFGDeathParticle
{
  Speed 10
  Scale 0.1
  States
  {
  Spawn:
  Death:
	SPKG A 11 BRIGHT
    SPKG AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 2 Bright A_FadeOut(0.06)
    Stop
  }
}

Actor BFGDeathParticleSuperFast: BFGDeathParticleFast
{
  Speed 20
}

Actor SuperBFGExtra : BFGExtra Replaces BFGExtra
{
  +NoBlockMap
  +NoGravity
  RenderStyle Add
  +FORCERADIUSDMG
  +THRUGHOST
  Alpha 0.75
  Damage 2
  Scale 0.6
  Radius 1
  Height 1
  DamageType "Desintegrate"
  States
  {
  Spawn:
    BFE2 A 0
    TNT1 AAAAA 0 A_SpawnItemEx("BFGExtraParticle", 0, 0, 14, (0.1)*Random(10, 40), 0, (0.1)*Random(-40, 40), Random(0, 360), 128)
    TNT1 AAAAA 0 A_SpawnItemEx("BFGExtraParticle", 0, 0, 14, (0.1)*Random(10, 40), 0, (0.1)*Random(-40, 40), Random(0, 360), 128)
    TNT1 AAAAA 0 A_SpawnItemEx("BFGExtraParticle", 0, 0, 14, (0.1)*Random(10, 40), 0, (0.1)*Random(-40, 40), Random(0, 360), 128)
	BFGB ABCDEFGHIJK 2 Bright A_SpawnItem("GreenFlareMedium",0,0)
    stop
  }
}


Actor SuperBFGExtraGiant : SuperBFGExtra
{
  Scale 2.9
  States
  {
  Spawn:
    BFE2 A 0
    BFGB ABCDEFGH 2 Bright
	Stop
}}

Actor BFGExtraParticle
{
  Height 0
  Radius 0
  Mass 0
  +Missile
  +NoBlockMap
  +DontSplash
  +NoInteraction
  RenderStyle Add
  Scale 0.035
  States
  {
  Spawn:
  Death:
    SPKG A 2 Bright A_FadeOut(0.1)
    Loop
  }
}


ACTOR GreenShockWave 
{ 
   Speed 0
   Height 64 
   Radius 32
   Scale 2.25 
   RenderStyle add
   Alpha 0.9
   +DROPOFF 
   +NOBLOCKMAP 
   +NOGRAVITY 
   +CLIENTSIDEONLY
   States 
   { 
   Spawn: 
      SHOK A 1 BRIGHT
      Goto Death 
   Death: 
      SHOK BCDEFGHIJKLMNOPQR 1 BRIGHT A_FadeOut(0.05)
      Stop 
   } 
} 


ACTOR WhiteShockWave: GreenShockwave
{ 
Scale 2.0
Alpha 0.12
   States 
   { 
   Spawn: 
      SHWK A 1
      SHWK CEGIKMOQ 1 A_FadeOut(0.01)
      Stop 
   } 
} 

ACTOR WhiteShockWaveBig: WhiteShockWave
{ 
Scale 3.0
} 

ACTOR WhiteShockWaveSmall: WhiteShockWave
{ 
Scale 1.0
} 

ACTOR BFGFOG
{
    Radius 1
    Height 1
	Alpha 0.7
	RenderStyle Add
	Scale 0.4
	Speed 8
	Gravity 0
    +NOBLOCKMAP
    +NOTELEPORT
    +DONTSPLASH
	+MISSILE
	+FORCEXYBILLBOARD
    +CLIENTSIDEONLY
    States
    {
    Spawn:
		TNT1 A 2
        BFOG ABCDEF 1 BRIGHT 
		Stop
    }
}

ACTOR BFGBIGFOG: BFGFOG
{
	Scale 0.8
}

ACTOR SmallGreenFog: BFGFOG
{
	Speed 3
	Scale 0.5
}

Actor BFGDeathParticleSpawner
{
  +NoClip
  +NoBlockMap
  +NoGravity
  +Missile
  States
  {
  Spawn:
    BFGN A 0
    TNT1 AAAAA 0 A_SpawnItemEx("BFGDeathParticle", 0, 0, 0, (0.1)*Random(20, 45), 0, (0.1)*Random(-40, 40), Random(0, 360), 128)
    TNT1 AAAAA 0 A_SpawnItemEx("BFGDeathParticle", 0, 0, 0, (0.1)*Random(20, 45), 0, (0.1)*Random(-40, 40), Random(0, 360), 128)
    TNT1 AAAAA 0 A_SpawnItemEx("BFGDeathParticle", 0, 0, 0, (0.1)*Random(20, 45), 0, (0.1)*Random(-40, 40), Random(0, 360), 128)
    TNT1 AAAAA 0 A_SpawnItemEx("BFGDeathParticle", 0, 0, 0, (0.1)*Random(20, 45), 0, (0.1)*Random(-40, 40), Random(0, 360), 128)
    TNT1 A 1
    Stop
  }
}

Actor BFGSuperParticleSpawner
{
  +NoClip
  +NoBlockMap
  +NoGravity
  +Missile
  +FORCEXYBILLBOARD
  States
  {
  Spawn:
    BFGN A 0
    TNT1 AAAAAAAAAAA 0 A_SpawnItemEx("BFGSuperParticle", 0, 0, 0, (0.1)*Random(10, 35), 0, (0.1)*Random(-20, 20), Random(0, 360), 128)
    TNT1 AAAAAAAAAAA 0 A_SpawnItemEx("BFGSuperParticle", 0, 0, 0, (0.1)*Random(10, 35), 0, (0.1)*Random(-20, 20), Random(0, 360), 128)
    TNT1 AAAAAAAAAAAAAAA 0 A_SpawnItemEx("BFGSuperParticle", 0, 0, 0, (0.1)*Random(10, 35), 0, (0.1)*Random(-20, 20), Random(0, 360), 128)
    TNT1 A 1
    Stop
  }
}


Actor BFGSuperParticle
{
  Height 0
  Radius 0
  Mass 0
  +Missile
  +NoBlockMap
  +NOGRAVITY
  +DontSplash
  +FORCEXYBILLBOARD
  RenderStyle Add
  Scale 0.04
  Speed 24
  States
  {
  Spawn:
  Death:
    SPKG A 2 Bright A_FadeOut(0.02)
    Loop
  }
}










//***Che =============================================================================================

// an exact clone is included in 


Actor BFGBallLazerProjectile: FastProjectile
{
	PROJECTILE
	+SEEKERMISSILE
	Species "Marines"
	+THRUSPECIES
	+MTHRUSPECIES	
	Speed 50
	Radius 6
	Height 6
	-RIPPER
	Damage (Random(80,80))
	Missileheight 12
	Missiletype "BFGBallLazerTrail"
	Damagetype "Desintegrate"
	DeathSound "KYBFGSPR"
	Scale 0.5
	Renderstyle Add
	States	{
		Spawn:
			//TNT1 AAAAA 1 A_SeekerMissile(32, 64, SMF_LOOK | SMF_PRECISE, 256, 3)
			TNT1 A 1 A_SeekerMissile(32, 64, SMF_LOOK | SMF_PRECISE, 256, 3)
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			TNT1 A 1 A_SeekerMissile(32, 64, SMF_LOOK | SMF_PRECISE, 256, 3)
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			TNT1 A 1 A_SeekerMissile(32, 64, SMF_LOOK | SMF_PRECISE, 256, 3)
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			TNT1 A 1 A_SeekerMissile(32, 64, SMF_LOOK | SMF_PRECISE, 256, 3)
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			TNT1 A 1 A_SeekerMissile(32, 64, SMF_LOOK | SMF_PRECISE, 256, 3)
			TNT1 A 1 A_Jump (256, "Airburst")
			Wait
		Airburst: // no flash
			TNT1 AAA 0 A_CustomMissile("BFGBallAirExpiration", 0.0, 0.0, Random(-90,90), CMF_AIMDIRECTION | CMF_ABSOLUTEPITCH, pitch + Random(-45,45))
			TNT1 A 0
			Stop
		Underwater:
			TNT1 A 0 A_Stop
			TNT1 A 0 A_PlaySound("KYBFGSPR", 7)
			TNT1 A 0 A_RadiusGive("ElectricShock", 60, RGF_MONSTERS | RGF_PLAYERS) 
			TNT1 A 0 A_RadiusGive("ElectricShock", 120, RGF_MONSTERS | RGF_PLAYERS) 
			TNT1 AAAAAA 0 A_CustomMissile ("EXPLOSIONBUBULZ", 0, 0, random (0, 360), 2, random (180, 360))
			SMOK ABCDEFGHIJKLMNOPQR 1
			Stop
			
		Death:
		XDeath:
			TNT1 A 0
			TNT1 A 0 A_SpawnItemEx("BFGBallFlash", 0,0,0, 0,0,0, 0, SXF_NOCHECKPOSITION, 0,0)
			TNT1 A 0 A_CheckFloor("DeathFloor")
			TNT1 A 0 A_CheckCeiling("DeathCeiling")
			TNT1 AAA 0 A_CustomMissile("BFGBallRipper", 0.0, 0.0, Random(-45,45), CMF_AIMDIRECTION | CMF_ABSOLUTEPITCH | CMF_TRACKOWNER, pitch + Random(-35,35))
			TNT1 A 0
			Stop
		DeathFloor:
			TNT1 AAA 0 A_CustomMissile("BFGBallAirExpiration", 33.0, 0.0, Random(-180,180), CMF_AIMDIRECTION | CMF_SAVEPITCH | CMF_TRACKOWNER, Random(-70,-15))
			TNT1 A 0
			Stop
		DeathCeiling:	
			TNT1 AAA 0 A_CustomMissile("BFGBallAirExpiration", -33.0, 0.0, Random(-180,180), CMF_AIMDIRECTION | CMF_SAVEPITCH | CMF_TRACKOWNER, Random(15,70))
			TNT1 A 0
			Stop
		
			

	}
}

Actor BFGBallLazerProjectile_Deflectable : BFGBallLazerProjectile
{
	Damage 0
	+HITMASTER
	//var int user_deflection_spread;	
	States {
		Crash: // hit a non-bleeding actor
		XDeath: // hit a bleeding actor
			TNT1 A 0
			TNT1 A 0 A_JumpIf(!CallAcs("FBD_MissileDeflected", 12), "ReallyHit") 
			//TNT1 A 0 A_SetUserVar("user_deflection_spread", CallAcs("FBD_GetMastersMissileDeflectionSpread")) // default is 60
			TNT1 A 0 A_RearrangePointers(AAPTR_Master, AAPTR_Null, AAPTR_Target) // make the one we hit our target (i.e. the shooter) and home at our original shooter
			//TNT1 A 0 A_CustomMissile("?", 6, 0, 180 + Random(-user_deflection_spread, user_deflection_spread), CMF_AIMDIRECTION | CMF_ABSOLUTEPITCH | CMF_SAVEPITCH, 0-pitch + Random(-user_deflection_spread, user_deflection_spread))
			TNT1 A 0 A_CustomMissile("EnemyBfgBallLongReachFastTurning", 6, 0, 0, CMF_SAVEPITCH, 0)
			TNT1 A 0 A_SpawnItemEx("DeflectorShieldReflectingEffect", 0,0,0, 0,0,0, 0,SXF_NOCHECKPOSITION)
			TNT1 A 60 A_Stop
			Stop
		ReallyHit:
			TNT1 A 0 A_DamageMaster(80, "Desintegrate") // this IGNORES ARMOR!!! (also, Zandronum doesn't support the Flags parameter so can't turn that feature off)
			Goto Death // make a boom, radius damage & stuff		
	}
}


Actor BFGBallLongReachProjectile: BFGBallLazerProjectile
{
	States	{
		Spawn:
			//TNT1 AA 1 A_SeekerMissile(16, 32, SMF_LOOK | SMF_PRECISE, 256, 4)
			TNT1 A 1 A_SeekerMissile(16, 32, SMF_LOOK | SMF_PRECISE, 256, 4)
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			TNT1 A 1 A_SeekerMissile(16, 32, SMF_LOOK | SMF_PRECISE, 256, 4)
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			//TNT1 AAAAAAAA 1 A_SeekerMissile(32, 64, SMF_LOOK | SMF_PRECISE, 256, 4)
			TNT1 A 1 A_SeekerMissile(32, 64, SMF_LOOK | SMF_PRECISE, 256, 4)
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			TNT1 A 1 A_SeekerMissile(32, 64, SMF_LOOK | SMF_PRECISE, 256, 4)
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			TNT1 A 1 A_SeekerMissile(32, 64, SMF_LOOK | SMF_PRECISE, 256, 4)
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			TNT1 A 1 A_SeekerMissile(32, 64, SMF_LOOK | SMF_PRECISE, 256, 4)
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			TNT1 A 1 A_SeekerMissile(32, 64, SMF_LOOK | SMF_PRECISE, 256, 4)
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			TNT1 A 1 A_SeekerMissile(32, 64, SMF_LOOK | SMF_PRECISE, 256, 4)
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			TNT1 A 1 A_SeekerMissile(32, 64, SMF_LOOK | SMF_PRECISE, 256, 4)
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			TNT1 A 1 A_SeekerMissile(32, 64, SMF_LOOK | SMF_PRECISE, 256, 4)
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			TNT1 A 1 A_Jump (256, "Airburst")
			Wait
	}
}

Actor BFGBallLongReachFastTurning: BFGBallLazerProjectile
{
	States	{
		Spawn:
			//TNT1 AAAAAAAA 1 A_SeekerMissile(32, 64, SMF_LOOK | SMF_PRECISE, 256, 3)
			TNT1 A 1 A_SeekerMissile(32, 64, SMF_LOOK | SMF_PRECISE, 256, 3)
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			TNT1 A 1 A_SeekerMissile(32, 64, SMF_LOOK | SMF_PRECISE, 256, 3)
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			TNT1 A 1 A_SeekerMissile(32, 64, SMF_LOOK | SMF_PRECISE, 256, 3)
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			TNT1 A 1 A_SeekerMissile(32, 64, SMF_LOOK | SMF_PRECISE, 256, 3)
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			TNT1 A 1 A_SeekerMissile(32, 64, SMF_LOOK | SMF_PRECISE, 256, 3)
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			TNT1 A 1 A_SeekerMissile(32, 64, SMF_LOOK | SMF_PRECISE, 256, 3)
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			TNT1 A 1 A_SeekerMissile(32, 64, SMF_LOOK | SMF_PRECISE, 256, 3)
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			TNT1 A 1 A_SeekerMissile(32, 64, SMF_LOOK | SMF_PRECISE, 256, 3)
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			TNT1 A 1 A_Jump (256, "Airburst")
			Wait
	}
}

Actor BFGBallLongReachFastTurning_Deflectable : BFGBallLongReachFastTurning
{
	Damage 0
	+HITMASTER
	//var int user_deflection_spread;	
	States {
		Crash: // hit a non-bleeding actor
		XDeath: // hit a bleeding actor
			TNT1 A 0
			TNT1 A 0 A_JumpIf(!CallAcs("FBD_MissileDeflected", 12), "ReallyHit") 
			//TNT1 A 0 A_SetUserVar("user_deflection_spread", CallAcs("FBD_GetMastersMissileDeflectionSpread")) // default is 60
			TNT1 A 0 A_RearrangePointers(AAPTR_Master, AAPTR_Null, AAPTR_Target) // make the one we hit our target (i.e. the shooter) and home at our original shooter
			TNT1 A 0 A_CustomMissile("EnemyBfgBallLongReachFastTurning", 6, 0, 0, CMF_SAVEPITCH, 0)
			TNT1 A 0 A_SpawnItemEx("DeflectorShieldReflectingEffect", 0,0,0, 0,0,0, 0,SXF_NOCHECKPOSITION)
			TNT1 A 60 A_Stop
			Stop
		ReallyHit:
			TNT1 A 0 A_DamageMaster(80, "Desintegrate") // this IGNORES ARMOR!!! (also, Zandronum doesn't support the Flags parameter so can't turn that feature off)
			Goto Death // make a boom, radius damage & stuff		
	}
}



Actor BFGBallAirExpiration: BFGBallLazerProjectile
{
	//-RIPPER
	+RIPPER
	+BLOODLESSIMPACT // without this, framerate dies a horrible stuttering death every time you hit a big crowd
	+NOBOSSRIP // only tickle the bosses
	Missiletype "BFGBallLazerTrailSecondary"
	Damage (Random(2,2))
	// ripper rips 8 times per tic (i.e. 8..11 times per imp or baron (if horizontally).
	Radius 3
	Height 3	
	//Speed 25
	Speed 32
	States {
		Spawn:
			TNT1 A 1 BRIGHT
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			TNT1 A 1 BRIGHT A_SeekerMissile(64, 90, SMF_LOOK | SMF_PRECISE, 256, 2)
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			TNT1 A 1 BRIGHT A_SeekerMissile(64, 90, SMF_LOOK | SMF_PRECISE, 256, 2)
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			TNT1 A 0 A_Jump (256, "Airburst")
			Stop
		Airburst:
			TNT1 A 0 // no flash
			Stop
		Death:
		XDeath:
			TNT1 A 0
			TNT1 A 0 A_SpawnItemEx("BFGBallFlash", 0,0,0, 0,0,0, 0, SXF_NOCHECKPOSITION, 0,0) //"BFGBallFlashNoScream"
			Stop			
	}
}

Actor BFGBallRipper:  BFGBallAirExpiration
{
	+RIPPER
	+BLOODLESSIMPACT // without this, framerate dies a horrible stuttering death every time you hit a big crowd
	+NOBOSSRIP // only tickle the bosses
	Speed 64
	Damage (Random(4,4))
	// ripper rips 8 times per tic (i.e. 8 times per 64 -- i.e. 4..5 times per imp or baron (if horizontally). Must splatter any imp.
	
	States {
		Airburst:
			TNT1 A 0
			TNT1 A 0 A_SpawnItemEx("BFGBallFlashNoScream", 0,0,0, 0,0,0, 0, SXF_NOCHECKPOSITION, 0,0) //"BFGBallFlashNoScream"
			Stop
		Death:
		XDeath:
			TNT1 A 0 // no flash
			Stop			
	}
}


Actor BFGBallLazerTrail
{
	PROJECTILE
	Speed 4 //60 // because they then overshoot the projectile's explosion if it expires midair
	Radius 3
	Height 3
	Scale 0.7
	+GHOST
	+THRUGHOST
	+NOTAUTOAIMED
	//+NOTARGET
	//+NEVERTARGET
	-RIPPER
	-SEEKERMISSILE
	+CLIENTSIDEONLY
	Damage 0
	Missiletype "None"
	Renderstyle Add
	States	{
		Spawn:
			LBFX AAAA 1 A_FadeOut(0.2)
			Stop
			
			Death:
			TNT1 A 0
			Stop
	}
}

Actor BFGBallLazerTrailSecondary: BFGBallLazerTrail {
	Scale 0.4
}

Actor BFGBallFlash: BFGBallLazerTrail {
	Radius 1
	Height 1
	Scale 1.0
	DeathSound "KYBFGSPR"
	States {
		Spawn:
			TNT1 A 0
			Goto Death
		Death: 	
			BFE2 A 1 BRIGHT A_Scream
			BFE2 BCD 1 BRIGHT 
			TNT1 A 0
			Stop			
	}
}

Actor BFGBallFlashNoScream: BFGBallLazerTrail {
	Radius 1
	Height 1
	DeathSound "KYBFGSPR"
	States {
		Spawn:
			TNT1 A 0
			Goto Death
		Death: 	
			BFE2 ABCD 1 BRIGHT // no scream
			TNT1 A 0
			Stop
	}
}

Actor BfgBallRaysCount: Inventory
{
	inventory.maxamount 70
}

Actor BfgBalIsPointBlank: Inventory
{
	inventory.maxamount 1
}

Actor Quake2AndDoom2016LikeBFGBall: FastProjectile replaces BFGBall //replaces SuperBFGBall
{
	PROJECTILE
    +EXTREMEDEATH
	-RANDOMIZE
//	+FORCERADIUSDMG //All actors will take radius damage from this projectile, even boss enemies that are normally immune to radius damage
	
//	Damage (random(1500, 1500))
	Damage (random(300, 300))
	Decal BFGLightning
	DeathSound "BFGEXPLO"
    DamageType Desintegrate
//	Scale 0.7
	Scale 1.0
	Species "Marines"
//	Height 1
	+THRUSPECIES
	+MTHRUSPECIES
//	Radius 8
	Radius 13
	Height 8
	Speed 25
	RenderStyle "Add"
	Obituary "$OB_MPBFG_BOOM"


	// the beam spam has a dps of 900 (10 beams) per 250 distance, with approximately 250 range (actually ~300 but with diminishing damage)
	// so, against a lone cyberdemon (max damage should be 3000): 
	//	900 beam spam damage on approach + 300 direct hit + 200 AOE + <x> beam burst on explosion = 3200, where x should be 1800
	// point blank: *ignore* approach (still applies but the shot may be really point blank), so 300 direct hit  + 200 AOE + <x> spray = 3200, so x should be 2700
	
	States
	{
		Spawn:
			BFGN A 0
			BFGN A 0 A_SpawnItemEx("BFGFOG", 0, 0)
			TNT1 A 0 A_Jump(256, "Fly1")
			//TNT1 A 0 A_Jump(256, "Fly2")
			goto MultiplayerOoopsnik //Stop // Zandronum client happily skips over A_Jump(256,...), resulting in GLITCHES.
		MultiplayerOoopsnik:
			BFS1 A 1 A_Jump(256, "Fly1")
			Wait
			
		Fly1:	
			// for the first 10 tics, behave like a normal BFG ball -- i.e. if shot point-blank.
			//BFS1 ABABA 1 BRIGHT A_CustomMissile("BFGBallLazerProjectile_Deflectable", 0.0, 0.0, Random(-45,45), CMF_AIMDIRECTION | CMF_SAVEPITCH, pitch + Random(-45,45))
			BFS1 A 1 BRIGHT A_CustomMissile("BFGBallLazerProjectile_Deflectable", 0.0, 0.0, Random(-45,45), CMF_AIMDIRECTION | CMF_SAVEPITCH, pitch + Random(-45,45))
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			BFS1 B 1 BRIGHT A_CustomMissile("BFGBallLazerProjectile_Deflectable", 0.0, 0.0, Random(-45,45), CMF_AIMDIRECTION | CMF_SAVEPITCH, pitch + Random(-45,45))
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			BFS1 A 1 BRIGHT A_CustomMissile("BFGBallLazerProjectile_Deflectable", 0.0, 0.0, Random(-45,45), CMF_AIMDIRECTION | CMF_SAVEPITCH, pitch + Random(-45,45))
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			BFS1 B 1 BRIGHT A_CustomMissile("BFGBallLazerProjectile_Deflectable", 0.0, 0.0, Random(-45,45), CMF_AIMDIRECTION | CMF_SAVEPITCH, pitch + Random(-45,45))
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			BFS1 A 1 BRIGHT A_CustomMissile("BFGBallLazerProjectile_Deflectable", 0.0, 0.0, Random(-45,45), CMF_AIMDIRECTION | CMF_SAVEPITCH, pitch + Random(-45,45))
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			
			BFGN A 0 A_GiveInventory("BfgBallRaysCount", 20) // 90 damage per ray, must give total 1800 //135 damage per ray, 2565 total
			"----" A 1 A_Jump(256, "Fly2") // Zandronum client happily skips over A_Jump(256,...), resulting in GLITCHES.
			Wait
		Fly2:	
			// after that, start spamming lightning
			//BFS1 AB 1 BRIGHT A_CustomMissile("BFGBallLazerProjectile_Deflectable", 0.0, 0.0, Random(-180,180), CMF_AIMDIRECTION | CMF_ABSOLUTEPITCH, Random(-70,70))
			
			BFS1 A 1 BRIGHT A_CustomMissile("BFGBallLazerProjectile_Deflectable", 0.0, 0.0, Random(-180,180), CMF_AIMDIRECTION | CMF_ABSOLUTEPITCH, Random(-70,70))
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			BFS1 B 1 BRIGHT A_CustomMissile("BFGBallLazerProjectile_Deflectable", 0.0, 0.0, Random(-180,180), CMF_AIMDIRECTION | CMF_ABSOLUTEPITCH, Random(-70,70))
			TNT1 A 0 A_JumpIf(waterlevel > 0, "Underwater")
			
			//don't go hugging the floor
			TNT1 A 0 A_JumpIf((z - floorz) < 20, "Death")
			Loop
		
		Underwater:
			BFGN A 0
			BFGN A 0 A_Stop
			TNT1 A 0 A_PlaySOund("BFGEXPL2", 1)
			EXPL A 0 A_SpawnItemEx("BFGBigFlare", 0, 0, 0)
			EXPL A 0 A_SpawnItemEx("BFGBigFlare", 50, 0, 0)
			EXPL A 0 A_SpawnItemEx("BFGBigFlare", -50, 0, 0)
			EXPL A 0 A_SpawnItemEx("BFGBigFlare", 0, 50, 0)
			EXPL A 0 A_SpawnItemEx("BFGBigFlare", 0, -50, 0)
			EXPL A 0 A_SpawnItemEx("BFGBigFlare", 50, 50, 0)
			EXPL A 0 A_SpawnItemEx("BFGBigFlare", 50, -50, 0)
			EXPL A 0 A_SpawnItemEx("BFGBigFlare", -50, 50, 0)
			EXPL A 0 A_SpawnItemEx("BFGBigFlare", -50, -50, 0)			
			BFGN A 0 A_Explode(200,400,0)
			TNT1 AAAAAAAAAAAAAAAAAA 0 A_CustomMissile ("EXPLOSIONBUBULZ", 0, 0, random (0, 360), 2, random (180, 360))
			BFGB ABABABABABABABAFFFGGG 1 A_RadiusGive("ElectricShock", 300, RGF_MONSTERS | RGF_PLAYERS) 
			TNT1 AAAAAAAAAAAAAAAAAA 0 A_CustomMissile ("EXPLOSIONBUBULZ", 0, 0, random (0, 360), 2, random (180, 360))
			Goto DeathAdvanced
		Death:
			BFGN A 0
			BFGN A 0 A_Stop // in case we are "died" manually
			BFGN A 0 Radius_Quake(4,34,0,12,0)
			BFGN A 0 Radius_Quake(1,34,0,32,0)
			BFGN A 0 A_SpawnItemEx ("ExplosionSplashSpawner", 0, 0, -20)
			BFGN A 0 A_SpawnItemEx ("UnderwaterExplosion",0,0,0,0,0,0,0,SXF_NOCHECKPOSITION,0)
			TNT1 AA 0 A_SpawnItemEx ("DetectFloorCrater",0,0,0,0,0,0,0,SXF_NOCHECKPOSITION,0)
			BFGN A 0 A_SpawnItemEx ("DetectCeilCrater",0,0,0,0,0,0,0,SXF_NOCHECKPOSITION,0)
			TNT1 A 0 A_PlaySOund("BFGEXPL2", 1)
			BFGN A 0 Bright A_SpawnItem("GreenShockWave",0,0,0)
			//BFE1 A 0 A_SpawnItemEx("BFGDeathParticleSpawner", 0, 0, 0, 0, 0, 0, 0, 128)
			//BFE1 A 0 A_SpawnItemEx("BFGSuperParticleSpawner", 0, 0, 0, 0, 0, 0, 0, 128)
			EXPL A 0 A_SpawnItemEx("BFGBigFlare", 0, 0, 0)
			EXPL A 0 A_SpawnItemEx("BFGBigFlare", 50, 0, 0)
			EXPL A 0 A_SpawnItemEx("BFGBigFlare", -50, 0, 0)
			EXPL A 0 A_SpawnItemEx("BFGBigFlare", 0, 50, 0)
			EXPL A 0 A_SpawnItemEx("BFGBigFlare", 0, -50, 0)
			EXPL A 0 A_SpawnItemEx("BFGBigFlare", 50, 50, 0)
			EXPL A 0 A_SpawnItemEx("BFGBigFlare", 50, -50, 0)
			EXPL A 0 A_SpawnItemEx("BFGBigFlare", -50, 50, 0)
			EXPL A 0 A_SpawnItemEx("BFGBigFlare", -50, -50, 0)
			EXPL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 0 A_CustomMissile ("BFGDeathParticleFast", 0, 0, random (0, 360), 2, random (0, 360))
			EXPL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 0 A_CustomMissile ("BFGDeathParticleSuperFast", 0, 0, random (0, 360), 2, random (0, 360))
			EXPL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 0 A_CustomMissile ("BFGDeathParticleFast", 0, 0, random (0, 360), 2, random (0, 360))
			EXPL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 0 A_CustomMissile ("BFGDeathParticleFast", 0, 0, random (0, 360), 2, random (0, 360))

			BFGN A 0 A_Explode(200,400,0)
			
			TNT1 A 0 A_JumpIfInventory("BfgBallRaysCount", 1, "DeathAdvanced")
			Goto DeathPointBlank
		
		DeathAdvanced:
			
			// The flash is a separate entity, purely cosmetic. 
			BFGN A 0 A_SPawnItemEx("SuperBFGExtraGiantChe", 0,0,0, 0,0,0, 0, SXF_NOCHECKPOSITION, 0, 0)
			
			// We go invisibal and spam beams!
			TNT1 A 0 A_CheckFloor("DeathFloor")
			TNT1 A 0 A_JumpIf((z - floorz) < 20, "DeathFloor")
			TNT1 A 0 A_CheckCeiling("DeathCeiling")
		
		DeathSpam:
			// projectiles are launched *backwards*, so they curve back towards the target
			TNT1 A 0
			TNT1 A 1 A_CustomMissile("BFGBallLongReachFastTurning_Deflectable", 0.0, 0.0, Random(135,225), CMF_AIMDIRECTION | CMF_SAVEPITCH | CMF_TRACKOWNER, - pitch + Random(-45,45)) // angle = 180 +/-45
			TNT1 A 0 A_TakeInventory("BfgBallRaysCount", 1)
			TNT1 A 0 A_JumpIfInventory("BfgBallRaysCount", 1, "DeathSpam")
			TNT1 A 12
			Stop
		DeathFloor:
			TNT1 A 0
			TNT1 A 1 A_CustomMissile("BFGBallLongReachFastTurning_Deflectable", 24.0, 0.0, Random(-180,180), CMF_AIMDIRECTION | CMF_SAVEPITCH | CMF_TRACKOWNER, Random(5, 70))
			TNT1 A 0 A_TakeInventory("BfgBallRaysCount", 1)
			TNT1 A 0 A_JumpIfInventory("BfgBallRaysCount", 1, "DeathFloor")
			TNT1 A 12
			Stop
		DeathCeiling:
			TNT1 A 0
			TNT1 A 0 A_Stop
			TNT1 A 1 A_CustomMissile("BFGBallLongReachFastTurning_Deflectable", -24.0, 0.0, Random(-180,180), CMF_AIMDIRECTION | CMF_SAVEPITCH | CMF_TRACKOWNER, Random(-70,-5))
			TNT1 A 0 A_TakeInventory("BfgBallRaysCount", 1)
			TNT1 A 0 A_JumpIfInventory("BfgBallRaysCount", 1, "DeathCeiling")
			TNT1 A 12
			Stop
		DeathPointBlank:
			TNT1 A 0
			BFGN A 0 A_SPawnItemEx("SuperBFGExtraGiantChe", 0,0,0, 0,0,0, 0, SXF_NOCHECKPOSITION, 0, 0)
			// NO. Just no. //BFGN A 0 A_Explode(2300,400,0) // 2500, combined with the above
			TNT1 A 0 BRIGHT A_BFGSpray("SuperBFGExtraChe", 54)  // must inflict 2700 damage max
			TNT1 A 12
			Stop
	}
}


Actor SuperBFGExtraGiantChe : SuperBFGExtraGiant
{
	States
	{
		Spawn:
			BFGB AYAYAYAYAYAYAYY 1 BRIGHT  // Brutal Doom re-drawn in truecolor (frame Y was a *duplicate* A, BFGba0.dat, in BDv21)
			//BFE2 ABCABCABCABCDAB 1 BRIGHT  // doom2 original
			BFGB ABCDEFGH 2 Bright // Brutal Doom re-drawn in truecolor
			//BFE1 ABCBCDEF 2 BRIGHT // doom2 original
			Stop
	}
}

//Actor SuperBFGExtraGiantCheDebug: SuperBFGExtraGiantChe
//{
//	Translation "227:231=192:194", "112:127=192:198", "224:226=4:4" // recolored bluish-white	
//}

Actor SuperBFGExtraChe : SuperBFGExtra
{
	Damage (Random(50,50)) // Must be *much* higher than original because I basically *removed* direct hit damage (from 1500 down to 300)
}
