
local function lerp (var1, var2, t) do
	var1 = FixedMul($1*FRACUNIT, FRACUNIT-t)
	var2 = FixedMul($1*FRACUNIT, t)
	local r = var1+var2
	r = $1/FRACUNIT
	return r
	end
end

local function lerp2(var1, var2, t) do
	local r = lerp(lerp(var1, var2, t), var2, t)
	return r
	end
end


freeslot(
"MT_EHINTBOX",
"MT_EHINTICON",
"S_EHINTBOX",
"S_EHINTBOXPOP",
"S_EHINT_ICON1",
"S_EHINT_ICON2",
"SPR_TVEH"
)


local emeraldLocations = {-1, -1, -1}
local emeraldStatus = {0, 0, 0} 
local bestHints = {"???", "???", "???"}
//-1 = Emerald Collected
//0 = Not collected, no hints acquired
//1 = Not collected, 1 hint acquired
local onScreenHint = "???"
local onScreenHintTime = 0

addHook("NetVars", function(network)
	emeraldLocations = network(emeraldLocations)
	emeraldStatus = network(emeraldStatus)
	bestHints = network(bestHints)
	onScreenHint = network(onScreenHint)
	onScreenHintTime = network(onScreenHintTime)
end)

local function GetHint(emerald, hint) 
	local paramname = "em" + emerald + "hint" + hint
	return mapheaderinfo[gamemap][paramname]
end

local function GetRegion(emerald) 
	local paramname = "em" + emerald + "region"
	if mapheaderinfo[gamemap][paramname] then
		return tonumber(mapheaderinfo[gamemap][paramname])
	else
		return nil
	end
end
local function GetRegionHint(r) 
	local paramname = "regionhint" + r
	if mapheaderinfo[gamemap][paramname] then
		return mapheaderinfo[gamemap][paramname]
	else
		return "Missing region hint " + r
	end
end


addHook("ThinkFrame", function()
	if (onScreenHintTime > 0) then
		onScreenHintTime = $-1
	end
end)

