actor MagmaBeamSpawnerV 11701
{
//$Category MM8BDM-Props
+NOINTERACTION
Radius 28
scale 2.5
Height 16
Mass 9999999999
+NOGRAVITY
+FORCEYBILLBOARD
-SOLID
+DONTBLAST
+NOTARGETSWITCH
States
{
Spawn:
TNT1 A 1 A_JumpIfInventory("MagmaBeamFlag", 1, "FrozenLate")
loop
Fire:
TNT1 A 0 A_JumpIfInventory("MagmaBeamFlag", 1, "Frozen")
TNT1 A 0 A_JumpIfInventory("CutterFlag", 1, "Firing")
TNT1 A 2 A_SpawnItemEx("MagmaBeamV1", 0, 0, -8, 0, 0, -19, 0, 0, 0)
TNT1 A 0 A_PlaySoundEx("misc/magmatrap", "SoundSlot5")
Firing:
TNT1 A 0 A_JumpIfInventory("CutterFlag", 35, "Continue")
TNT1 AA 1 A_SpawnItemEx("MagmaBeamV2", 0, 0, -8, 0, 0, -19, 0, 0, 0)
TNT1 A 0 A_GiveInventory("CutterFlag", 1)
TNT1 A 0 A_JumpIfInventory("MagmaBeamFlag", 1, "Frozen")
Goto Firing
Frozen:
TNT1 A 1 
TNT1 A 0 A_TakeInventory("MagmaBeamFlag", 1)
TNT1 A 0 A_JumpIfInventory("MagmaBeamFlag", 1, "Frozen")
TNT1 A 0 A_TakeInventory("FrozenBeamFlag", 1)
TNT1 A 0 A_TakeInventory("ConcreteBeamFlag", 1)
Goto Firing
FrozenLate:
TNT1 A 1 
TNT1 A 0 A_TakeInventory("MagmaBeamFlag", 1)
TNT1 A 0 A_JumpIfInventory("MagmaBeamFlag", 1, "FrozenLate")
TNT1 A 0 A_TakeInventory("FrozenBeamFlag", 1)
TNT1 A 0 A_TakeInventory("ConcreteBeamFlag", 1)
Goto Spawn
Continue:
TNT1 A 0 A_TakeInventory("CutterFlag", 999)
TNT1 A 2 A_SpawnItemEx("MagmaBeamV2", 0, 0, -8, 0, 0, -19, 0, 0, 0)
TNT1 A 0 A_SpawnItemEx("MagmaBeamV3", 0, 0, -8, 0, 0, -19, 0, 0, 0)
Goto Spawn
}
}

actor MagmaBeamFlag : Inventory
{
Inventory.Amount 1
Inventory.MaxAmount 175
}

actor FrozenBeamFlag : Once {}
actor ConcreteBeamFlag : Once {}


actor MagmaBeamV1
{
PROJECTILE
-NOBLOCKMAP
Damage (255)
+RIPPER
+BRIGHT
damagetype "Beam"
scale 2.5
+DONTBLAST
+DONTSPLASH
+FORCEXYBILLBOARD
+FOILINVUL
+SHOOTABLE
+NOTAUTOAIMED
+NODAMAGE
+NOBLOOD
+DONTRIP
+NODAMAGETHRUST
+NORADIUSDMG
+FORCEYBILLBOARD
+THRUGHOST
+NOTARGETSWITCH
+GHOST
+DONTREFLECT
PainChance 255
PainChance "Beam", 0
Translation "192:192=229:229", "198:198=227:227", "0:8=161:161", "243:247=161:161"
radius 28
height 16
obituary "%k was not quick enough to avoid the beams."
Speed 19
States
{
Spawn:
TNT1 A 0
TNT1 A 1 ACS_ExecuteAlways(3, 0)
Goto Spawn2
Spawn2:
MGMB A 0 A_JumpIfInTargetInventory("FrozenBeamFlag", 1, "FrozenConcrete")
MGMB A 0 A_JumpIfInTargetInventory("ConcreteBeamFlag", 1, "FrozenConcrete")
MGMB A 1 
loop
Pain.FreezeCracker:
Pain.FreezeCrackerBit:
Pain.IceSlasher:
Pain.BlizzardAttack:
Pain.IceWall:
Pain.IceWave:
Pain.ChillSpike:
Pain.ChillShot:
"----" A 0 A_GiveToTarget("MagmaBeamFlag", 175)
"----" A 0 A_GiveToTarget("FrozenBeamFlag", 1)
"----" A 0 A_Jump(256, "FrozenConcrete")
Goto Spawn2
Pain.ConcreteShot:
"----" A 0 A_GiveToTarget("MagmaBeamFlag", 175)
"----" A 0 A_GiveToTarget("ConcreteBeamFlag", 1)
"----" A 0 A_Jump(256, "FrozenConcrete")
Goto Spawn2
FrozenConcrete:
"----" A 0 A_SetArg(0, momz)
"----" A 0 A_Stop
"----" A 0 A_ChangeFlag("MISSILE", 0)
"----" A 0 A_ChangeFlag("BRIGHT", 0)
"----" A 0 A_ChangeFlag("NOPAIN", 1)
"----" A 0 A_ChangeFlag("SOLID", 1)
"----" A 0 A_Jump(256, "Thawing")
Goto Thawing
Thawing:
MGMB A 1
"----" A 0 A_JumpIfInTargetInventory("MagmaBeamFlag", 1, "Thawing")
"----" A 0 A_ChangeVelocity(0, 0, Args[0], CVF_REPLACE)
"----" A 0 A_ChangeFlag("SOLID", 0)
"----" A 0 A_ChangeFlag("MISSILE", 1)
"----" A 0 A_ChangeFlag("BRIGHT", 1)
Goto Spawn2
Death:
TNT1 A 0
stop
}
}

