FreeSlot
SPR_TRL2
SPR_WCRY
S_BossXChaseA
S_BossXChaseB
S_Boss_Stand
S_Boss_Flee1
S_Boss_Flee2
S_Boss_Flee3
S_Boss_Flee4
S_Boss_Flee5
S_Boss_Flee6
MT_XBoss
S_XBoss_TriSpark1
S_XBoss_TriSpark2
S_XBoss_TriSpark3
S_XBoss_TriSpark4
S_XBoss_TriSpark5
S_XBoss_TriSpark6
S_XBoss_TriSpark7
S_XBoss_TriSpark8
S_XBoss_STF1
S_XBoss_STF2
S_XBoss_STF3
S_XBoss_STF4
S_XBoss_Panic1
S_XBoss_Panic2
S_XBoss_Pain1
S_XBoss_Pain2
S_XBoss_Pain3
S_XBoss_Pain4
S_XBoss_Pain5
MT_SparkMortar
S_SparkMortar_Prep1
S_SparkMortar_Prep2
S_SparkMortar_1
S_SparkMortar_2
S_SparkMortar_3
S_SparkMortar_4
S_SparkMortar_Explode
MT_SparkHelper
S_SparkHelper_Prep
S_SparkHelper_1
S_SparkHelper_2
MT_SparkDebris
S_SparkDebris
S_SparkDebris_Wait1
S_SparkDebris_Wait2
S_SparkDebris_Wait3
S_SparkDebris_Wait4
S_SparkDebris_Wait5
S_SparkDebris_Wait6
S_SparkDebris_Wait7
S_SparkDebris_Wait8
S_SparkDebris_Wait9
S_SparkDebris_Wait10
S_SparkDebris_Wait11
S_SparkDebris_Wait12
S_SparkDebris_Wait13
S_SparkDebris_Fire1
S_SparkDebris_Fire2
MT_STLaser
MT_STLaser2
S_STLaser
S_STLaserQExplode1
S_STLaserQExplode2
MT_TLaser2
MT_WCrystal
S_WCrystal_Prep1
S_WCrystal_Prep2
S_WCrystal_Prep3
S_WCrystal_Orbit
MT_CBuffer
S_CBuffer_Prep1
S_CBuffer_Prep2
S_CBuffer_1
S_CBuffer_2
MT_CRocket
S_CRocket_1
S_CRocket_2
MT_RocketFume
S_RocketFume_Prep
S_RocketFume_1
S_RocketFume_2

# MT_XBoss - Eggmobile X. Boss of Mystic Realm Zone.
#  Shoots STF, Spark Mortar, rings when in pinch(grumble), and spawns weapon crystals when hurt. Dashes frequently.
Thing MT_XBoss
MAPTHINGNUM = 253
SPAWNSTATE = S_Boss_Stand
SPAWNHEALTH = 12
SEESTATE = S_Boss_Stand
SEESOUND = 0
REACTIONTIME = 8
ATTACKSOUND = 0
PAINSTATE = S_XBoss_Pain1
PAINCHANCE = 71
PAINSOUND = SFX_dmpain
MELEESTATE = S_XBoss_STF1
MISSILESTATE = S_XBoss_TriSpark1
DEATHSTATE = S_EGGMOBILE_DIE1
DEATHSOUND = SFX_cybdth
XDEATHSTATE = S_Boss_Flee1
SPEED = 7
RADIUS = 24*FRACUNIT
HEIGHT = 48*FRACUNIT
MASS = 0
DAMAGE = 3
ACTIVESOUND = SFX_telept
RAISESTATE = S_XBoss_Panic1
FLAGS = MF_Special|MF_Shootable|MF_Boss|MF_NoGravity|MF_Float



# MT_WCrystal - Weapons Crystal
#  Spawned by and orbits Eggmobile X, and uses a buffer to fire at the player in intervals.
Thing MT_WCrystal
MAPTHINGNUM = -1
SPAWNSTATE = S_WCrystal_Prep1
SPAWNHEALTH = 1000
SEESTATE = 0
SEESOUND = 0
REACTIONTIME = 8
ATTACKSOUND = 0
PAINSTATE = 0
PAINCHANCE = 0
PAINSOUND = 0
MELEESTATE = 0
MISSILESTATE = 0
DEATHSTATE = S_NULL
DEATHSOUND = 0
XDEATHSTATE = 0
SPEED = 10*FRACUNIT
RADIUS = 12*FRACUNIT
HEIGHT = 36*FRACUNIT
MASS = 100
DAMAGE = 1
ACTIVESOUND = 0
RAISESTATE = 0
FLAGS = MF_NoGravity|MF_RunSpawnFunc
#+34193

