// TGF Invincibility Power-Up - "Ported" by MIDIMan
// Use with LUA_TBOX

freeslot(
	"SPR_TBXI",
	"MT_TGFBOX_INVIN_SPECIAL",
	"S_TGFBOX_INVIN_SPECIAL_IDLE",
	"S_TGFBOX_INVIN_SPECIAL_DEATH"
)

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

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) then
		if (mthing.options & MTF_OBJECTFLIP) then
			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_INVIN_SPECIAL)

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

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

mobjinfo[MT_TGFBOX_INVIN_SPECIAL] = {
	//$Name TGF Invincibility (Power-Up)
	//$Sprite TBXIA0
	//$Category Monitors
	//$Flags8Text Float
	doomednum = 516,
	spawnstate = S_TGFBOX_INVIN_SPECIAL_IDLE,
	spawnhealth = 1,
	reactiontime = 5,
	painstate = S_TGFBOX_INVIN_SPECIAL_IDLE,
	deathstate = S_TGFBOX_INVIN_SPECIAL_DEATH,
	deathsound = sfx_s1ca,
	radius = 14*FRACUNIT,
	height = 26*FRACUNIT,
	flags = MF_SPECIAL|MF_NOGRAVITY|MF_NOCLIPHEIGHT
}

states[S_TGFBOX_INVIN_SPECIAL_IDLE] =	{SPR_TBXI,	A,	-1,	nil,				0,	0,	S_TGFBOX_INVIN_SPECIAL_IDLE}
states[S_TGFBOX_INVIN_SPECIAL_DEATH] =	{SPR_NULL,	A,	-1,	TGF_Invincibility,	0,	0,	S_NULL}