actor MagmaBeamV2 : MagmaBeamV1
{
States
{
Spawn:
TNT1 A 0
TNT1 A 1 ACS_ExecuteAlways(3, 0)
Goto Spawn2
Spawn2:
MGMB B 1
MGMB B 0 A_JumpIfInTargetInventory("FrozenBeamFlag", 1, "FrozenConcrete")
MGMB B 0 A_JumpIfInTargetInventory("ConcreteBeamFlag", 1, "FrozenConcrete")
loop
Thawing:
MGMB B 1 
"----" A 0 A_JumpIfInTargetInventory("MagmaBeamFlag", 1, "Thawing")
"----" A 0 A_ChangeVelocity(0, 0, Args[0], CVF_REPLACE)
"----" A 0 A_ChangeFlag("SOLID", 0)
"----" A 0 A_ChangeFlag("MISSILE", 1)
"----" A 0 A_ChangeFlag("BRIGHT", 1)
Goto Spawn2
}
}

actor MagmaBeamV3 : MagmaBeamV1
{
States
{
Spawn:
TNT1 A 0
TNT1 A 1 ACS_ExecuteAlways(3, 0)
Goto Spawn2
Spawn2:
MGMB C 1
MGMB C 0 A_JumpIfInTargetInventory("FrozenBeamFlag", 1, "FrozenConcrete")
MGMB C 0 A_JumpIfInTargetInventory("ConcreteBeamFlag", 1, "FrozenConcrete")
loop
Goto Spawn2
Thawing:
MGMB C 1
"----" A 0 A_JumpIfInTargetInventory("MagmaBeamFlag", 1, "Thawing")
"----" A 0 A_ChangeVelocity(0, 0, Args[0], CVF_REPLACE)
"----" A 0 A_ChangeFlag("SOLID", 0)
"----" A 0 A_ChangeFlag("MISSILE", 1)
"----" A 0 A_ChangeFlag("BRIGHT", 1)
Goto Spawn2

}
}

actor MagmaPlatform 11702
{
//$Category MM8BDM-Interactive Props
+SOLID
+GHOST
+NOGRAVITY
+DONTRIP
Radius 32
Height 32
States
{
Spawn:
TNT1 A -1
stop
}
}