#[2006] <Prime 2.0>
# Since having the crystal itself shoot(and renew its target) would make it change its
# position, instead I had it spawn something that would shoot for it, thus preserving the
# rotational cycle around eggman. Also of note is that A_SpikeBallRotate resets if it is interrupted by ANYTHING.

# MT_CBuffer - Crystal Buffer.
#  Fires CRockets at the player to make it look like the weapons crystal is doing it.
Thing MT_CBuffer
MAPTHINGNUM = -1
SPAWNSTATE = S_CBuffer_Prep1
SPAWNHEALTH = 1000
SEESTATE = 0
SEESOUND = 0
REACTIONTIME = 8
ATTACKSOUND = 0
PAINSTATE = 0
PAINCHANCE = 0
PAINSOUND = 0
MELEESTATE = 0
MISSILESTATE = 0
DEATHSTATE = S_NULL
DEATHSOUND = 0
XDEATHSTATE = 0
SPEED = 8
RADIUS = FRACUNIT
HEIGHT = FRACUNIT
MASS = 16
DAMAGE = 0
ACTIVESOUND = 0
RAISESTATE = 0
FLAGS = MF_NoSector|MF_NoBlockmap|MF_NoGravity|MF_Noclip|MF_Scenery|MF_RunSpawnFunc


# MT_CRocket - Crystal roc-oh who am I kidding, it's a freaking Crit rocket.
#  Supersonic-repulsing rocket fired by Crystal Buffer. Has a rocketfume to make it look cool!
Thing MT_CRocket
MAPTHINGNUM = -1
SPAWNSTATE = S_CRocket_1
SPAWNHEALTH = 1000
SEESTATE = S_CRocket_1
SEESOUND = SFX_rlaunc
REACTIONTIME = 8
ATTACKSOUND = 0
PAINSTATE = 0
PAINCHANCE = 0
PAINSOUND = 0
MELEESTATE = 0
MISSILESTATE = 0
DEATHSTATE = S_NULL
DEATHSOUND = 0
XDEATHSTATE = 0
SPEED = 24*FRACUNIT+37856
RADIUS = 11*FRACUNIT
HEIGHT = 8*FRACUNIT
MASS = 100
DAMAGE = 20
ACTIVESOUND = 0
RAISESTATE = 0
FLAGS = MF_NoBlockmap|MF_NoGravity|MF_Missile|MF_RunSpawnFunc


# MT_RocketFume - Jetfume object for the Crit Rocket
Thing MT_RocketFume
MAPTHINGNUM = -1
SPAWNSTATE = S_RocketFume_Prep
SPAWNHEALTH = 1000
SEESTATE = 0
SEESOUND = 0
REACTIONTIME = 8
ATTACKSOUND = 0
PAINSTATE = 0
PAINCHANCE = 0
PAINSOUND = 0
MELEESTATE = 0
MISSILESTATE = 0
DEATHSTATE = S_NULL
DEATHSOUND = 0
XDEATHSTATE = 0
SPEED = 1
RADIUS = 4*FRACUNIT
HEIGHT = 4*FRACUNIT
MASS = 4
DAMAGE = 0
ACTIVESOUND = 0
RAISESTATE = 0
FLAGS = MF_NoBlockmap|MF_NoGravity|MF_Noclip|MF_RunSpawnFunc


# MT_SparkMortar - Spark Mortar, the unmatched custom projectile!
#  Exploding projectile that "chases" the player with its explosion. Shot using A_SuperFireShot.
Thing MT_SparkMortar
MAPTHINGNUM = -1
SPAWNSTATE = S_SparkMortar_Prep1
SPAWNHEALTH = 1000
SEESTATE = 0
SEESOUND = sfx_s3k66
REACTIONTIME = 8
ATTACKSOUND = 0
PAINSTATE = 0
PAINCHANCE = 0
PAINSOUND = 0
MELEESTATE = 0
MISSILESTATE = 0
DEATHSTATE = S_SparkMortar_Explode
DEATHSOUND = sfx_s3k4e
XDEATHSTATE = 0
SPEED = 20*FRACUNIT
RADIUS = 12*FRACUNIT
HEIGHT = 8*FRACUNIT
MASS = 100
DAMAGE = 20
ACTIVESOUND = 0
RAISESTATE = 0
FLAGS = MF_NoBlockmap|MF_NoGravity|MF_Missile|MF_RunSpawnFunc