addHook("MapLoad", function(mapnum)
	if not mapheaderinfo[mapnum].emeraldhints then return end
	emeraldLocations = {-1, -1, -1}
	emeraldStatus = {0, 0, 0} 
	bestHints = {"???", "???", "???"}
	local region1 = {}
	local region2 = {}
	local region3 = {}
	local i = 1
	while(true) do
	if (GetRegion(i) == 1) then
		region1[#region1+1] = i
	end
	if (GetRegion(i) == 2) then
		region2[#region2+1] = i
	end
	if (GetRegion(i) == 3) then
		region3[#region3+1] = i
	end
		if (GetRegion(i) == nil) then
			break
		end
		i = $+1
	end
	emeraldLocations[1] = region1[P_RandomRange(1,#region1)]
	emeraldLocations[2] = region2[P_RandomRange(1,#region2)]
	emeraldLocations[3] = region3[P_RandomRange(1,#region3)]
	
	for mobj in mobjs.iterate()
		if (mobj.type == MT_EMERHUNT) then
			mobj.state = S_NULL
		end
	end
	
	for mapthing in mapthings.iterate
		if (mapthing.type == 320) then
			if (mapthing.angle == emeraldLocations[1]) then
				local emer = P_SpawnMobj(mapthing.x*FRACUNIT, mapthing.y*FRACUNIT, mapthing.z, MT_EMERHUNT)
				P_TeleportMove(emer, emer.x, emer.y, (mapthing.z*FRACUNIT)+emer.subsector.sector.floorheight)
				emer.region = GetRegion(mapthing.angle)
			elseif (mapthing.angle == emeraldLocations[2]) then
				local emer = P_SpawnMobj(mapthing.x*FRACUNIT, mapthing.y*FRACUNIT, mapthing.z, MT_EMERHUNT)
				P_TeleportMove(emer, emer.x, emer.y, (mapthing.z*FRACUNIT)+emer.subsector.sector.floorheight)
				emer.region = GetRegion(mapthing.angle)
			elseif (mapthing.angle == emeraldLocations[3]) then
				local emer = P_SpawnMobj(mapthing.x*FRACUNIT, mapthing.y*FRACUNIT, mapthing.z, MT_EMERHUNT)
				P_TeleportMove(emer, emer.x, emer.y, (mapthing.z*FRACUNIT)+emer.subsector.sector.floorheight)
				emer.region = GetRegion(mapthing.angle)
			else
				local hintbox = P_SpawnMobj(mapthing.x*FRACUNIT, mapthing.y*FRACUNIT, mapthing.z, MT_EHINTBOX)
				P_TeleportMove(hintbox, hintbox.x, hintbox.y, (mapthing.z*FRACUNIT)+hintbox.subsector.sector.floorheight)
				hintbox.emer = emeraldLocations[GetRegion(mapthing.angle)]
				hintbox.region = GetRegion(mapthing.angle)
			end		
		end
	end
	
	
end)

addHook("TouchSpecial", function(actor, collider)
	if not mapheaderinfo[gamemap].emeraldhints then return end //Juuuuust in case
	if not actor.region then return end
	emeraldStatus[actor.region] = -1
	bestHints[actor.region] = "GOT!"
	return
end, MT_EMERHUNT)


function A_DisplayEmeraldHint(actor, var1, var2) 
	if (emeraldStatus[actor.region] == 0) then
		onScreenHint = GetHint(actor.emer, 0)
		bestHints[actor.region] = GetHint(actor.emer, 0)
		emeraldStatus[actor.region] = 1
	elseif (emeraldStatus[actor.region]) == 1 then
		onScreenHint = GetHint(actor.emer, 1)
		bestHints[actor.region] = GetHint(actor.emer, 1)
	else
		if (emeraldStatus[1] >= 0) then
			onScreenHint = GetRegionHint(1)
			if (bestHints[1] == "???") then
				bestHints[1] = GetRegionHint(1)
			end
		elseif (emeraldStatus[2] >= 0) then
			onScreenHint = GetRegionHint(2)
			if (bestHints[2] == "???") then
				bestHints[2] = GetRegionHint(2)
			end
		elseif (emeraldStatus[3] >= 0) then
			onScreenHint = GetRegionHint(3)
			if (bestHints[3] == "???") then
				bestHints[3] = GetRegionHint(3)
			end
		else
			onScreenHint = "Not gonna lie dude I have no idea where it is (error)"
		end
		
	end
	onScreenHintTime = 100
end

mobjinfo[MT_EHINTBOX] = {
	spawnstate = S_EHINTBOX,
	reactiontime = 8,
	painstate = S_EHINTBOX,
	deathstate = S_EHINTBOXPOP,
	deathsound = sfx_pop,
	speed = 1,
	radius = 18*FRACUNIT,
	height = 40*FRACUNIT,
	mass = 100,
	damage = MT_EHINTICON,
	flags = MF_SOLID|MF_SHOOTABLE|MF_MONITOR
}


mobjinfo[MT_EHINTICON] = {
	doomednum = -1,
	spawnstate = S_EHINT_ICON1,
	seesound = sfx_kc54,
	reactiontime = 8,
	deathsound = sfx_pop,
	speed = 2*FRACUNIT,
	radius = 8*FRACUNIT,
	height = 14*FRACUNIT,
	mass = 100,
	damage = 62*FRACUNIT,
	flags = MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIP|MF_BOXICON|MF_SCENERY
}


states[S_EHINTBOX] = {
	sprite = SPR_TVEH,
	frame = A,
	tics = 2,
	nextstate = S_BOX_FLICKER
}

states[S_EHINTBOXPOP] = {
	sprite = SPR_TVEH,
	frame = A,
	action = A_DisplayEmeraldHint,
	tics = 0,
	nextstate = S_BOX_POP1
}

states[S_EHINT_ICON1] = {
	sprite = SPR_TVEH,
	frame = C|FF_ANIMATE,
	var1 = 3,
	var2 = 4,
	tics = 18,
	nextstate = S_EHINT_ICON2
}

states[S_EHINT_ICON2] = {
	sprite = SPR_TVEH,
	frame = C,
	tics = 18,
	nextstate = S_NULL
}

hud.add(function(v, player, camera) 
	if not mapheaderinfo[gamemap].emeraldhints then return end
		if onScreenHintTime == 0 then
			return
		end
		if (onScreenHintTime > 80) then
			v.drawString(160, lerp2(200, 155, ((100-onScreenHintTime)*FRACUNIT)/20), onScreenHint, 0, "center")
		else
			v.drawString(160, 155, onScreenHint, 0, "center")
		end
end, "game")


hud.add(function(v, player, camera) 
	if not mapheaderinfo[gamemap].emeraldhints then return end
	
	local shard1 = v.getSpritePatch(SPR_SHRD, 0)
	local shard2 = v.getSpritePatch(SPR_SHRD, 1)
	local shard3 = v.getSpritePatch(SPR_SHRD, 2)
	local whiteColor = v.getColormap(TC_ALLWHITE)
	if (emeraldStatus[1] >= 0) then
		v.drawString(20, 125, bestHints[1], 0, "left")
		v.drawScaled(10*FRACUNIT, 133*FRACUNIT, FRACUNIT/4, shard1, V_50TRANS, whiteColor)
	else
		v.drawString(20, 125, bestHints[1], V_YELLOWMAP, "left")
		v.drawScaled(10*FRACUNIT, 133*FRACUNIT, FRACUNIT/4, shard1, 0)
	end
	if (emeraldStatus[2] >= 0) then
		v.drawString(20, 135, bestHints[2], 0, "left")
		v.drawScaled(10*FRACUNIT, 143*FRACUNIT, FRACUNIT/4, shard2, V_50TRANS, whiteColor)
	else
		v.drawString(20, 135, bestHints[2], V_YELLOWMAP, "left")
		v.drawScaled(10*FRACUNIT, 143*FRACUNIT, FRACUNIT/4, shard2, 0)
	end
	if (emeraldStatus[3] >= 0) then
		v.drawString(20, 145, bestHints[3], 0, "left")
		v.drawScaled(10*FRACUNIT, 153*FRACUNIT, FRACUNIT/4, shard3, V_50TRANS, whiteColor)
	else
		v.drawString(20, 145, bestHints[3], V_YELLOWMAP, "left")
		v.drawScaled(10*FRACUNIT, 153*FRACUNIT, FRACUNIT/4, shard3, 0)
	end
		
end, "scores")