// ------------------------------------------
// Lua_SecondColor
// Second color, ported from Kart
// ------------------------------------------
local secondcolorchars = {}
secondcolorchars["metaknight"] = metaoverlaycolors

// Sprite to overlay sprite table
local overlaysprites = {}
overlaysprites[SPR_PLAY] = SPR_PLAY

// -----------------------------------------------------------------------------
// Starting here, nothing else needs to be modified for your character to work
// -----------------------------------------------------------------------------
// Overlay object!
// Uses a global variable to store the object number, so there's only one object no matter how many sc characters you have.
// Different versions of second color will use different objects (and therefore globals)
// to ensure characters with different versions are still compatable with eachother.
if(overlayobj_v2 == nil)
	freeslot("MT_SECONDCOLOROVERLAY_V2")
	rawset(_G, "overlayobj_v2", MT_SECONDCOLOROVERLAY_V2)
	mobjinfo[overlayobj_v2].doomednum = -1
	mobjinfo[overlayobj_v2].spawnstate = S_PLAY_STND
	mobjinfo[overlayobj_v2].spawnhealth = 1
	mobjinfo[overlayobj_v2].seestate = S_PLAY_WALK
	mobjinfo[overlayobj_v2].seesound = sfx_none
	mobjinfo[overlayobj_v2].reactiontime = 0
	mobjinfo[overlayobj_v2].attacksound = sfx_thok
	mobjinfo[overlayobj_v2].painstate = S_PLAY_PAIN
	mobjinfo[overlayobj_v2].painchance = MT_THOK
	mobjinfo[overlayobj_v2].painsound = sfx_none
	mobjinfo[overlayobj_v2].meleestate = S_NULL
	mobjinfo[overlayobj_v2].missilestate = S_NULL
	mobjinfo[overlayobj_v2].deathstate = S_PLAY_PAIN
	mobjinfo[overlayobj_v2].xdeathstate = S_NULL
	mobjinfo[overlayobj_v2].deathsound = sfx_none
	mobjinfo[overlayobj_v2].speed = 1
	mobjinfo[overlayobj_v2].radius = 16*FRACUNIT
	mobjinfo[overlayobj_v2].height = 48*FRACUNIT
	mobjinfo[overlayobj_v2].dispoffset = 0
	mobjinfo[overlayobj_v2].mass = 1000
	mobjinfo[overlayobj_v2].damage = MT_THOK
	mobjinfo[overlayobj_v2].activesound = sfx_none
	mobjinfo[overlayobj_v2].flags = MF_NOGRAVITY|MF_NOCLIPTHING
	mobjinfo[overlayobj_v2].raisestate = MT_THOK
	
	// Remove the overlay when we no longer need it!
	addHook("MobjThinker", function(scoverlay)
		scoverlay.tics = $1 + 1
		if(scoverlay.timer)
			scoverlay.timer = $1 - 1
		else
			P_RemoveMobj(scoverlay)
		end
	end, overlayobj_v2)
end

// Player states. Because pain.
/*local playerstates = {}
local s = 0
while(s < #players)
	freeslot("S_KIRBYFEETSTATES_"+(s+1))
	playerstates[s] = S_KIRBYFEETSTATES_1 + s
	s = $1 + 1
end*/

// Garbage
local function setStateSafe(mobj, state, player)
	local defaultaction = states[state].action
	states[state].action = nil
/*	if(player and player.valid)
		// Set info
		states[playerstates[#player]].sprite = states[state].sprite
		if(states[state].sprite == SPR_PLAY)
			states[playerstates[#player]].frame = SPR2_SWIM
		else
			states[playerstates[#player]].frame = states[state].frame
		end
		states[playerstates[#player]].tics = states[state].tics
	//	states[playerstates[#player]].action = states[state].action		// Don't actally want this one
		states[playerstates[#player]].var1 = states[state].var1
		states[playerstates[#player]].var2 = states[state].var2
		states[playerstates[#player]].nextstate = states[state].nextstate
		
		// Set state
		mobj.state = playerstates[#player]
	else*/
		mobj.state = state
//	end
	states[state].action = defaultaction