#[2006] <Prime 2.0>
#   I decided to do a bit of a re-write of the spark mortar effect. So rather than having some
#   25 states to make a full cycle of spawning the sparks and alternating between sprites,
#   it spawns an object that makes the invincibility sparks for it(while cape chasing) so that it only
#   has to do the sprite alternations. Which is nice. Very nice.

# MT_SparkHelper - Mortar Spark Helper
#  Spawns invincibility sparks for spark mortar.
Thing MT_SparkHelper
MAPTHINGNUM = -1
SPAWNSTATE = S_SparkHelper_Prep
SPAWNHEALTH = 1000
SEESTATE = 0
SEESOUND = 0
REACTIONTIME = 8
ATTACKSOUND = 0
PAINSTATE = 0
PAINCHANCE = 0
PAINSOUND = 0
MELEESTATE = 0
MISSILESTATE = 0
DEATHSTATE = S_NULL
DEATHSOUND = 0
XDEATHSTATE = 0
SPEED = 8
RADIUS = FRACUNIT
HEIGHT = FRACUNIT
MASS = 16
DAMAGE = 0
ACTIVESOUND = 0
RAISESTATE = 0
FLAGS = MF_NoSector|MF_NoBlockmap|MF_NoGravity|MF_Noclip|MF_Scenery|MF_RunSpawnFunc


# MT_SparkDebris - Spark Mortar Shrapnel
#  Shoots a projectile at the player when it dies at explosion radius.
Thing MT_SparkDebris
MAPTHINGNUM = -1
SPAWNSTATE = S_SparkDebris
SPAWNHEALTH = 1000
SEESTATE = 0
SEESOUND = SFX_pop
REACTIONTIME = 8
ATTACKSOUND = 0
PAINSTATE = 0
PAINCHANCE = 0
PAINSOUND = 0
MELEESTATE = 0
MISSILESTATE = 0
DEATHSTATE = S_SparkDebris_Wait1
DEATHSOUND = SFX_trfire
XDEATHSTATE = S_SparkDebris_Wait1
SPEED = 60*FRACUNIT
RADIUS = 16*FRACUNIT
HEIGHT = 24*FRACUNIT
MASS = 100
DAMAGE = 1
ACTIVESOUND = 0
RAISESTATE = 0
FLAGS = MF_NoBlockMap|MF_NoGravity|MF_Missile


# MT_STLaser - Spark Turret Laser. 
#  It's Blue! Faster than normal turretfire, used only with "super" firing actions. Mortar shrapnel fires this.
Thing MT_STLaser
MAPTHINGNUM = -1
SPAWNSTATE = S_STLaser
SPAWNHEALTH = 1000
SEESTATE = 0
SEESOUND = 0
REACTIONTIME = 8
ATTACKSOUND = 0
PAINSTATE = 0
PAINCHANCE = 0
PAINSOUND = 0
MELEESTATE = 0
MISSILESTATE = 0
DEATHSTATE = S_STLaserQExplode1
DEATHSOUND = SFX_turhit
XDEATHSTATE = 0
SPEED = 60*FRACUNIT
RADIUS = 12*FRACUNIT
HEIGHT = 24*FRACUNIT
MASS = 100
DAMAGE = 1
ACTIVESOUND = 0
RAISESTATE = 0
FLAGS = MF_NoBlockMap|MF_NoGravity|MF_Missile