actor MagmaBeamSpawnerH : MagmaBeamSpawnerV 11708
{
//$Category MM8BDM-Props
States
{
Spawn:
TNT1 A 1 A_JumpIfInventory("MagmaBeamFlag", 1, "FrozenLate")
loop
Fire:
TNT1 A 0 A_JumpIfInventory("MagmaBeamFlag", 1, "Frozen")
TNT1 A 0 A_JumpIfInventory("CutterFlag", 1, "Firing")
TNT1 A 1 A_SpawnItemEx("MagmaBeamH1", 8, 0, 0, 19, 0, 0, 0, 0, 0)
TNT1 A 0 A_PlaySoundEx("misc/magmatrap", "SoundSlot5")
Firing:
TNT1 A 0 A_JumpIfInventory("CutterFlag", 35, "Continue")
TNT1 AA 1 A_SpawnItemEx("MagmaBeamH2", 8, 0, 0, 19, 0, 0, 0, 0, 0)
TNT1 A 0 A_GiveInventory("CutterFlag", 1)
TNT1 A 0 A_JumpIfInventory("MagmaBeamFlag", 1, "Frozen")
Goto Firing
Frozen:
TNT1 A 1 
TNT1 A 0 A_TakeInventory("MagmaBeamFlag", 1)
TNT1 A 0 A_JumpIfInventory("MagmaBeamFlag", 1, "Frozen")
TNT1 A 0 A_TakeInventory("FrozenBeamFlag", 1)
TNT1 A 0 A_TakeInventory("ConcreteBeamFlag", 1)
Goto Firing
FrozenLate:
TNT1 A 1 
TNT1 A 0 A_TakeInventory("MagmaBeamFlag", 1)
TNT1 A 0 A_JumpIfInventory("MagmaBeamFlag", 1, "FrozenLate")
TNT1 A 0 A_TakeInventory("FrozenBeamFlag", 1)
TNT1 A 0 A_TakeInventory("ConcreteBeamFlag", 1)
Goto Spawn
Continue:
TNT1 A 0 A_TakeInventory("CutterFlag", 999)
TNT1 A 1 A_SpawnItemEx("MagmaBeamH2", 8, 0, 0, 19, 0, 0, 0, 0, 0)
TNT1 A 0 A_SpawnItemEx("MagmaBeamH3", 8, 0, 0, 19, 0, 0, 0, 0, 0)
Goto Spawn
}
}




actor MagmaBeamH1 : MagmaBeamV1
{
Height 64
Radius 16
States
{
Spawn:
TNT1 A 0
TNT1 A 1 ACS_ExecuteAlways(3, 0)
Goto Spawn2
Spawn2:
MGMB D 0 A_JumpIfInTargetInventory("FrozenBeamFlag", 1, "FrozenConcrete")
MGMB D 0 A_JumpIfInTargetInventory("ConcreteBeamFlag", 1, "FrozenConcrete")
MGMB D 1 
loop
Pain.FreezeCracker:
Pain.FreezeCrackerBit:
Pain.IceSlasher:
Pain.BlizzardAttack:
Pain.IceWall:
Pain.IceWave:
"----" A 0 A_GiveToTarget("MagmaBeamFlag", 175)
"----" A 0 A_GiveToTarget("FrozenBeamFlag", 1)
"----" A 0 A_Jump(256, "FrozenConcrete")
Goto Spawn2
Pain.ConcreteShot:
"----" A 0 A_GiveToTarget("MagmaBeamFlag", 175)
"----" A 0 A_GiveToTarget("ConcreteBeamFlag", 1)
"----" A 0 A_Jump(256, "FrozenConcrete")
Goto Spawn2
FrozenConcrete:
"----" A 0 A_SetArg(0, momx)
"----" A 0 A_SetArg(1, momy)
"----" A 0 A_Stop
"----" A 0 A_ChangeFlag("SOLID", 1)
"----" A 0 A_ChangeFlag("MISSILE", 0)
"----" A 0 A_ChangeFlag("BRIGHT", 0)
"----" A 0 A_ChangeFlag("SHOOTABLE", 0)
"----" A 0 A_Jump(256, "Thawing")
Goto Thawing
Thawing:
MGMB D 1
"----" A 0 A_JumpIfInTargetInventory("MagmaBeamFlag", 1, "Thawing")
"----" A 0 A_ChangeVelocity(Args[0], Args[1], 0, CVF_REPLACE)
"----" A 0 A_ChangeFlag("SOLID", 0)
"----" A 0 A_ChangeFlag("MISSILE", 1)
"----" A 0 A_ChangeFlag("BRIGHT", 1)
Goto Spawn2
Death:
TNT1 A 0
stop
}
}

actor MagmaBeamH2 : MagmaBeamH1
{
States
{
Spawn:
TNT1 A 0
TNT1 A 1 ACS_ExecuteAlways(3, 0)
Goto Spawn2
Spawn2:
MGMB E 1
MGMB E 0 A_JumpIfInTargetInventory("FrozenBeamFlag", 1, "FrozenConcrete")
MGMB E 0 A_JumpIfInTargetInventory("ConcreteBeamFlag", 1, "FrozenConcrete")
loop
Thawing:
MGMB E 1 
"----" A 0 A_JumpIfInTargetInventory("MagmaBeamFlag", 1, "Thawing")
"----" A 0 A_ChangeVelocity(Args[0], Args[1], 0, CVF_REPLACE)
"----" A 0 A_ChangeFlag("SOLID", 0)
"----" A 0 A_ChangeFlag("MISSILE", 1)
"----" A 0 A_ChangeFlag("BRIGHT", 1)
Goto Spawn2
}
}

