-- Freeslots --

-- Constants
rawset(_G, "FLCHANUPGRADED", 0)
rawset(_G, "BOOMBOXSPAWNED", 0)
rawset(_G, "WATERLOGGED", 0)
rawset(_G, "DRIPPEDOUT", 0)

-- Sprites
freeslot("SPR2_MICG", "SPR2_MICA", "SPR_DMIC", "SPR_BOOM", "SPR_KBEX", "SPR2_BSET", "SPR2_BACT", "SPR_KBIN")
freeslot("SPR_CHFS", "SPR_CHAU", "SPR_UWFS", "SPR_WCFS", "SPR2_FSHT", "SPR2_EDRP")

-- States
freeslot("S_MICDROP", "S_MICDROP_FIN", "S_MDAIR", "S_MDAIR_FIN", "S_DROPPEDMIC", "S_SHOCKWAVE", "S_KABOOMBOX", "S_AUTODETONATE", "S_KBBSETUP", "S_KBBACTIVATE", "S_KBBACTIVATE_FIN", "S_KBBINDICATOR")
freeslot("S_STARTFLIGHT", "S_FLAMESTINGER", "S_FLAMESTINGER_CONT", "S_CHARGEDFS", "S_WATERFS", "S_WATERFS_CONT", "S_WATERCFS", "S_FLYSHOOT", "S_FLYSHOOT_FIN", "S_EMBER_DRIP")
for i = 1,6
	freeslot("S_BOOMBOX_EXPL"..i)
end
for i = 1,5
	freeslot("S_CHARGEDFS_DIE"..i)
end
for i = 1,4
	freeslot("S_CHARGEAURA"..i)
end
for i = 1,2
	freeslot("S_WATERFS_TRAIL"..i)
end
for i = 1,5
	freeslot("S_WATERCFS_DIE"..i)
end
for i = 1,4
	freeslot("S_MBSPINDASH"..i)
end

-- Objects
freeslot("MT_DROPPEDMIC", "MT_SHOCKWAVE1", "MT_SHOCKWAVE2", "MT_KABOOMBOX")
freeslot("MT_FLAMESTINGER", "MT_CHARGEDFS", "MT_CHARGEAURA", "MT_WATERFS", "MT_WATERFS_TRAIL", "MT_WATERCFS")
for i = 1,2
	freeslot("MT_SHOCKWAVE"..i)
end

-- Sounds
freeslot("sfx_burnin")
freeslot("sfx_mospin", "sfx_mojump", "sfx_moskid", "sfx_moddsh", "sfx_mosoup")

states[S_MICDROP] = {
	sprite = SPR_PLAY,
	frame = SPR2_MICG|FF_SPR2ENDSTATE,
	tics = 2,
	action = A_ForceStop,
	var1 = S_MICDROP_FIN,
	nextstate = S_MICDROP
}

states[S_MICDROP_FIN] = {
	sprite = SPR_PLAY,
	frame = SPR2_MICG,
	tics = 15,
	action = A_ForceStop,
	var1 = S_PLAY_STND,
	nextstate = S_PLAY_STND
}

states[S_MDAIR] = {
	sprite = SPR_PLAY,
	frame = SPR2_MICA|FF_SPR2ENDSTATE,
	tics = 2,
	var1 = S_MDAIR_FIN,
	nextstate = S_MDAIR
}

states[S_MDAIR_FIN] = {
	sprite = SPR_PLAY,
	frame = SPR2_MICA,
	tics = 15,
	var1 = S_PLAY_FALL,
	nextstate = S_PLAY_FALL
}

states[S_DROPPEDMIC] = {
	sprite = SPR_DMIC,
	frame = A,
	tics = -1,
	action = A_DropMine
}

states[S_SHOCKWAVE] = {
	sprite = SPR_NULL,
	frame = A,
	tics = 1,
	action = nil,
	nextstate = S_NULL
}

states[S_KABOOMBOX] = {
	sprite = SPR_BOOM,
	frame = A,
	tics = -1,
	action = nil,
	nextstate = S_KABOOMBOX
}