# MT_STLaser2 - Super Turret Laser. 
#  It's just like STLaser, except it has a firing sound. Used by Eggmobile X. shrapnel fire this.
Thing MT_STLaser2
MAPTHINGNUM = -1
SPAWNSTATE = S_STLaser
SPAWNHEALTH = 1000
SEESTATE = 0
SEESOUND = SFX_trfire
REACTIONTIME = 8
ATTACKSOUND = 0
PAINSTATE = 0
PAINCHANCE = 0
PAINSOUND = 0
MELEESTATE = 0
MISSILESTATE = 0
DEATHSTATE = S_STLaserQExplode1
DEATHSOUND = SFX_turhit
XDEATHSTATE = 0
SPEED = 60*FRACUNIT
RADIUS = 12*FRACUNIT
HEIGHT = 24*FRACUNIT
MASS = 100
DAMAGE = 1
ACTIVESOUND = 0
RAISESTATE = 0
FLAGS = MF_NoBlockMap|MF_NoGravity|MF_Missile


# MT_TLaser2 - Turret Laser. 
#  It's just like regular turretfire, but it makes a firing sound from custom objects. Fired by Egg Fighter.
Thing MT_TLaser2
MAPTHINGNUM = -1
SPAWNSTATE = S_TURRETLASER
SPAWNHEALTH = 1000
SEESTATE = 0
SEESOUND = SFX_trfire
REACTIONTIME = 8
ATTACKSOUND = 0
PAINSTATE = 0
PAINCHANCE = 0
PAINSOUND = 0
MELEESTATE = 0
MISSILESTATE = 0
DEATHSTATE = S_TurretLaserExplode1
DEATHSOUND = SFX_turhit
XDEATHSTATE = 0
SPEED = 50*FRACUNIT
RADIUS = 12*FRACUNIT
HEIGHT = 24*FRACUNIT
MASS = 100
DAMAGE = 1
ACTIVESOUND = 0
RAISESTATE = 0
FLAGS = MF_NoBlockMap|MF_NoGravity|MF_Missile



# Spark Mortar death sound
SOUND sfx_s3k4e
PRIORITY = 64
FLAGS = 16


# Spark Mortar firing sound
SOUND sfx_s3k66
PRIORITY = 64
FLAGS = 16


# Spark Mortar charging sound
SOUND sfx_s3k84
PRIORITY = 64
FLAGS = 16


# TriSpark charging sound
SOUND sfx_s3k8e
PRIORITY = 64
FLAGS = 16

# DualAction references for custom boss standing frames.
FRAME S_BossXChaseA
ACTION A_TurretStop
VAR1 = 1

FRAME S_BossXChaseB
ACTION A_Boss1Chase


# [Spawn][See] Shared stand state for Egg Fighter & Eggmobile X. Cancels turretfire.
FRAME S_Boss_Stand
spritename = EGGM
SPRITESUBNUMBER = 0
DURATION = 1
NEXT = S_Boss_Stand
ACTION A_DualAction
VAR1 = S_BossXChaseA
VAR2 = S_BossXChaseB

#  S_TriSpark - Eggmobile X Fires 3 Spark Mortars and dashes backwards.

# [Missile] Eggman telegraphs the attack by raising his right hand.
FRAME S_XBoss_TriSpark1
spritename = EGGM
SPRITESUBNUMBER = 13
DURATION = 30
NEXT = S_XBoss_TriSpark2
ACTION A_PlaySound
VAR1 = sfx_s3k8e
VAR2 = 1

# Fires Spark Mortar (1)
FRAME S_XBoss_TriSpark2
spritename = EGGM
SPRITESUBNUMBER = 14
DURATION = 5
NEXT = S_XBoss_TriSpark3
ACTION A_SuperFireShot
VAR1 = MT_SparkMortar
VAR2 = 0

FRAME S_XBoss_TriSpark3
spritename = EGGM
SPRITESUBNUMBER = 13
DURATION = 5
NEXT = S_XBoss_TriSpark4
ACTION None

# Fires Spark Mortar (2)
FRAME S_XBoss_TriSpark4
spritename = EGGM
SPRITESUBNUMBER = 14
DURATION = 5
NEXT = S_XBoss_TriSpark5
ACTION A_SuperFireShot
VAR1 = MT_SparkMortar
VAR2 = 0

FRAME S_XBoss_TriSpark5
spritename = EGGM
SPRITESUBNUMBER = 13
DURATION = 5
NEXT = S_XBoss_TriSpark6
ACTION None

# Fires Spark Mortar (3)
FRAME S_XBoss_TriSpark6
spritename = EGGM
SPRITESUBNUMBER = 14
DURATION = 5
NEXT = S_XBoss_TriSpark7
ACTION A_SuperFireShot
VAR1 = MT_SparkMortar
VAR2 = 0