actor MagmaBeamH3 : MagmaBeamH1
{
States
{
Spawn:
TNT1 A 0
TNT1 A 1 ACS_ExecuteAlways(3, 0)
Goto Spawn2
Spawn2:
MGMB F 1
MGMB F 0 A_JumpIfInTargetInventory("FrozenBeamFlag", 1, "FrozenConcrete")
MGMB F 0 A_JumpIfInTargetInventory("ConcreteBeamFlag", 1, "FrozenConcrete")
loop
Goto Spawn2
Thawing:
MGMB F 1
"----" A 0 A_JumpIfInTargetInventory("MagmaBeamFlag", 1, "Thawing")
"----" A 0 A_ChangeVelocity(Args[0], Args[1], 0, CVF_REPLACE)
"----" A 0 A_ChangeFlag("SOLID", 0)
"----" A 0 A_ChangeFlag("MISSILE", 1)
"----" A 0 A_ChangeFlag("BRIGHT", 1)
Goto Spawn2
}
}

actor MagmaArrowSpawner
{
	+NOGRAVITY
	+NOINTERACTION
	-SOLID
	Radius 1
	height 1
	Scale 2.0
	States
	{
		Spawn:
		MGMB G 0
		MGMB G 0 A_SpawnItemEx("MagmaArrow", 0, 0, -128)
		stop
	}
}

actor MagmaArrow
{
	+NOGRAVITY
	+NOINTERACTION
	-SOLID
	Radius 1
	height 1
	Scale 2.0
	states
	{
	Spawn:
		MGMB G 0
		MGMB G 0 A_JumpIf(z-floorz < 128, 2)
		MGMB G 0 A_SpawnItemEx("MagmaArrow", 0, 0, -128)// [Russ] recursion is fun
		MGMB GZGZGZGZGZG 4
		stop
	}
}

// an old formula was used, along with 0 tics to sync the body segments together
// but the wavy version looked cooler
// for N=0 to 9, 270-64*N in place of the X value on A_SpawnItemEx
// tail flame was spawned 26 units further forward

actor ChangkeyDragon
{
	-SOLID
	+NOINTERACTION
	+NOGRAVITY
	States
	{
	Spawn:
		TNT1 A 0
		TNT1 A 6 A_SpawnItemEx("MagmaDrakeHead", 0, 0, 0, 8, 0, 0)
		TNT1 A 6 A_SpawnItemEx("MagmaDrakeNeck", 0, 0, 0, 8, 0, 0)
		TNT1 A 6 A_SpawnItemEx("MagmaDrakeArms", 0, 0, 12, 8, 0, 0)
		TNT1 A 6 A_SpawnItemEx("MagmaDrakeNeck", 0, 0, 20, 8, 0, 0)
		TNT1 A 6 A_SpawnItemEx("MagmaDrakeNeck", 0, 0, 10, 8, 0, 0)
		TNT1 A 6 A_SpawnItemEx("MagmaDrakeLegs", 0, 0, 0, 8, 0, 0)
		TNT1 A 0 A_SpawnItemEx("MagmaDrakeNeck", 0, 0, -2, 8, 0, 0)
		TNT1 A 0 A_SpawnItemEx("MagmaDrakeTail", -64, 0, 0, 8, 0, 0)
		TNT1 A 0 A_SpawnItemex("MagmaDrakeTailFlame", -90, 0, 28, 8, 0, 0)
		stop
	}
}

