CommandoReinforcements = { "rmbo" }
MCVReinforcements = { "mcv" }

inf1 = { "e4" }

AutocreateSquads =
{
	{ "stnk", "stnk" },
	{ "ftnk", "ftnk" },
	{ "ltnk", "ltnk", "bike" },
	{ "arty", "arty", "bike", "bike" },
	{ "ltnk", "ltnk" },
	{ "stnk", "stnk" },
	{ "ltnk", "ltnk" },
	{ "arty", "arty" }
}

HeliPatrolPaths =
{
	{ HeliPatrol1.Location, HeliPatrol2.Location, HeliPatrol3.Location, HeliPatrol4.Location, HeliPatrol5.Location, HeliPatrol6.Location },
	{ HeliPatrol5.Location, HeliPatrol4.Location, HeliPatrol3.Location, HeliPatrol2.Location, HeliPatrol1.Location, HeliPatrol6.Location }
}

AttackTriggers = { AttackTrigger1, AttackTrigger2, AttackTrigger3, AttackTrigger4 }

harvester = { "harv" }

SamSites = { SAM01, SAM02 }

WorldLoaded = function()
	player = Player.GetPlayer("GDI")
	enemy = Player.GetPlayer("Nod")

	Trigger.OnObjectiveAdded(player, function(p, id)
		Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective")
	end)
	Trigger.OnObjectiveCompleted(player, function(p, id)
		Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed")
	end)
	Trigger.OnObjectiveFailed(player, function(p, id)
		Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed")
	end)

	Trigger.OnPlayerWon(player, function()
		Media.PlaySpeechNotification(player, "Win")
	end)

	Trigger.OnPlayerLost(player, function()
		Media.PlaySpeechNotification(player, "Lose")
	end)

	destroySAMsCenterObjective = player.AddPrimaryObjective("Destroy the SAM sites protecting the Obelisk.")
	destroyObeliskObjective = player.AddPrimaryObjective("Destroy the Obelisk.")
	destroyBiotechCenterObjective = player.AddPrimaryObjective("Destroy the biotech facility.")

	Trigger.OnAllKilled(SamSites, function()
		AirSupport = Actor.Create("airstrike.proxy", true, { Owner = player })
		AirSupportEnabled = true
		player.MarkCompletedObjective(destroySAMsCenterObjective)
	end)

	Trigger.OnDamaged(Obelisk01, function()
		Trigger.AfterDelay(DateTime.Seconds(1), Obelisk01.Kill)
	end)

	Trigger.OnKilled(Obelisk01, function()
		player.MarkCompletedObjective(destroyObeliskObjective)
		Trigger.AfterDelay(DateTime.Seconds(5), function() Reinforce(MCVReinforcements) end)
		ObeliskFlare.Destroy()
		if AirSupportEnabled then AirSupport.Destroy() end
	end)

	Trigger.OnKilled(Biolab, function()
		player.MarkCompletedObjective(destroyBiotechCenterObjective)
	end)

	Trigger.OnCapture(Biolab, function()
		Biolab.Kill()
	end)

	Trigger.OnDamaged(Biolab, HuntTriggerFunction)

	AIRepairBuildings(enemy)
	AIRebuildHarvesters(enemy)

	Utils.Do(AttackTriggers, function(a)
		Trigger.OnKilledOrCaptured(a, function()
			NodVehicleProduction(Utils.Random(AutocreateSquads))
		end)
	end)

	Trigger.AfterDelay(DateTime.Seconds(150), AutoCreateTeam)
	Trigger.AfterDelay(DateTime.Minutes(5), HeliHunt)

	NodInfantryProduction()

	Camera.Position = UnitsRally.CenterPosition
	ObeliskFlare = Actor.Create('flare', true, { Owner = player, Location = Flare.Location })
	Reinforce(CommandoReinforcements)
end

Tick = function()
	if DateTime.GameTime > DateTime.Seconds(5) and player.HasNoRequiredUnits() then
		player.MarkFailedObjective(destroyBiotechCenterObjective)
	end
