freeslot("MT_METALPOLICE", "S_MP_STAND", "S_MP_WALK", "SPR_SCMT", "MT_MPALERT", "S_MPALERT", "SPR_SCAT", "SFX_TYITJM")

addHook("MobjThinker", function(pmo)
	if pmo and pmo.valid
		if pmo.sight_cd == nil then pmo.sight_cd = 0 end
		if pmo.sight_cd != 0
			pmo.sight_cd = $ - 1
		end
	end
end, MT_PLAYER)


local zoomtubes = {}
addHook("MapLoad", do
	zoomtubes = {}
	if mapheaderinfo[gamemap].sight != "1"
		hud.enable("score")
		hud.enable("rings")
		hud.enable("lives")
		for player in players.iterate do
			player.inthejoint = nil
			player.y4text = nil
			player.charability = skins[player.mo.skin].ability
			player.charability2 = skins[player.mo.skin].ability2
			player.jumpfactor = skins[player.mo.skin].jumpfactor
			player.normalspeed = skins[player.mo.skin].normalspeed
			player.actionspd = skins[player.mo.skin].actionspd
			player.runspeed = skins[player.mo.skin].runspeed
			player.acceleration = skins[player.mo.skin].acceleration
		end
	end
	for mapthing in mapthings.iterate do
		if mapthing.mobj and mapthing.mobj.valid and mapthing.mobj.type == MT_TUBEWAYPOINT
			local number = mapthing.args[0]
			local order = mapthing.args[1]
			if zoomtubes[number] == nil then zoomtubes[number] = {} end
			zoomtubes[number][order] = mapthing
		end
	end
	for mo in mobjs.iterate() do
		if mo.valid and mo.type == MT_METALPOLICE
			local mapthing = mo.spawnpoint
			mo.spawnangle = mo.angle
			mo.zt_number = mapthing.args[0]
			mo.movespeed = mapthing.args[1]
			mo.waitmove = mapthing.args[2]
			mo.loopreturn = mapthing.args[3]
			mo.changeangle = mapthing.args[5]
			if mapthing.args[4] <= 0 or mapthing.args[4] >= #skincolors
				mo.color = P_RandomRange(1, #skincolors-1)
			else
				mo.color = mapthing.args[4]
			end
			if zoomtubes[mo.zt_number] != nil
				mo.moving = {targetpoint = 0, wait = mo.waitmove, move = false, back = false}
			end
		end
	end
end)

local A_MP_THINKER = function(actor, var1, var2)
	if actor and actor.valid
		if not actor.alert or not actor.alert.valid
			actor.alert = P_SpawnMobj(actor.x, actor.y, actor.z+64*FRACUNIT, MT_MPALERT)
			P_SetOrigin(actor.alert, actor.x, actor.y, actor.z+64*FRACUNIT)
			actor.alert.scale = FRACUNIT/2
		else
			P_SetOrigin(actor.alert, actor.x, actor.y, actor.z+64*FRACUNIT)
			actor.alert.scale = FRACUNIT/2
		end
	end
	for player in players.iterate do
		local pmo = player.mo
		local dist = R_PointToDist2(pmo.x, pmo.y, actor.x, actor.y)
		local dist2 = P_AproxDistance(0, pmo.z-actor.z)
		local angle = R_PointToAngle2(actor.x, actor.y, pmo.x, pmo.y)
		local angleview = actor.angle
		local ang =(angleview-angle)
		local sight = P_CheckSight(actor, pmo)
		if dist < 96*FRACUNIT and dist2 < 256*FRACUNIT
			if sight == true
				pmo.sight_cd = 110
				actor.angle = angle
			end
		elseif dist < 720*FRACUNIT and dist2 < 256*FRACUNIT
			if 1000000000 > ang and -1000000000 < ang
				if sight == true
					if pmo.sight_cd == nil then pmo.sight_cd = 0 end
					pmo.sight_cd = $ + 5
					if actor.angle > angle
						if (actor.angle - angle) > 640*FRACUNIT
							actor.angle = $ - 640*FRACUNIT
						else
							actor.angle = angle
						end
					elseif actor.angle < angle
						if (angle - actor.angle) > 640*FRACUNIT
							actor.angle = $ + 640*FRACUNIT
						else
							actor.angle = angle
						end
					end
					return
				end
			end
		end
	end
	if actor.moving != nil
		local moving = actor.moving
		if moving.move == false
			if moving.wait > 0
				moving.wait = $ - 1
			else
				moving.move = true
				actor.state = S_MP_WALK
			end
		else
			local targetpoint = zoomtubes[actor.zt_number][moving.targetpoint].mobj
			local dist = R_PointToDist2(targetpoint.x, targetpoint.y, actor.x, actor.y)
			local angle = R_PointToAngle2(actor.x, actor.y, targetpoint.x, targetpoint.y)
			if dist > 16*FRACUNIT
				P_InstaThrust(actor, angle, actor.movespeed*FRACUNIT)
				actor.angle = angle
			else
				moving.move = false
				moving.wait = actor.waitmove
				actor.state = S_MP_STAND
				actor.momx = 0
				actor.momy = 0
				if actor.loopreturn == 0
					if moving.targetpoint >= #zoomtubes[actor.zt_number]
						moving.targetpoint = 0
					else
						moving.targetpoint = $ + 1
					end
				else
					if moving.back == false
						if moving.targetpoint >= #zoomtubes[actor.zt_number]
							moving.back = true
							moving.targetpoint = $ - 1
						else
							moving.targetpoint = $ + 1
						end
					else
						if moving.targetpoint <= 0
							moving.back = false
							moving.targetpoint = $ + 1
						else
							moving.targetpoint = $ - 1
						end
					end
				end
				if actor.changeangle != 0
					local newtargetpoint = zoomtubes[actor.zt_number][moving.targetpoint].mobj
					local newangle = R_PointToAngle2(actor.x, actor.y, newtargetpoint.x, newtargetpoint.y)
					actor.angle = newangle
				end
			end
		end
	end
end

local p_in_the_joint = 0
local total_players = 0

addHook("ThinkFrame", do
	if mapheaderinfo[gamemap].sight == "1"
		hud.disable("score")
		hud.disable("rings")
		hud.disable("lives")
		total_players = 0
		p_in_the_joint = 0
		for player in players.iterate do
			if player.valid
				if player.inthejoint == true
					p_in_the_joint = $ + 1
				end
				if not player.mo
				or not player.mo.valid
				or player.playerstate == PST_DEAD
					continue
				end
				total_players = $ + 1
			end
		end
		if total_players == p_in_the_joint
			COM_BufInsertText(consoleplayer, "exitgame")
		end
	end
end)

addHook("PlayerThink", function(player)
	if mapheaderinfo[gamemap].sight == "1"
		if player
			if player.valid
				player.normalspeed = 16*FRACUNIT
				player.runspeed = 16*FRACUNIT
				player.charability = 0
				player.charability2 = 0
				player.jumpfactor = 0
				if player.y4text == nil
					player.y4text = {
						enabled = true,
						wait_to_close = 35
					}
				elseif player.y4text.enabled == true
					player.powers[pw_nocontrol] = 1
					if player.y4text.wait_to_close != 0
						player.y4text.wait_to_close = $ - 1
					elseif (player.cmd.buttons & BT_JUMP)
						player.y4text.enabled = false
					end
				end
				if player.mo and player.mo.valid
					local pmo = player.mo
					if pmo.sight_cd == nil then pmo.sight_cd = 0 end
					if pmo.sight_cd > 100
						player.inthejoint = true
						S_StartSound(nil, sfx_tyitjm, player)
						P_SetOrigin(pmo, 8576*FRACUNIT, 7680*FRACUNIT, 0*FRACUNIT)
					end
				end
			end
		end
	end
end)

local function SIGHTHUD(v) local player = displayplayer
	if mapheaderinfo[gamemap].sight == "1"
		if player.mo.sight_cd != nil
			if player.y4text.enabled == true
				v.fadeScreen(31, 5)
				v.drawFill(8, 32, 296, 112, 253)
				v.drawFill(8, 32, 296, 1, 0)
				v.drawFill(8, 144, 296, 1, 0)
				v.drawString(160, 40, "CAUTION!", 0, "center")
				v.drawString(40, 56, "\x85Head to the millennium tower", 0, "left")
				v.drawString(40, 66, "\x85without being seen by the police.", 0, "left")
				v.drawString(40, 76, "It's\x85 game over\x80 if you're spotted,", 0, "left")
				v.drawString(40, 86, "meaning you'll lose all progress", 0, "left")
				v.drawString(40, 96, "since your last save.", 0, "left")
				v.drawString(40, 116, "Tread carefully!", 0, "left")
				v.drawString(276, 126, "Jump to close", 0, "right")
			end
			local sight = player.mo.sight_cd
			if sight >= 100 then sight = 100 end
			//v.drawString(160, 60, sight, 0, "center")
			v.drawFill(32, 16, 102, 4, 8|V_SNAPTOTOP|V_SNAPTOLEFT)
			v.drawFill(33, 17, 100, 2, 26|V_SNAPTOTOP|V_SNAPTOLEFT)
			v.drawFill(33, 17, sight, 2, 112|V_SNAPTOTOP|V_SNAPTOLEFT)
		end
	end
end

hud.add(SIGHTHUD)

mobjinfo[MT_METALPOLICE] = {
	doomednum = 2401,
	spawnstate = S_MP_STAND,
	spawnhealth = 1000,
	reactiontime = 35,
	speed = 0,
	radius = 16*FRACUNIT,
	height = 48*FRACUNIT,
	mass = 200,
	flags = MF_FLOAT|MF_ENEMY
}

states[S_MP_STAND] = {
	sprite = SPR_SCMT,
	frame = A,
	action = A_MP_THINKER,
	tics = 1,
	nextstate = S_MP_STAND
}

states[S_MP_WALK] = {
	sprite = SPR_SCMT,
	frame = B,
	action = A_MP_THINKER,
	tics = 1,
	nextstate = S_MP_WALK
}

mobjinfo[MT_MPALERT] = {
        doomednum = -1,
        spawnstate = S_MPALERT,
        spawnhealth = 1000,
        reactiontime = 5,
        speed = 0,
        radius = 16*FRACUNIT,
        height = 48*FRACUNIT,
        mass = 1000,
        flags = MF_NOGRAVITY|MF_NOCLIP
}

states[S_MPALERT] = {
        sprite = SPR_SCAT,
        frame = FF_FULLBRIGHT|FF_ANIMATE|A,
        tics = -1,
        var1 = 1,
        var2 = 3,
        nextstate = S_MPALERT
}

addHook("NetVars", function(net)
	zoomtubes = net($)
	p_in_the_joint = net($)
	total_players = net($)
end)