states[S_BOOMBOX_EXPL1] = {SPR_KBEX, A, 1, A_SetObjectFlags, MF_NOGRAVITY|MF_PAIN, 0, S_BOOMBOX_EXPL2}
states[S_BOOMBOX_EXPL2] = {SPR_KBEX, A, 1, A_Scream, 0, 0, S_BOOMBOX_EXPL3}
states[S_BOOMBOX_EXPL3] = {SPR_KBEX, FF_FULLBRIGHT|FF_ANIMATE, 14, nil, 6, 2, S_NULL}
states[S_BOOMBOX_EXPL4] = {SPR_KBEX, A, 1, A_SetObjectFlags, MF_NOGRAVITY|MF_PAIN, 0, S_BOOMBOX_EXPL5}
states[S_BOOMBOX_EXPL5] = {SPR_KBEX, A, 1, A_Scream, 0, 0, S_BOOMBOX_EXPL6}
states[S_BOOMBOX_EXPL6] = {SPR_KBEX, FF_FULLBRIGHT|FF_ANIMATE, 14, nil, 6, 2, S_NULL}

states[S_AUTODETONATE] = {
	sprite = SPR_BOOM,
	frame = B,
	tics = 10,
	action = A_Pain,
	nextstate = S_BOOMBOX_EXPL4
}

states[S_KBBSETUP] = {
	sprite = SPR_PLAY,
	frame = SPR2_BSET|FF_SPR2ENDSTATE,
	tics = 10,
	action = A_ForceStop,
	nextstate = S_PLAY_STND
}

states[S_KBBACTIVATE] = {
	sprite = SPR_PLAY,
	frame = SPR2_BACT|FF_SPR2ENDSTATE,
	tics = 3,
	action = A_ForceStop,
	var1 = S_KBBACTIVATE_FIN,
	nextstate = S_KBBACTIVATE
}

states[S_KBBACTIVATE_FIN] = {
	sprite = SPR_PLAY,
	frame = SPR2_BACT,
	tics = 15,
	action = A_ForceStop,
	var1 = S_PLAY_FALL,
	nextstate = S_PLAY_FALL
}

states[S_KBBINDICATOR] = {
	sprite = SPR_KBIN,
	frame = FF_FULLBRIGHT|FF_ANIMATE|0,
	tics = -1,
	action = nil,
	var1 = 4,
	var2 = 4,
	nextstate = S_NULL
}

states[S_STARTFLIGHT] = {
	sprite = SPR_PLAY,
	frame = SPR2_IDLE,
	tics = 1,
	var1 = S_PLAY_JUMP,
	nextstate = S_PLAY_JUMP
}

states[S_FLAMESTINGER] = {
	sprite = SPR_FBLL,
	frame = FF_FULLBRIGHT,
	tics = 1,
	action = A_FireShot,
	nextstate = S_FLAMESTINGER_CONT
}

states[S_FLAMESTINGER_CONT] = {
	sprite = SPR_FBLL,
	frame = FF_FULLBRIGHT,
	tics = 1,
	action = A_SpawnObjectRelative,
	var1 = 0,
	var2 = MT_FIREBALLTRAIL,
	nextstate = S_FLAMESTINGER_CONT
}

states[S_CHARGEDFS] = {
	sprite = SPR_CHFS,
	frame = A,
	tics = 30,
	action = A_FireShot,
	nextstate = S_CHARGEDFS_DIE1
}

states[S_CHARGEDFS_DIE1] = {SPR_CHFS, A|FF_TRANS80, 2, nil, 0, 0, S_CHARGEDFS_DIE2}
states[S_CHARGEDFS_DIE2] = {SPR_CHFS, A|FF_TRANS60, 2, nil, 0, 0, S_CHARGEDFS_DIE3}
states[S_CHARGEDFS_DIE3] = {SPR_CHFS, A|FF_TRANS40, 2, nil, 0, 0, S_CHARGEDFS_DIE4}
states[S_CHARGEDFS_DIE4] = {SPR_CHFS, A|FF_TRANS20, 2, nil, 0, 0, S_CHARGEDFS_DIE5}
states[S_CHARGEDFS_DIE5] = {SPR_CHFS, B, 2, nil, 0, 0, S_NULL}

