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

freeslot(
	"SPR_TBXT",
	"MT_TGFBOX_TIME_SPECIAL",
	"S_TGFBOX_TIME_BREAK",
	"S_TGFBOX_TIME_SPECIAL_IDLE",
	"S_TGFBOX_TIME_SPECIAL_DEATH"
)

function A_GiveTime(actor, var1, var2)
	if not (actor and actor.valid) then return end
	
	// Do not give the player more time if they are outside of a Special Stage
	if not G_IsSpecialStage(gamemap) then
		S_StopSound(actor)
		S_StartSound(actor, sfx_lose)
		return
	end
	
	local target = actor.target
	
	if target and target.valid and target.player and target.player.valid then
		if var1 then
			target.player.nightstime = $+(var1)
		else
			target.player.nightstime = $+(15*TICRATE)
		end
	end
	
	S_StartSound(actor, sfx_tgfbng) // Replace sfx_tgfbng if you decide to use something else
end

local function TGF_GiveTime(actor, var1, var2)
	if not (actor and actor.valid) then return end
	P_TGFMonitorGiveAbility(actor, A_GiveTime, var1, var2)
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_TIME_SPECIAL)

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

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

mobjinfo[MT_TGFBOX_TIME_SPECIAL] = {
	//$Name TGF Time Bonus (Power-Up)
	//$Sprite TBXTA0
	//$Category Monitors
	//$Flags8Text Float
	doomednum = 517,
	spawnstate = S_TGFBOX_TIME_SPECIAL_IDLE,
	spawnhealth = 1,
	reactiontime = 5,
	painstate = S_TGFBOX_TIME_SPECIAL_IDLE,
	deathstate = S_TGFBOX_TIME_SPECIAL_DEATH,
	radius = 14*FRACUNIT,
	height = 26*FRACUNIT,
	flags = MF_SPECIAL|MF_NOGRAVITY|MF_NOCLIPHEIGHT
}

states[S_TGFBOX_TIME_SPECIAL_IDLE] =	{SPR_TBXT,	A,	-1,	nil,		0,	0,	S_TGFBOX_TIME_SPECIAL_IDLE}
states[S_TGFBOX_TIME_SPECIAL_DEATH] =	{SPR_NULL,	A,	-1,	TGF_GiveTime,	0,	0,	S_NULL}
