Files
OpenRA/mods/cnc/maps/cnc64gdi01/cnc64gdi01.lua
clemty 6a3b558227 Fix crash in cnc64gdi01
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
2015-10-01 23:00:01 +02:00

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