states[S_CHARGEAURA1] = {SPR_CHAU, A|FF_TRANS50, 5, nil, 0, 0, S_CHARGEAURA2}
states[S_CHARGEAURA2] = {SPR_CHAU, B|FF_TRANS50, 5, nil, 0, 0, S_CHARGEAURA1}
states[S_CHARGEAURA3] = {SPR_CHAU, A, 5, nil, 0, 0, S_CHARGEAURA4}
states[S_CHARGEAURA4] = {SPR_CHAU, B, 5, nil, 0, 0, S_CHARGEAURA3}

states[S_WATERFS] = {
	sprite = SPR_UWFS,
	frame = FF_FULLBRIGHT,
	tics = 1,
	action = A_FireShot,
	nextstate = S_WATERFS_CONT
}

states[S_WATERFS_CONT] = {
	sprite = SPR_UWFS,
	frame = FF_FULLBRIGHT,
	tics = 1,
	action = A_SpawnObjectRelative,
	var1 = 0,
	var2 = MT_WATERFS_TRAIL,
	nextstate = S_WATERFS_CONT
}

states[S_WATERFS_TRAIL1] = {SPR_UWFS, 1|FF_FULLBRIGHT|FF_TRANS50, 1, A_SetScale, FRACUNIT*3/4, 0, S_WATERFS_TRAIL2}
states[S_WATERFS_TRAIL2] = {SPR_UWFS, 1|FF_FULLBRIGHT|FF_TRANS50, 8, A_SetScale, FRACUNIT/6, 1, S_NULL}

states[S_WATERCFS] = {
	sprite = SPR_WCFS,
	frame = A,
	tics = 30,
	action = A_FireShot,
	nextstate = S_WATERCFS_DIE1
}

states[S_WATERCFS_DIE1] = {SPR_WCFS, A|FF_TRANS80, 2, nil, 0, 0, S_WATERCFS_DIE2}
states[S_WATERCFS_DIE2] = {SPR_WCFS, A|FF_TRANS60, 2, nil, 0, 0, S_WATERCFS_DIE3}
states[S_WATERCFS_DIE3] = {SPR_WCFS, A|FF_TRANS40, 2, nil, 0, 0, S_WATERCFS_DIE4}
states[S_WATERCFS_DIE4] = {SPR_WCFS, A|FF_TRANS20, 2, nil, 0, 0, S_WATERCFS_DIE5}
states[S_WATERCFS_DIE5] = {SPR_WCFS, B, 2, nil, 0, 0, S_NULL}

states[S_FLYSHOOT] = {
	sprite = SPR_PLAY,
	frame = SPR2_FSHT|FF_SPR2ENDSTATE,
	tics = 2,
	var1 = S_FLYSHOOT_FIN,
	nextstate = S_FLYSHOOT
}

states[S_FLYSHOOT_FIN] = {
	sprite = SPR_PLAY,
	frame = SPR2_FSHT,
	tics = 15,
	var1 = S_PLAY_JUMP,
	nextstate = S_PLAY_JUMP
}

states[S_EMBER_DRIP] = {
	sprite = SPR_PLAY,
	frame = SPR2_EDRP,
	tics = 1,
	action = A_ForceStop,
	nextstate = S_EMBER_DRIP
}

states[S_MBSPINDASH1] = {SPR_PLAY, SPR2_RUN_1, 1, nil, 0, 0, S_MBSPINDASH2}
states[S_MBSPINDASH2] = {SPR_PLAY, SPR2_RUN_2, 1, nil, 0, 0, S_MBSPINDASH3}
states[S_MBSPINDASH3] = {SPR_PLAY, SPR2_RUN_3, 1, nil, 0, 0, S_MBSPINDASH4}
states[S_MBSPINDASH4] = {SPR_PLAY, SPR2_RUN_4, 1, nil, 0, 0, S_MBSPINDASH1}

mobjinfo[MT_DROPPEDMIC] = {
	spawnstate = S_DROPPEDMIC,
	spawnhealth = 1,
	height = 8*FRACUNIT,
	radius = 11*FRACUNIT,
	speed = 20*FRACUNIT,
	deathstate = S_XPLD1,
	deathsound = sfx_bsnipe,
	flags = MF_NOBLOCKMAP|MF_MISSILE
}