end

Reinforce = function(units)
	Media.PlaySpeechNotification(player, "Reinforce")
	ReinforceWithLandingCraft(units, lstStart.Location, lstEnd.Location, UnitsRally.Location)
end

ReinforceWithLandingCraft = function(units, transportStart, transportUnload, rallypoint)
	local transport = Actor.Create("oldlst", true, { Owner = player, Facing = 0, Location = transportStart })
	local subcell = 0
	Utils.Do(units, function(a)
		transport.LoadPassenger(Actor.Create(a, false, { Owner = transport.Owner, Facing = transport.Facing, Location = transportUnload, SubCell = subcell }))
		subcell = subcell + 1
	end)

	transport.ScriptedMove(transportUnload)

	transport.CallFunc(function()
		Utils.Do(units, function()
			local a = transport.UnloadPassenger()
			a.IsInWorld = true
			a.MoveIntoWorld(transport.Location - CVec.New(0, 1))

			if rallypoint ~= nil then
				a.Move(rallypoint)
			end
		end)
	end)

	transport.Wait(5)
	transport.ScriptedMove(transportStart)
	transport.Destroy()
end

HuntTriggerFunction = function()
	local list = enemy.GetGroundAttackers()
	Utils.Do(list, function(unit)
		IdleHunt(unit)
	end)
end

IdleHunt = function(unit)
	if not unit.IsDead then
		Trigger.OnIdle(unit, function()
			unit.AttackMove(UnitsRally.Location, 50)
			unit.Hunt()
		end)
	end
end

NodInfantryProduction = function()
	if HandOfNod.IsDead or HandOfNod.Owner == player then
		return
	end
	HandOfNod.Build(inf1, SquadHunt)
	Trigger.AfterDelay(DateTime.Seconds(15), NodInfantryProduction)
end

NodVehicleProduction = function(Squad)
	if Airfield.IsDead or not Airfield.Owner == enemy then
		return
	end
	Airfield.Build(Squad, SquadHunt)
end

AIRepairBuildings = function(ai)
	Utils.Do(Map.NamedActors, function(actor)
		if actor.Owner == ai and actor.HasProperty("StartBuildingRepairs") then
			Trigger.OnDamaged(actor, function(building)
				if building.Owner == ai and building.Health < 0.9 * building.MaxHealth then
					building.StartBuildingRepairs()
				end
			end)
		end
	end)
end

HeliHunt = function()
	local helicopters = enemy.GetActorsByType("heli")
	local patrolpath = Utils.Random(HeliPatrolPaths)

	Utils.Do(helicopters, function(actor)
		Trigger.OnIdle(actor, function()
			actor.Patrol(patrolpath)
		end)
	end)
end

SquadHunt = function(actors)
	Utils.Do(actors, function(actor)
		Trigger.OnIdle(actor, function()
			actor.AttackMove(UnitsRally.Location, 50)
			actor.Hunt()
		end)
	end)
end

AIRebuildHarvesters = function(ai)
	if AIHarvesterCount == NIL or AIHarvesterCount == 0 then
		AIHarvesterCount = #ai.GetActorsByType("harv")
		IsBuildingHarvester = false
	end

	local CurrentHarvesterCount = #ai.GetActorsByType("harv")

	if CurrentHarvesterCount < AIHarvesterCount and Airfield.Owner == enemy and not IsBuildingHarvester and not Airfield.IsDead then
		IsBuildingHarvester = true
		Airfield.Build(harvester, function()
			IsBuildingHarvester = false
		end)
	end
	Trigger.AfterDelay(DateTime.Seconds(5), function() AIRebuildHarvesters(ai) end)
end

AutoCreateTeam = function()
	NodVehicleProduction(Utils.Random(AutocreateSquads))
	Trigger.AfterDelay(DateTime.Seconds(150), AutoCreateTeam)
end