actor ChangkeyDragonYashichi : ChangkeyDragon
{
	States
	{
	Spawn:
		TNT1 A 0
		TNT1 A 6 A_SpawnItemEx("MagmaDrakeHead", 0, 0, 0, 8, 0, 0)
		TNT1 A 6 A_SpawnItemEx("MagmaDrakeYashichi", 0, 0, 0, 8, 0, 0)
		TNT1 A 6 A_SpawnItemEx("MagmaDrakeArms", 0, 0, 12, 8, 0, 0)
		TNT1 A 6 A_SpawnItemEx("MagmaDrakeNeck", 0, 0, 20, 8, 0, 0)
		TNT1 A 6 A_SpawnItemEx("MagmaDrakeNeck", 0, 0, 10, 8, 0, 0)
		TNT1 A 6 A_SpawnItemEx("MagmaDrakeLegs", 0, 0, 0, 8, 0, 0)
		TNT1 A 0 A_SpawnItemEx("MagmaDrakeNeck", 0, 0, -2, 8, 0, 0)
		TNT1 A 0 A_SpawnItemEx("MagmaDrakeTail", -64, 0, 0, 8, 0, 0)
		TNT1 A 0 A_SpawnItemex("MagmaDrakeTailFlame", -90, 0, 28, 8, 0, 0)
		stop
	}
}

actor MagmaDrakeHead
{
	PROJECTILE
	+DONTBLAST
	+DONTREFLECT
	+RIPPER
	-NOBLOCKMAP
    +SHOOTABLE
    +NOTAUTOAIMED
    +NODAMAGE
    +NOBLOOD
	+BRIGHT
    mass 999999
	Damagetype "ChangekeyDragon"
	Painchance "Normal", 0
	Painchance "BlackHoleBomb", 256
	height 10
	radius 5
	Speed 0
	Damage (5)
	scale 2.5
	States
	{
	Spawn:
		CGDR AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1 A_Weave(0, 1.5, 0, 5.0)
		CGDR AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1 A_Weave(0, 1.5, 0, 5.0)
		CGDR BBBBB 1 A_Weave(0, 1.5, 0, 5.0)
		loop
	Pain:
		CGDR R 0 A_ChangeFlag(NOPAIN, true)
		CGDR R 0 A_ChangeFlag(BRIGHT, false)
		CGDR R 1 A_Weave(0, 1.5, 0, 5.0)
		wait
	}
}

actor MagmaDrakeNeck : MagmaDrakeHead
{
	States
	{
	Spawn:
		CGDR DDDDDEEEEE 1 A_Weave(0, 1.5, 0, 5.0)
		loop
	Pain:
		CGDR C 0 A_ChangeFlag(NOPAIN, true)
		CGDR C 0 A_ChangeFlag(BRIGHT, false)
		CGDR F 1 A_Weave(0, 1.5, 0, 5.0)
		wait
	}
}

actor MagmaDrakeLegs : MagmaDrakeHead
{
	States
	{
	Spawn:
		CGDR GGGGGHHHHH 1 A_Weave(0, 1.5, 0, 5.0)
		loop
	Pain:
		CGDR C 0 A_ChangeFlag(NOPAIN, true)
		CGDR C 0 A_ChangeFlag(BRIGHT, false)
		CGDR I 1 A_Weave(0, 1.5, 0, 5.0)
		wait
	}
}

actor MagmaDrakeArms : MagmaDrakeHead
{
	States
	{
	Spawn:
		CGDR JJJJJKKKKK 1 A_Weave(0, 1.5, 0, 5.0)
		loop
	Pain:
		CGDR C 0 A_ChangeFlag(NOPAIN, true)
		CGDR C 0 A_ChangeFlag(BRIGHT, false)
		CGDR L 1 A_Weave(0, 1.5, 0, 5.0)
		wait
	}
}

actor MagmaDrakeTail : MagmaDrakeHead
{
	-SHOOTABLE
	+NOBLOCKMAP
	States
	{
	Spawn:
		CGDR C 0 A_ChangeFlag(NOPAIN, true)
		CGDR C 0 A_ChangeFlag(BRIGHT, false)
		CGDR M 1 A_Weave(0, 1.5, 0, 5.0)
		wait
	}
}


actor MagmaDrakeTailFlame : MagmaDrakeHead
{
	States
	{
	Spawn:
		CGDR NNNNNOOOOO 1 A_Weave(0, 1.5, 0, 5.0)
		loop
	Pain:
		CGDR Z 0
		stop
	}
}

actor MagmaDrakeYashichi : MagmaDrakeHead
{
	States
	{
	Spawn:
		CGDR PPPPPQQQQQ 1 A_Weave(0, 1.5, 0, 5.0)
		loop
	Pain:
		CGDR C 0 A_ChangeFlag(NOPAIN, true)
		CGDR C 0 A_ChangeFlag(BRIGHT, false)
		YASH A 1 A_Weave(0, 1.5, 0, 5.0)
		wait
	}
}