// TGF Ring Monitors - "Ported" by MIDIMan
// Use with LUA_TBOX

freeslot(
	"SPR_TBXR",
	"sfx_tgfmrg",
	"MT_TGFBOX_RING",
	"MT_TGFBOX_RING_SPECIAL",
	"S_TGFBOX_RING_IDLE1",
	"S_TGFBOX_RING_IDLE2",
	"S_TGFBOX_RING_IDLE3",
	"S_TGFBOX_RING_BREAK",
	"S_TGFBOX_RING_EXPLODE",
	"S_TGFBOX_RING_SPECIAL_IDLE",
	"S_TGFBOX_RING_SPECIAL_DEATH"
)

sfxinfo[sfx_tgfmrg].caption = "Sparkling"

// Allow the player to get a perfect bonus
local function SetupMapRings(mobj, numrings)
	if not (mobj and mobj.valid) then return end
	if not numrings then return end
	
	for i = 1, numrings, 1 do
		local ring = P_SpawnMobj(mobj.x, mobj.y, mobj.z, MT_RING)
		P_RemoveMobj(ring)
	end
end

// TGF Ring Monitor

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

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

addHook("MapThingSpawn", function(mobj, mthing)
	if not (mobj and mobj.valid
	and mthing and mthing.valid) then
		return
	end
	
	SetupMapRings(mobj, 10)
end, MT_TGFBOX_RING)

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

mobjinfo[MT_TGFBOX_RING] = {
	//$Name TGF Super Ring (10 Rings)
	//$Sprite TBXRA0
	//$Category Monitors
	//$Flags4Text Big Explosion
	doomednum = 510,
	spawnstate = S_TGFBOX_RING_IDLE1,
	spawnhealth = 1,
	reactiontime = 10,
	painstate = S_TGFBOX_RING_IDLE1,
	deathstate = S_TGFBOX_RING_BREAK,
	deathsound = sfx_pop,
	radius = 28*FRACUNIT,
	height = 52*FRACUNIT,
	flags = MF_SPECIAL|MF_SHOOTABLE|MF_MONITOR|MF_GRENADEBOUNCE
}

states[S_TGFBOX_RING_IDLE1] =	{SPR_TBXR,	A,	1,	nil,		0,	0,	S_TGFBOX_RING_IDLE2}
states[S_TGFBOX_RING_IDLE2] =	{SPR_TBOX,	A,	1,	nil,		0,	0,	S_TGFBOX_RING_IDLE3}
states[S_TGFBOX_RING_IDLE3] =	{SPR_TBXR,	B,	1,	nil,		0,	0,	S_TGFBOX_RING_IDLE1}

states[S_TGFBOX_RING_BREAK] =	{SPR_TBXX,	A,	0,	TGF_RingBox,	0,	0,	S_TGFBOX_CHOOSEEXPLOSION}

// TGF Special Stage Ring Power-Up

addHook("MapThingSpawn", function(mobj, mthing)
	if not (mobj and mobj.valid
	and mthing and mthing.valid) then
		return
	end
	
	SetupMapRings(mobj, 5)
	
	// 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_RING_SPECIAL)

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

addHook("TouchSpecial", function(special, toucher)
	if not (special and special.valid
	and toucher and toucher.valid) then
		return
	end
	
	if not toucher.player and toucher.player.valid
		return
	end
	
	if G_IsSpecialStage(gamemap) then
		toucher.player.spheres = $+5
	end
end, MT_TGFBOX_RING_SPECIAL)

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

mobjinfo[MT_TGFBOX_RING_SPECIAL] = {
	//$Name TGF Super Ring (5 Rings) (Power-Up)
	//$Sprite TBXRC0
	//$Category Monitors
	//$Flags8Text Float
	doomednum = 514,
	spawnstate = S_TGFBOX_RING_SPECIAL_IDLE,
	spawnhealth = 1,
	reactiontime = 5,
	painstate = S_TGFBOX_RING_SPECIAL_IDLE,
	deathstate = S_TGFBOX_RING_SPECIAL_DEATH,
	deathsound = sfx_tgfmrg,
	radius = 14*FRACUNIT,
	height = 26*FRACUNIT,
	flags = MF_SPECIAL|MF_NOGRAVITY|MF_NOCLIPHEIGHT
}

states[S_TGFBOX_RING_SPECIAL_IDLE] =	{SPR_TBXR,	C,	-1,	nil,		0,	0,	S_TGFBOX_RING_SPECIAL_IDLE}
states[S_TGFBOX_RING_SPECIAL_DEATH] =	{SPR_NULL,	A,	-1,	TGF_RingBox,	0,	0,	S_NULL}