FRAME S_XBoss_TriSpark7
spritename = EGGM
SPRITESUBNUMBER = 3
DURATION = 5
NEXT = S_XBoss_TriSpark8
ACTION None

# Eggman dashes away from the player.
FRAME S_XBoss_TriSpark8
spritename = EGGM
SPRITESUBNUMBER = 4
DURATION = 5
NEXT = S_Boss_Stand
ACTION A_SkullAttack
VAR1 = 1


#  S_STF - SuperTurretFire. Eggmobile X fires supersonic-repulsing blue turretfire while dashing sideways.

# [Melee] Eggman telegraphs the attack by raising his left hand
FRAME S_XBoss_STF1
spritename = EGGM
SPRITESUBNUMBER = 3
DURATION = 30
NEXT = S_XBoss_STF2
ACTION None

# Begins firing Blue turretfire
FRAME S_XBoss_STF2
spritename = EGGM
SPRITESUBNUMBER = 4
DURATION = 15
NEXT = S_XBoss_STF3
ACTION A_SuperTurretFire
VAR1 = MT_STLaser2
VAR2 = 2048

FRAME S_XBoss_STF3
spritename = EGGM
SPRITESUBNUMBER = 3
DURATION = 10
NEXT = S_XBoss_STF4
ACTION None

# Eggman dashes sideways.
FRAME S_XBoss_STF4
spritename = EGGM
SPRITESUBNUMBER = 4
DURATION = 60
NEXT = S_Boss_Stand
ACTION A_SkullAttack
VAR1 = 2


#  S_XBoss_Panic - Eggmobile X tosses some Auto-rings at you because I couldn't get the original idea to work right.

# XBoss_Panic1 - [Raise] Eggman telegraphs the attack by raising his left hand
FRAME S_XBoss_Panic1
spritename = EGGM
SPRITESUBNUMBER = 3
DURATION = 30
NEXT = S_XBoss_Panic2
ACTION None

# XBoss_Panic2 - Fires Auto-rings. Dashes sideways next.
FRAME S_XBoss_Panic2
spritename = EGGM
SPRITESUBNUMBER = 4
DURATION = 10
NEXT = S_XBoss_STF3
ACTION A_SuperTurretFire
VAR1 = MT_THROWNAUTOMATIC
VAR2 = 4096


#  S_XBoss_Pain - Eggmobile X summons a weapons crystal to assist him.

# [Pain] You hit Eggmobile X! Halts turretfire, plays pain sound, zero duration.
FRAME S_XBoss_Pain1
spritename = EGGM
SPRITESUBNUMBER = 21
DURATION = 0
NEXT = S_XBoss_Pain2
ACTION A_DualAction
VAR1 = S_EGGMOBILE_PAIN
VAR2 = S_Boss_Stand
#  [DualAction: S_EGGMOBILE_PAIN(Pain), Boss_Stand(TurretStop)]

# Causes Eggman to Recoil from your hit. Standing in the middle is harder now.
FRAME S_XBoss_Pain2
spritename = EGGM
SPRITESUBNUMBER = 21
DURATION = 10
NEXT = S_XBoss_Pain3
ACTION A_Thrust
VAR1 = -4
VAR2 = 0


# Decellerates by one by replacing momentum
FRAME S_XBoss_Pain3
spritename = EGGM
SPRITESUBNUMBER = 3
DURATION = 5
NEXT = S_XBoss_Pain4
ACTION A_Thrust
VAR1 = -2
VAR2 = 1

# Stops by cancelling out remaining moemntum
FRAME S_XBoss_Pain4
spritename = EGGM
SPRITESUBNUMBER = 3
DURATION = 5
NEXT = S_XBoss_Pain5
ACTION A_Thrust
VAR1 = 2
VAR2 = 0

# Spawns a weapons crystal to assist Eggman, there'll be 11 of them by the end of the fight!
FRAME S_XBoss_Pain5
spritename = EGGM
SPRITESUBNUMBER = 4
DURATION = 4
NEXT = S_Boss_Stand
ACTION A_SpawnObjectRelative
VAR1 = 0
VAR2 = MT_WCrystal