end

// -------------------------------------------
// Overlay function
// -------------------------------------------
local function doOverlay(mobj, slopestick, addtotarget)
	// Create the overlay
	if not(mobj.scoverlay and mobj.scoverlay.valid)
		mobj.scoverlay = P_SpawnMobj(mobj.x, mobj.y, mobj.z, overlayobj_v2)
	end
	
	local matchmobj = mobj
	if(addtotarget)
		matchmobj = mobj.target
	end
	
	if not(matchmobj and matchmobj.valid)
		return
	end
	
	// Set the overlay's tracer
	mobj.scoverlay.tracer = matchmobj
//	mobj.scoverlay.flags2 = $1|MF2_LINKDRAW
	
	// Set the overlay's frame to the player's frame! (and tics)
	local height = 0
	if not(addtotarget)
		setStateSafe(mobj.scoverlay, mobj.state, mobj.player)
		mobj.scoverlay.frame = mobj.frame
		mobj.scoverlay.tics = mobj.tics
		mobj.scoverlay.anim_duration = mobj.anim_duration
	else
		if(states[mobj.state].var2)
			height = states[mobj.state].var2*FRACUNIT*P_MobjFlip(matchmobj)
		else
			height = states[mobjinfo[matchmobj.type].seestate].var2*FRACUNIT*P_MobjFlip(matchmobj)
		end
		setStateSafe(mobj.scoverlay, mobj.state, mobj.player)
		mobj.scoverlay.frame = mobj.frame
		mobj.scoverlay.tics = mobj.tics
		mobj.scoverlay.anim_duration = mobj.anim_duration
	end
	
	// Match the overlay to the player
	P_TeleportMove(mobj.scoverlay, mobj.x, mobj.y, matchmobj.z+height)
	mobj.scoverlay.momx = matchmobj.momx
	mobj.scoverlay.momy = matchmobj.momy
	mobj.scoverlay.momz = matchmobj.momz
	if(matchmobj.player and matchmobj.player.valid)
		mobj.scoverlay.angle = matchmobj.player.drawangle
	else
		mobj.scoverlay.angle = matchmobj.angle
	end
	mobj.scoverlay.scale = matchmobj.scale
	mobj.scoverlay.radius = matchmobj.radius
	mobj.scoverlay.height = matchmobj.height
	
	// Match the colors!
	if(mobj.colorized)
		mobj.scoverlay.color = mobj.color
	elseif(mobj.player)
		and(mobj.player.scoverlaycol)
		mobj.scoverlay.color = mobj.player.overlaycol
	else
		if(secondcolorchars[mobj.skin][mobj.color] == nil)
			if(mobj.color <= 0 or mobj.color >= MAXSKINCOLORS)
				mobj.scoverlay.color = mobj.color
			else
				mobj.scoverlay.color = ColorOpposite(mobj.color)
			end
		else
			mobj.scoverlay.color = secondcolorchars[mobj.skin][mobj.color]
		end
	end
	mobj.scoverlay.colorized = mobj.colorized
	
	// Set the overlay's sprite
	mobj.scoverlay.skin = mobj.skin
	if(overlaysprites[mobj.sprite])
		mobj.scoverlay.sprite = overlaysprites[mobj.sprite]
	end
	mobj.scoverlay.sprite2 = mobj.sprite2|FF_SPR2SUPER
	
	// Match sprite rotation
	mobj.scoverlay.rollangle = matchmobj.rollangle
	
	// REVERSE GRAVITY WOAAAAAH
	if(mobj.eflags & MFE_VERTICALFLIP)
		mobj.scoverlay.eflags = $1|MFE_VERTICALFLIP
	else
		mobj.scoverlay.eflags = $1 & !MFE_VERTICALFLIP
	end
	
	// MF2_DONTDRAW WOAAAAAH
	if not(addtotarget)
		if(mobj.flags2 & MF2_DONTDRAW)
			or not(overlaysprites[mobj.sprite])
			or(addtotarget and not mobj.sprite == SPR_PLAY)
			mobj.scoverlay.flags2 = $1|MF2_DONTDRAW
		else
			mobj.scoverlay.flags2 = $1 & !MF2_DONTDRAW
		end
	else
		if(mobj.flags2 & MF2_DONTDRAW)
			or(mobj.target.sprite == SPR_PINV)
			mobj.scoverlay.flags2 = $1|MF2_DONTDRAW
		else
			mobj.scoverlay.flags2 = $1 & !MF2_DONTDRAW
		end
	end
	
	// MF2_SHADOW WOAAAAAH
	if(mobj.flags2 & MF2_SHADOW)
		and(leveltime or mobj.type != MT_PLAYER)	// Weird bug?
		mobj.scoverlay.flags2 = $1|MF2_SHADOW
	else
		mobj.scoverlay.flags2 = $1 & !MF2_SHADOW
	end
	
	if not(slopestick)
		mobj.scoverlay.flags = $1|MF_NOCLIP|MF_NOCLIPHEIGHT
	end
	
	mobj.scoverlay.flags = ($1 & !FF_TRANSMASK)|(mobj.flags & FF_TRANSMASK)
	
	// Keep the overlay in the world!
	mobj.scoverlay.timer = 1
