/*

Over Justice Papersprite Lua - By Eldog, QA by Angular

Fight for papersprites!

*/
local justicewheelradius = 20*FRACUNIT
local justicebodydist = 1*FRACUNIT

COM_AddCommand("JST_Papersprite", function(player)
	if (player.justicepaper) then
		player.justicepaper = nil
	else
		player.justicepaper = true
	end
end, 0)

local function JusticeSpawn(mo)
	if (mo.skin == "overjustice" and mo.player.justicepaper) then
		mo.player.overjustice = {
			/* Wheels */
			frontleftwheel	= P_SpawnMobj(mo.x, mo.y, mo.z, MT_OVERJUSTICEWHEEL),
			frontrightwheel	= P_SpawnMobj(mo.x, mo.y, mo.z, MT_OVERJUSTICEWHEEL),
			backleftwheel	= P_SpawnMobj(mo.x, mo.y, mo.z, MT_OVERJUSTICEWHEEL),
			backrightwheel	= P_SpawnMobj(mo.x, mo.y, mo.z, MT_OVERJUSTICEWHEEL),
			/* Over Justice Bits */
			frontside	= P_SpawnMobj(mo.x, mo.y, mo.z, MT_OVERJUSTICE),
			backside	= P_SpawnMobj(mo.x, mo.y, mo.z, MT_OVERJUSTICE)
		}
		mo.player.overjustice.frontside.state = S_JUSTICEFRONT
		mo.player.overjustice.backside.state = S_JUSTICEBACK
		mo.player.dieangle = 0
		--mo.player.squishlasttic = 0
	end
end -- Close function

local function CleanupJustice(mo)
	if (mo.player.overjustice) then
		for k,v in pairs(mo.player.overjustice)
			P_RemoveMobj(v)
		end -- Close loop
		mo.player.overjustice = nil
	end
end -- Close function

local function JusticeThinker(mo)
	if (mo.skin == "overjustice" and mo.player.justicepaper) then
		if (leveltime == 1) then mo.player.overjustice = nil end -- I seriously have no idea why I need to do this
		if not (mo.player.overjustice) then
			JusticeSpawn(mo)
		end
		/* Get object positions */
		local overjusticecoords = { /* Table must have equivalent keys to mo.player.overjustice{} */
			/* Wheels */
			frontleftwheel = {
				x = mo.x + FixedMul(justicewheelradius, cos(mo.player.frameangle + mo.player.dieangle + ANGLE_45)),
				y = mo.y + FixedMul(justicewheelradius, sin(mo.player.frameangle + mo.player.dieangle + ANGLE_45))
			},
			frontrightwheel = {
				x = mo.x + FixedMul(justicewheelradius, cos(mo.player.frameangle + mo.player.dieangle - ANGLE_45)),
				y = mo.y + FixedMul(justicewheelradius, sin(mo.player.frameangle + mo.player.dieangle - ANGLE_45))
			},
			backleftwheel = {
				x = mo.x + FixedMul(justicewheelradius, cos(mo.player.frameangle + mo.player.dieangle + ANGLE_135)),
				y = mo.y + FixedMul(justicewheelradius, sin(mo.player.frameangle + mo.player.dieangle + ANGLE_135))
			},
			backrightwheel = {
				x = mo.x + FixedMul(justicewheelradius, cos(mo.player.frameangle + mo.player.dieangle - ANGLE_135)),
				y = mo.y + FixedMul(justicewheelradius, sin(mo.player.frameangle + mo.player.dieangle - ANGLE_135))
			},
			/* Over Justice Bits */
			frontside = {
				x = mo.x + FixedMul(justicebodydist, cos(mo.player.frameangle + mo.player.dieangle)),
				y = mo.y + FixedMul(justicebodydist, sin(mo.player.frameangle + mo.player.dieangle))
			},
			backside = {
				x = mo.x - FixedMul(justicebodydist, cos(mo.player.frameangle + mo.player.dieangle)),
				y = mo.y - FixedMul(justicebodydist, sin(mo.player.frameangle + mo.player.dieangle))
			}
		}
		
		/* Update object values */
		if not (mo.player.kartstuff[k_squishedtimer] == mo.player.squishlasttic) then
			if (mo.player.kartstuff[k_squishedtimer] > 0) then
				mo.player.overjustice.frontside.state = S_JUSTICEFRONTSQUISHED
				mo.player.overjustice.backside.state = S_JUSTICEBACKSQUISHED
			else
				mo.player.overjustice.frontside.state = S_JUSTICEFRONT
				mo.player.overjustice.backside.state = S_JUSTICEBACK
			end
		end
		
		mo.player.squishlasttic = mo.player.kartstuff[k_squishedtimer]
		
		if (mo.player.playerstate == PST_DEAD) then
			mo.player.dieangle = $ + ANGLE_22h -- I have to recreate the death spin because of COURSE I do
		else
			mo.player.dieangle = 0
		end
		
		for k,v in pairs(mo.player.overjustice)
			if (mo.player.overjustice[k] and mo.player.overjustice[k].valid) then
				P_TeleportMove(v, overjusticecoords[k].x, overjusticecoords[k].y, mo.z) -- Update position
				v.colorized = mo.colorized
				
				if (mo.player.playerstate == PST_LIVE) then
					v.flags2 = mo.flags2 -- Update cosmetic flags
					if (mo.player.kartstuff[k_respawn] > 0) then -- WHY DO I HAVE TO DO THIS
						v.flags2 = $ & ~(MF2_DONTDRAW) -- DRAW THE FUCKING PLAYER WHEN THEY RESPAWN HOLY GOD
					end
				end
				
				if (v == mo.player.overjustice.frontside or v == mo.player.overjustice.backside) then -- Check for Over Justice's body
					v.angle = mo.player.frameangle + ANGLE_90 + mo.player.dieangle
				else
					v.angle = mo.player.frameangle + mo.player.dieangle
				end
				
				v.scale = mo.scale
				v.color = mo.color
				v.momx = mo.momx
				v.momy = mo.momy
				v.momz = mo.momz
			end
		end -- Close loop
		
		/* Suppress Normal Kart */
		mo.flags2 = $ | (MF2_DONTDRAW)
	else
		if (mo.player.overjustice) then -- Does the player still have over justice on top of them?
			CleanupJustice(mo)
			mo.flags2 = $ & ~(MF2_DONTDRAW)
		end
	end
end -- Close function

addHook("MobjThinker",	JusticeThinker,	MT_PLAYER)
addHook("MobjSpawn",	JusticeSpawn,	MT_PLAYER)
addHook("MobjRemoved",	CleanupJustice,	MT_PLAYER)