// TGF Speed Shoes Monitor - "Ported" by MIDIMan
// Use with LUA_TBOX

freeslot(
	"SPR_TBXS",
	"MT_TGFBOX_SHOES",
	"MT_TGFBOX_SHOES_SPECIAL",
	"S_TGFBOX_SHOES_IDLE1",
	"S_TGFBOX_SHOES_IDLE2",
	"S_TGFBOX_SHOES_IDLE3",
	"S_TGFBOX_SHOES_BREAK",
	"S_TGFBOX_SHOES_SPECIAL_IDLE",
	"S_TGFBOX_SHOES_SPECIAL_DEATH"
)

// TGF Speed Shoes Monitor

local function TGF_SuperSneakers(actor, var1, var2)
	if not (actor and actor.valid) then return end
	P_TGFMonitorGiveAbility(actor, A_SuperSneakers)
end

addHook("MobjFuse", function(mobj)
	if not (mobj and mobj.valid) then return end
	
	P_TGFMonitorFuseThink(mobj)
	return true
end, MT_TGFBOX_SHOES)

// If the monitor has been destroyed by a player's projectile, still play the death sound
addHook("TouchSpecial", P_TGFMonitorTouchSpecial, MT_TGFBOX_SHOES)
addHook("MobjDeath", P_TGFMonitorDeath, MT_TGFBOX_SHOES)

mobjinfo[MT_TGFBOX_SHOES] = {
	//$Name TGF Super Sneakers
	//$Sprite TBXSA0
	//$Category Monitors
	//$Flags4Text Big Explosion
	doomednum = 511,
	spawnstate = S_TGFBOX_SHOES_IDLE1,
	spawnhealth = 1,
	painstate = S_TGFBOX_SHOES_IDLE1,
	deathstate = S_TGFBOX_SHOES_BREAK,
	deathsound = sfx_pop,
	radius = 28*FRACUNIT,
	height = 52*FRACUNIT,
	flags = MF_SPECIAL|MF_SHOOTABLE|MF_MONITOR|MF_GRENADEBOUNCE
}

states[S_TGFBOX_SHOES_IDLE1] =	{SPR_TBXS,	A,	1,	nil,				0,	0,	S_TGFBOX_SHOES_IDLE2}
states[S_TGFBOX_SHOES_IDLE2] =	{SPR_TBOX,	A,	1,	nil,				0,	0,	S_TGFBOX_SHOES_IDLE3}
states[S_TGFBOX_SHOES_IDLE3] =	{SPR_TBXS,	B,	1,	nil,				0,	0,	S_TGFBOX_SHOES_IDLE1}
states[S_TGFBOX_SHOES_BREAK] =	{SPR_TBXX,	A,	0,	TGF_SuperSneakers,	0,	0,	S_TGFBOX_CHOOSEEXPLOSION}

// TGF Special Stage Speed Shoes Power-Up

addHook("MapThingSpawn", function(mobj, mthing)
	if not (mobj and mobj.valid
	and mthing and mthing.valid) then
		return
	end
	
	// Make the power-up float if the "Ambush" flag is set
	local offset = 24*FRACUNIT
	
	if (mthing.options & MTF_AMBUSH)
		if (mthing.options & MTF_OBJECTFLIP)
			mobj.z = mobj.ceilingz - FixedMul(mobj.scale, offset + mobj.info.height)
		else
			mobj.z = mobj.floorz + FixedMul(mobj.scale, offset)
		end
	end
end, MT_TGFBOX_SHOES_SPECIAL)

addHook("MobjFuse", function(mobj)
	if not (mobj and mobj.valid) then return end
	
	P_TGFMonitorFuseThink(mobj)
	return true
end, MT_TGFBOX_SHOES_SPECIAL)

addHook("MobjDeath", function(target, inflictor, source, damagetype)
	if not (target and target.valid) then return end
	
	P_TGFPowerUpDeath(target)
end, MT_TGFBOX_SHOES_SPECIAL)

mobjinfo[MT_TGFBOX_SHOES_SPECIAL] = {
	//$Name TGF Super Sneakers Power-Up
	//$Sprite TBXSC0
	//$Category Monitors
	//$Flags8Text Float
	doomednum = 515,
	spawnstate = S_TGFBOX_SHOES_SPECIAL_IDLE,
	spawnhealth = 1,
	reactiontime = 5,
	painstate = S_TGFBOX_SHOES_SPECIAL_IDLE,
	deathstate = S_TGFBOX_SHOES_SPECIAL_DEATH,
	deathsound = sfx_tgfbng, // Replace sfx_tgfbng if you decide to use something else
	radius = 14*FRACUNIT,
	height = 26*FRACUNIT,
	flags = MF_SPECIAL|MF_NOGRAVITY|MF_NOCLIPHEIGHT
}

states[S_TGFBOX_SHOES_SPECIAL_IDLE] =	{SPR_TBXS,	C,	-1,	nil,				0,	0,	S_TGFBOX_SHOES_SPECIAL_IDLE}
states[S_TGFBOX_SHOES_SPECIAL_DEATH] =	{SPR_NULL,	A,	-1,	TGF_SuperSneakers,	0,	0,	S_NULL}