# S_Flee - The final bosses make an explosive exit so that last victory is particularly satisfying.

# [XDeath] 3 explosions and 6 tics before swapping to sweat frame
FRAME S_Boss_Flee1
spritename = EGGM
SPRITESUBNUMBER = 23
DURATION = 2
NEXT = S_Boss_Flee2
ACTION A_BossScream

# No sweat, Explosion 2
FRAME S_Boss_Flee2
spritename = EGGM
SPRITESUBNUMBER = 23
DURATION = 2
NEXT = S_Boss_Flee3
ACTION A_BossScream

# No sweat, Explosion 3
FRAME S_Boss_Flee3
spritename = EGGM
SPRITESUBNUMBER = 23
DURATION = 1
NEXT = S_Boss_Flee4
ACTION A_BossScream

# Eggman is sweating, and will continue for 3 frames/6 tics.
FRAME S_Boss_Flee4
spritename = EGGM
SPRITESUBNUMBER = 24
DURATION = 1
NEXT = S_Boss_Flee5
ACTION none

# Sweat, Explosion 2
FRAME S_Boss_Flee5
spritename = EGGM
SPRITESUBNUMBER = 24
DURATION = 2
NEXT = S_Boss_Flee6
ACTION A_BossScream

# Sweat, Explosion 3.
FRAME S_Boss_Flee6
spritename = EGGM
SPRITESUBNUMBER = 24
DURATION = 2
NEXT = S_Boss_Flee1
ACTION A_BossScream

# [Spawn] Adds the "act like a rail ring" flags2 value to give the projectile greater knockback.
FRAME S_SparkMortar_Prep1
spritename = SSPK
SPRITESUBNUMBER = 32768
DURATION = 1
NEXT = S_SparkMortar_Prep2
ACTION A_SetObjectFlags2
VAR1 = MF2_RAILRING
VAR2 = 2

# Spawns SparkHelper
FRAME S_SparkMortar_Prep2
spritename = SSPK
SPRITESUBNUMBER = 32768
DURATION = 1
NEXT = S_SparkMortar_1
ACTION A_SpawnObjectRelative
VAR1 = 0
VAR2 = MT_SparkHelper

# 4 Frame SuperSpark sprite loop
FRAME S_SparkMortar_1
spritename = SSPK
SPRITESUBNUMBER = 32769
DURATION = 2
NEXT = S_SparkMortar_2
ACTION None

FRAME S_SparkMortar_2
spritename = SSPK
SPRITESUBNUMBER = 32770
DURATION = 2
NEXT = S_SparkMortar_3
ACTION None

FRAME S_SparkMortar_3
spritename = SSPK
SPRITESUBNUMBER = 32769
DURATION = 2
NEXT = S_SparkMortar_4
ACTION None

# Animation loops
FRAME S_SparkMortar_4
spritename = SSPK
SPRITESUBNUMBER = 32768
DURATION = 2
NEXT = S_SparkMortar_1
ACTION None


# [Death] Spawns shrapnel like a 1.09 bomb ring and heads to xplod frames
FRAME S_SparkMortar_Explode
SpriteName = NULL
SPRITESUBNUMBER = 0
DURATION = 40
NEXT = S_NULL
ACTION A_OldRingExplode
Var1 = MT_SparkDebris



# SparkHelper_Prep - [Spawn] Sets Spark Mortar to Tracer
FRAME S_SparkHelper_Prep
SpriteName = NULL
SPRITESUBNUMBER = 0
DURATION = 5
NEXT = S_SparkHelper_1
ACTION A_FindTracer
VAR1 = MT_SparkMortar
VAR2 = 0

# SparkHelper_1 - Zero duration, capechases Spark Mortar; Capechase tracer reference
FRAME S_SparkHelper_1
SpriteName = NULL
SPRITESUBNUMBER = 0
DURATION = 0
NEXT = S_SparkHelper_2
ACTION A_CapeChase
Var1 = 1
Var2 = 0
#  [Ref1: CBuffer_Chase1]

# SparkHelper_2 - Spawns invincibility spark, waits 5 tics before repeating
FRAME S_SparkHelper_2
SpriteName = NULL
SPRITESUBNUMBER = 0
DURATION = 5
NEXT = S_SparkHelper_1
ACTION A_SpawnObjectRelative
VAR1 = 0
VAR2 = MT_IVSP
# {Next: SparkHelper_1}