end

// -------------------------------------------
// Adding overlays to objects!
// -------------------------------------------
// Players
addHook("PreThinkFrame", function()
	for player in players.iterate
		if(player.mo and player.mo.valid and player.mo.prevspr2)
			player.mo.sprite2 = player.mo.prevspr2
			player.mo.prevspr2 = nil
		end
	end
end)
addHook("PostThinkFrame", function()
	for player in players.iterate
		if(player.mo and player.mo.valid and secondcolorchars[player.mo.skin])
			doOverlay(player.mo, true, false)
			player.mo.prevspr2 = player.mo.sprite2
			player.mo.sprite2 = $1 & !FF_SPR2SUPER	// Just in case
		end
	end
end)
addHook("PlayerSpawn", function(player)
	if(player.mo and player.mo.valid and secondcolorchars[player.mo.skin])
		doOverlay(player.mo, true, false)
		player.mo.prevspr2 = player.mo.sprite2
		player.mo.sprite2 = $1 & !FF_SPR2SUPER	// Just in case
	end
end)

// Ghosts
addHook("MobjThinker", function(ghost)
	if(ghost and ghost.valid and secondcolorchars[ghost.skin])
		doOverlay(ghost, false, false)
		ghost.sprite2 = $1 & !FF_SPR2SUPER	// Just in case
	end
end, MT_GHOST)
addHook("MobjFuse", function(ghost)
	if(ghost and ghost.valid and secondcolorchars[ghost.skin])
		and(ghost.scoverlay and ghost.scoverlay.valid)
		P_RemoveMobj(ghost.scoverlay)	// Make sure to remove it properly so it doesn't linger 1 frame after
	end
end, MT_GHOST)

// Signposts (and 1-up monitors for normal SRB2)
local queuedforoverlay = {}
local numqueued = 0
addHook("MobjThinker", function(overlay)
	if(secondcolorchars[overlay.skin])
		and(overlay.target and overlay.target.valid)
		queuedforoverlay[numqueued] = overlay
		overlay.overlaydone = false
		numqueued = $1 + 1
	elseif(overlay.scoverlay)
		P_RemoveMobj(overlay.scoverlay)
		overlay.scoverlay = nil
	end
end, MT_OVERLAY)

addHook("PostThinkFrame", function()
	local onum = 0
	while(onum < numqueued)
		if(queuedforoverlay[onum] and queuedforoverlay[onum].valid)
			// Signpost hack
			if(queuedforoverlay[onum].sprite2 == SPR2_SIGN)
				queuedforoverlay[onum].frame = B|($1 & !FF_FRAMEMASK)	// Use the right frame
			end
			
			if not(queuedforoverlay[onum].overlaydone)
				doOverlay(queuedforoverlay[onum], false, true)
			end
			queuedforoverlay[onum].overlaydone = true
		end
		onum = $1 + 1
	end
	queuedforoverlay = nil
	queuedforoverlay = {}
	numqueued = 0
end)
