// Golly, I used to code weird.

addHook("MobjSpawn", function(mo) -- Stage Gate Spawn
	mo.waittimer = 0
	mo.dispoffset = 1 -- No Z fighting, looks ugly as hell
	if mo.state == S_STAGEGATE_ACTIVE
	and mo.tanation == nil
		local light = P_SpawnMobjFromMobj(mo, 0, 0, 0, MT_STAGEGATELIGHT)
		light.state = S_STAGEGATELIGHT
		light.tanation = mo
		light.blendmode = AST_ADD
		light.dispoffset = 1 -- No Z fighting, looks ugly as hell
		light.tanation = mo
		mo.tanation = light
	end
end, MT_STAGEGATE)

addHook("PlayerSpawn", function(p) -- Player Spawn Values
	if p and p.mo and p.mo.valid
		p.stageexittimer = 0
		p.stagetimer = 0
		p.jumpholdtimer = 0
		p.spinholdtimer = 0
		p.fadetimer = 0
		p.hubtimer = 0
	end
end)

addHook("MobjThinker", function(mo)
	if mo and mo.valid -- "Yes the stage gate is a stage gate" DUDE, YOU KNOW HOW LUA CHECKS WORK WHY!?!? (Future me)
		if mo.spawnpoint.args[0]
			mo.warp = mo.spawnpoint.args[0]
		end
		if mo.spawnpoint.args[1] == 0 -- Stage Gate Types
			mo.state = S_STAGEGATE_ACTIVE
			mo.spawntype = 0
			mo.tanation.frame = A|TR_TRANS20
		end
		if mo.spawnpoint.args[1] == 1
			mo.state = S_STAGEGATENIGHT_ACTIVE
			mo.spawntype = 1
			mo.tanation.frame = B|TR_TRANS20
		end
		if mo.spawnpoint.args[1] == 2
			mo.state = S_STAGEGATECUSTOM_ACTIVE
			mo.spawntype = 2
			mo.tanation.frame = C|TR_TRANS20
			if mo.spawnpoint.args[2]
				mo.color = mo.spawnpoint.args[2]
				mo.tanation.color = mo.spawnpoint.args[2]
			end
		end
		if mo.spawnpoint.stringargs[0] != nil
			local COLOR = mo.spawnpoint.stringargs[0]
			mo.color = R_GetColorByName(COLOR)
			mo.tanation.color = R_GetColorByName(COLOR)
		end
		if mo.waittimer > 0
			mo.waittimer = $-1
		end
	end
end, MT_STAGEGATE)

addHook("PlayerThink", function(p) -- Player Stage Gate Control
	if p.selectingstage == true
		p.pflags = $|PF_FULLSTASIS
		
		if p.mo.tracer and p.mo.tracer.valid
			local trc = p.mo.tracer
			P_InstaThrust(p.mo, p.mo.angle, 0)
			P_MoveOrigin(p.mo, trc.x, trc.y, trc.z)
			p.mo.state = S_PLAY_STND
		end
		
		if (p.cmd.buttons & BT_JUMP) and not p.jumpholdtimer -- Accept
			S_StartSound(p.mo, sfx_unsele, p)
			p.pflags = $ & ~ PF_FULLSTASIS
			p.mo.tracer = nil
			p.selectingstage = false
			G_SetCustomExitVars(p.mapselected, 1)
			G_ExitLevel()
		end
		
		if (p.cmd.buttons & BT_USE) and not p.spinholdtimer -- Cancel
			p.pflags = $ & ~ PF_FULLSTASIS
			S_StartSound(p.mo, sfx_uncncl, p)
			p.mo.tracer = nil
			p.selectingstage = false
		end
	end
	if (p.cmd.buttons & BT_JUMP)
		p.jumpholdtimer = $+1
	else
		p.jumpholdtimer = 0
	end
		
	if (p.cmd.buttons & BT_USE)
		p.spinholdtimer = $+1
	else
		p.spinholdtimer = 0
	end
end)

addHook("TouchSpecial",function(special,toucher)
	--Use a Stage Gate if...
	if special and special.valid -- Wow, who tf wrote this code... oh wait.
		if special.state == S_STAGEGATE_ACTIVE or special.state == S_STAGEGATENIGHT_ACTIVE or special.state == S_STAGEGATECUSTOM_ACTIVE
			local p = toucher.player
			if p and p.valid
				if not p.selectingstage and not special.waittimer
					if special.warp == nil
						p.mapselected = special.angle/ANG1
					else
						p.mapselected = special.warp
					end
					S_StartSound(toucher, sfx_unslct, p)
					toucher.tracer = special
					p.selectingstage = true
				end
				special.waittimer = TICRATE/2
			end
		end
		return true
	end
end, MT_STAGEGATE)