// Properly fits the player's 1up icon into the Final Demo monitor
// Mostly based off of 2.2.9's source code
function A_1upThinker(actor, var1, var2)
	if not (actor and actor.valid) then return end
	
	local dist = INT32_MAX
	local temp
	local closestplayer
	
	for player in players.iterate
		if not player.valid or player.bot or player.spectator
			continue
		end
		
		if not (player.mo and player.mo.valid)
			continue
		end
		
		if (netgame or multiplayer) and player.playerstate ~= PST_LIVE
			continue
		end
		
		temp = FixedHypot(player.mo.x-actor.x, player.mo.y-actor.y)
		
		if temp < dist
			closestplayer = player
			dist = temp
		end
		
		if closestplayer == nil or skins[closestplayer.skin].sprites[SPR2_LIFE].numframes == 0
			// Closest player not found (no players in game?? may be empty dedicated server!), or does not have correct sprite.
			if actor.tracer
				local tracer = actor.tracer
				actor.tracer = nil
				P_RemoveMobj(tracer)
			end
			return
		end
		
		// We're using the overlay, so use the overlay 1up box (no text)
		actor.sprite = SPR_TV1P
		
		if not actor.tracer
			actor.tracer = P_SpawnMobjFromMobj(actor, 0, 0, 0, MT_OVERLAY)
			actor.tracer.target = actor
			actor.tracer.skin = closestplayer.mo.skin // required here to prevent spr2 default showing stand for a single frame
			actor.tracer.state = actor.info.seestate
			
			actor.tracer.spriteyoffset = 8*FRACUNIT
			actor.tracer.spritexscale = 1*FRACUNIT
			actor.tracer.spriteyscale = 1*FRACUNIT
			
			// The overlay is going to be one tic early turning off and on
			// because it's going to get its thinker run the frame we spawned it.
			// So make it take one tic longer if it just spawned
			actor.tracer.tics = $+1
		end
		
		actor.tracer.color = closestplayer.mo.color
		actor.tracer.skin = closestplayer.mo.skin
	end
end
