-- this code hijacked from the new rocket launcher
local Rocket = Instance.new("Part")
Rocket.Locked = true
Rocket.BackSurface = 3
Rocket.BottomSurface = 3
Rocket.FrontSurface = 3
Rocket.LeftSurface = 3
Rocket.RightSurface = 3
Rocket.TopSurface = 3
Rocket.Size = Vector3.new(1,1,4)
Rocket.BrickColor = BrickColor.new(24)
script.Parent.RocketScript:clone().Parent = Rocket
script.Parent.Explosion:clone().Parent = Rocket
script.Parent.Swoosh:clone().Parent = Rocket

function getPlayerTeamName(player)
	local teams = game.Teams:children()
	for i=1, #teams do
		if (teams[i].TeamColor == player.TeamColor) then return teams[i].Name end
	end
end

function getTeamColorFromName(name)
	local teams = game.Teams:children()
	for i=1, #teams do
		if (teams[i].Name == name) then return teams[i].TeamColor end
	end

	return BrickColor.new(24)
end

function fire(target)


	local dir = target - sphere.Position
	dir = computeDirection(dir)


	local missile = Rocket:clone()

	local spawnPos = sphere.Position

	local pos = spawnPos + (dir * 8)
	
	--missile.Position = pos
	missile.CFrame = CFrame.new(pos,  pos + dir)

	
	missile.RocketScript.Disabled = false
	missile.Parent = game.Workspace


end

function computeDirection(vec)
	local lenSquared = vec.magnitude * vec.magnitude
	local invSqrt = 1 / math.sqrt(lenSquared)
	return Vector3.new(vec.x * invSqrt, vec.y * invSqrt, vec.z * invSqrt)
end



function scanForHumans()
	-- KILL THE HUMANS!!!!!!!!!!

	-- find the closest human that is not on my team
	

	local players = game.Players:children()

	local best_distance = 10000
	local best_target = nil

	for n=1,#players do
		if (getPlayerTeamName(players[n]) ~= script.Parent.OwningTeam.Value) then
			if (players[n].Character ~= nil) then
				local dist = (players[n].Character.PrimaryPart.Position - sphere.Position).magnitude
				if (dist < best_distance) then
					best_distance = dist
					best_target = players[n].Character
				end
			end
		end
	end

	myTarget =  best_target

	
end

function moveKillbot()
	
	-- killbots move using a biased random walk toward the target
	-- they also like to float at least 10 studs above the ground

	local dx = math.random(-100,100)
	local dy = math.random(-40,40)
	local dz = math.random(-100,100)

	if (sphere.Position.y < 10 and dy < 0) then dy = -dy end
	if (sphere.Position.y > 80 and dy > 0) then dy = -dy end

	if (myTarget ~= nil) then
		local dir = computeDirection(myTarget.PrimaryPart.Position - sphere.Position)
		dx = dx + (dir.x * 80) -- change this number to alter player trophism
		dz = dz + (dir.z * 80)
	end

	local vec = computeDirection(Vector3.new(dx,dy,dz))

	sphere.BodyPosition.position = sphere.Position + (vec * 40) -- change this number to alter speed
	

end

function onTouched(hit)
	local humanoid = hit.Parent:findFirstChild("Humanoid")
	if humanoid~=nil then
		humanoid.Health = humanoid.Health - 2000 -- Killbots kill you when you touch them! duh.
	else
		-- sadly, there is no good way to give a killbot hit points, so one hit with any weapon kills them
		script.Parent.Parent = nil
	end
end

sphere.Touched:connect(onTouched)

if (script.Parent.OwningTeam.Value ~= nil) then sphere.BrickColor = getTeamColorFromName(script.Parent.OwningTeam.Value) end

while true do  -- loop forever
	scanForHumans()

	for n=1,5 do
		if (myTarget ~= nil) then
			if(math.random(1,3) == 2) then fire(myTarget.PrimaryPart.Position) end
			wait(math.random(1,2))
			moveKillbot()
			wait(math.random(1,2))
		end
	end
	wait(1) -- don't hog CPU
end