# SparkDebris - [Spawn] Spawned with A_OldRingExplode, so it'll die when it reaches the end radius.
FRAME S_SparkDebris
spritename = TRLS
SPRITESUBNUMBER = 0
DURATION = -1
NEXT = 0
ACTION None


# SparkDebris_Wait1 - [Death] Death animation until SparkDebris_Fire1
FRAME S_SparkDebris_Wait1
spritename = TRLS
SPRITESUBNUMBER = 0
DURATION = 1
NEXT = S_SparkDebris_Wait2
ACTION None

FRAME S_SparkDebris_Wait2
spritename = TRL2
SPRITESUBNUMBER = 32768
DURATION = 1
NEXT = S_SparkDebris_Wait3
ACTION None

FRAME S_SparkDebris_Wait3
spritename = TRLS
SPRITESUBNUMBER = 1
DURATION = 1
NEXT = S_SparkDebris_Wait4
ACTION None

FRAME S_SparkDebris_Wait4
spritename = TRL2
SPRITESUBNUMBER = 32769
DURATION = 1
NEXT = S_SparkDebris_Wait5
ACTION None

FRAME S_SparkDebris_Wait5
spritename = TRLS
SPRITESUBNUMBER = 2
DURATION = 1
NEXT = S_SparkDebris_Wait6
ACTION None

FRAME S_SparkDebris_Wait6
spritename = TRL2
SPRITESUBNUMBER = 32770
DURATION = 1
NEXT = S_SparkDebris_Wait7
ACTION None

# loop the first 6 frames
FRAME S_SparkDebris_Wait7
spritename = TRLS
SPRITESUBNUMBER = 0
DURATION = 1
NEXT = S_SparkDebris_Fire1
ACTION A_Repeat
VAR1 = 1
VAR2 = S_SparkDebris_Wait1

# Shrapnel finds the nearest player and sets it to Target.
FRAME S_SparkDebris_Fire1
spritename = TRL2
SPRITESUBNUMBER = 32768
DURATION = 1
NEXT = S_SparkDebris_Fire2
ACTION A_FindTarget
Var1 = MT_PLAYER
Var2 = 0
#  [Ref2: CBuffer_1]

# Shrapnel fires STLaser at target and dissapears, making it look like it homed in.
FRAME S_SparkDebris_Fire2
spritename = TRLS
SPRITESUBNUMBER = 1
DURATION = 2
NEXT = S_NULL
ACTION A_SuperFireShot
VAR1 = MT_STLaser
VAR2 = 0



# [Spawn] Supersonic-repulsing blue turret laser.
FRAME S_STLaser
spritename = TRL2
SPRITESUBNUMBER = 32768
DURATION = 1
NEXT = S_STLaser
ACTION None


# [Death] Laser has hit something.
FRAME S_STLaserQExplode1
spritename = TRL2
SPRITESUBNUMBER = 32769
DURATION = 2
NEXT = S_STLaserQExplode2
ACTION None

# Finishes death animation, dissapears
FRAME S_STLaserQExplode2
spritename = TRL2
SPRITESUBNUMBER = 32770
DURATION = 2
NEXT = S_NULL
ACTION None


#####################


#  Weapons Crystal - Orbits eggman while a buffer object capechases it and fires at the player.

# [Spawn] Waits first tic before performing any actions
FRAME S_WCrystal_Prep1
spritename = WCRY
SPRITESUBNUMBER = 0
DURATION = 1
NEXT = S_WCrystal_Prep2
ACTION none

# Spawns Crystal Buffer
FRAME S_WCrystal_Prep2
spritename = WCRY
SPRITESUBNUMBER = 0
DURATION = 1
NEXT = S_WCrystal_Prep3
ACTION A_SpawnObjectRelative
VAR1 = 0
VAR2 = MT_CBuffer

# Sets Eggmobile X as its target
FRAME S_WCrystal_Prep3
spritename = WCRY
SPRITESUBNUMBER = 0
DURATION = 1
NEXT = S_WCrystal_Orbit
ACTION A_FindTarget
VAR1 = MT_XBoss
VAR2 = 0

