apparently helicopters can't .Hunt() I introduced the bug late in testing, so it didn't trigger in review on the plus side, AI will now attack you from a random direction
224 lines
6.2 KiB
Lua
224 lines
6.2 KiB
Lua
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
|