mobjinfo[MT_SHOCKWAVE1] = {
	spawnstate = S_SHOCKWAVE,
	spawnhealth = 1,
	height = 50*FRACUNIT,
	radius = 200*FRACUNIT,
	speed = 0*FRACUNIT,
	deathstate = S_NULL,
	flags = MF_NOGRAVITY|MF_MISSILE
}

mobjinfo[MT_SHOCKWAVE2] = {
	spawnstate = S_SHOCKWAVE,
	spawnhealth = 1,
	height = 50*FRACUNIT,
	radius = 400*FRACUNIT,
	speed = 0*FRACUNIT,
	deathstate = S_NULL,
	flags = MF_NOGRAVITY|MF_MISSILE
}

mobjinfo[MT_KABOOMBOX] = {
	spawnstate = S_KABOOMBOX,
	spawnhealth = 1,
	height = 32*FRACUNIT,
	radius = 10*FRACUNIT,
	speed = 0*FRACUNIT,
	deathstate = S_BOOMBOX_EXPL1,
	deathsound = sfx_s3k4e,
	flags = MF_SOLID|MF_SLIDEME|MF_PUSHABLE|MF_SHOOTABLE|MF_SPRING,
	painchance = 1,
	damage = 0,
	raisestate = S_AUTODETONATE,
	painsound = sfx_s3k44
}

mobjinfo[MT_FLAMESTINGER] = {
	spawnstate = S_FLAMESTINGER,
	spawnhealth = 1000,
	seesound = sfx_s1ae,
	reactiontime = 8,
	speed = 80*FRACUNIT,
	radius = 4*FRACUNIT,
	height = 8*FRACUNIT,
	mass = DMG_FIRE,
	damage = 1,
	flags = MF_FIRE|MF_MISSILE|MF_NOGRAVITY,
}

mobjinfo[MT_CHARGEDFS] = {
	spawnstate = S_CHARGEDFS,
	spawnhealth = 1000,
	seesound = sfx_koopfr,
	reactiontime = 8,
	speed = 40*FRACUNIT,
	radius = 60*FRACUNIT,
	height = 120*FRACUNIT,
	mass = DMG_FIRE,
	damage = 2,
	flags = MF_FIRE|MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_NOCLIP,
}

mobjinfo[MT_CHARGEAURA] = {
	spawnstate = S_INVISIBLE,
	spawnhealth = 1000,
	reactiontime = 8,
	speed = 8,
	radius = 16*FRACUNIT,
	height = 48*FRACUNIT,
	mass = 16,
	flags = MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY,
}

mobjinfo[MT_WATERFS] = {
	spawnstate = S_WATERFS,
	spawnhealth = 1000,
	seesound = sfx_splish,
	reactiontime = 8,
	speed = 40*FRACUNIT,
	radius = 4*FRACUNIT,
	height = 8*FRACUNIT,
	mass = DMG_FIRE,
	damage = 1,
	flags = MF_MISSILE|MF_NOGRAVITY,
}

mobjinfo[MT_WATERFS_TRAIL] = {
	spawnstate = S_WATERFS_TRAIL1,
	spawnhealth = 1000,
	reactiontime = 8,
	radius = 16*FRACUNIT,
	height = 16*FRACUNIT,
	damage = 1,
	flags = MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIP|MF_RUNSPAWNFUNC,
}

mobjinfo[MT_WATERCFS] = {
	spawnstate = S_WATERCFS,
	spawnhealth = 1000,
	seesound = sfx_befire,
	reactiontime = 8,
	speed = 20*FRACUNIT,
	radius = 60*FRACUNIT,
	height = 120*FRACUNIT,
	mass = DMG_FIRE,
	damage = 2,
	flags = MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_NOCLIP,
}

sfxinfo[sfx_burnin] = {
	singular = false,
	caption = "Burning"
}

sfxinfo[sfx_mospin] = {
	singular = false,
	caption = "Spindash (Game Gear)"
}

sfxinfo[sfx_mojump] = {
	singular = false,
	caption = "Rider Jump"
}

sfxinfo[sfx_moskid] = {
	singular = false,
	caption = "Rider Skid"
}

sfxinfo[sfx_moddsh] = {
	singular = false,
	caption = "Drop Dash"
}

sfxinfo[sfx_mosoup] = {
	singular = false,
	caption = "Rider Charge"
}