# Orbits around eggman while the buffer does the work.
FRAME S_WCrystal_Orbit
spritename = WCRY
SPRITESUBNUMBER = 0
DURATION = 1
NEXT = S_WCrystal_Orbit
ACTION A_RotateSpikeBall



#  Crit Buffer - Fires crit rockets for the weapons crystal, letting it use SpikeBallRotate uninterrupted.

# [Spawn] Waits a tic before performing actions
FRAME S_CBuffer_Prep1
SpriteName = NULL
SPRITESUBNUMBER = 0
DURATION = 1
NEXT = S_CBuffer_Prep2
ACTION none

# Sets Weapons Crystal as its tracer, 49 tics(50 tics with spawn)
FRAME S_CBuffer_Prep2
SpriteName = NULL
SPRITESUBNUMBER = 0
DURATION = 54
NEXT = S_CBuffer_1
ACTION A_FindTracer
Var1 = MT_WCrystal
Var2 = 0

# Uses DualAction to capechase Tracer and set Target to the nearest player; zero duration.
FRAME S_CBuffer_1
SpriteName = NULL
SPRITESUBNUMBER = 0
DURATION = 0
NEXT = S_CBuffer_2
ACTION A_DualAction
Var1 = S_SparkHelper_1
Var2 = S_SparkDebris_Fire1
#  [DualAction: SparkHelper_1(Capechase), SparkDebris_Fire1(SetTarget)] 

# Fires CRocket at Target, waits 50 tics
FRAME S_CBuffer_2
SpriteName = NULL
SPRITESUBNUMBER = 0
DURATION = 55
NEXT = S_CBuffer_1
ACTION A_SuperFireShot
Var1 = MT_CRocket
Var2 = 0



# CritRocket: Rocket-propelled Supersonic-repulsing torpedo

# [Spawn][See] Spawns jetfume object
FRAME S_CRocket_1
spritename = TORP
SPRITESUBNUMBER = 0
DURATION = 1
NEXT = S_CRocket_2
ACTION A_SpawnObjectRelative
Var1 = 0
Var2 = MT_RocketFume

# Sets Eggmobile X to target so it doesn't hurt him.
FRAME S_CRocket_2
spritename = TORP
SPRITESUBNUMBER = 0
DURATION = 0
NEXT = S_TORPEDO
ACTION A_FindTarget
VAR1 = MT_XBoss
VAR2 = 0



# [Spawn] Sets tracer to CRocket MT_CRocket
FRAME S_RocketFume_Prep
spritename = JETF
SPRITESUBNUMBER = 0
DURATION = 1
NEXT = S_RocketFume_1
ACTION A_FindTracer
VAR1 = MT_CRocket
VAR2 = 0

# Jetfume animation 1
FRAME S_RocketFume_1
SpriteName = NULL
SPRITESUBNUMBER = 0
DURATION = 1
NEXT = S_RocketFume_2
ACTION A_CapeChase
VAR1 = -8*FRACUNIT+1
VAR2 = -24*FRACUNIT

# Jetfume animation 2
FRAME S_RocketFume_2
spritename = JETF
SPRITESUBNUMBER = 0
DURATION = 1
NEXT = S_RocketFume_1
ACTION A_CapeChase
VAR1 = -8*FRACUNIT+1
VAR2 = -24*FRACUNIT

Thing MT_EXPLOSION
MAPTHINGNUM = 444
SPAWNSTATE = S_EXPLOSION
SPAWNHEALTH = 1000
SEESTATE = S_NULL
SEESOUND = 0
REACTIONTIME = 8
ATTACKSOUND = 0
PAINSTATE = S_NULL
PAINCHANCE = 71
PAINSOUND = SFX_dmpain
MELEESTATE = S_NULL
MISSILESTATE = S_NULL
DEATHSTATE = S_NULL
DEATHSOUND = SFX_cybdth
XDEATHSTATE = S_NULL
SPEED = 10*FRACUNIT
RADIUS = 24*FRACUNIT
HEIGHT = 48*FRACUNIT
MASS = 0
DAMAGE = 3
ACTIVESOUND = SFX_none
RAISESTATE = S_NULL
FLAGS = MF_NoGravity

FRAME S_EXPLOSION
spritename = NULL
SPRITESUBNUMBER = A
DURATION = -1
NEXT = S_EXPLOSION
Action A_MouseThink