Files
OpenRA/mods/ra/maps/soviet-09/soviet09-AI.lua
2023-01-11 11:58:54 +02:00

190 lines
5.2 KiB
Lua

--[[
Copyright (c) The OpenRA Developers and Contributors
This file is part of OpenRA, which is free software. It is made
available to you under the terms of the GNU General Public License
as published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version. For more
information, see COPYING.
]]
AttackGroup = { }
AttackGroupSize = 12
AlliedInfantry = { "e1", "e3" }
AlliedVehicles = { "jeep", "1tnk", "2tnk", "2tnk" }
AlliedAircraftType = { "heli" }
Longbows = { }
ProductionInterval =
{
easy = DateTime.Seconds(25),
normal = DateTime.Seconds(15),
hard = DateTime.Seconds(5)
}
AttackPaths =
{
{ SouthAttack1.Location, SouthAttack2.Location, DefaultCameraPosition.Location },
{ TruckStop2.Location, TruckStop1.Location, DefaultCameraPosition.Location }
}
WTransUnits = { { "2tnk", "1tnk", "1tnk", "e3", "e3" }, { "2tnk", "2tnk", "2tnk" } }
WTransDelays =
{
easy = DateTime.Minutes(5),
normal = DateTime.Minutes(3),
hard = DateTime.Minutes(1)
}
WTransWays =
{
{ SeaEntryEast.Location, SeaEastLZ.Location },
{ SeaEntryWest1.Location, SeaWestLZ1.Location },
{ SeaEntryWest1.Location, SeaWestPath1.Location, SeaWestLZ2.Location },
{ SeaEntryWest2.Location, SeaWestPath2.Location, SeaWestPath3.Location, SeaWestLZ3.Location },
{ SeaEntryWest2.Location, SeaWestPath2.Location, SeaWestPath3.Location, SeaWestLZ4.Location }
}
ChinookChalk = { "e1", "e1", "e1", "e1", "e3", "e3", "e3", "e3" }
ChinookPaths =
{
{ SeaEntryEast.Location, LZ1.Location },
{ TruckEscapeEast.Location, LZ2.Location },
{ ChinookEntrySouth.Location, LZ3.Location },
{ SeaEntryWest2.Location, LZ4.Location }
}
ChinookDelay =
{
easy = { DateTime.Minutes(1), DateTime.Seconds(90) },
normal = { DateTime.Seconds(45), DateTime.Seconds(75) },
hard = { DateTime.Seconds(30), DateTime.Minutes(1) }
}
ChinookWaves =
{
easy = 4,
normal = 8,
hard = 12
}
ChinookAttacks = 0
ChinookAttack = function()
Trigger.AfterDelay(Utils.RandomInteger(ChinookDelay[1], ChinookDelay[2]), function()
local way = Utils.Random(ChinookPaths)
local units = ChinookChalk
local chalk = Reinforcements.ReinforceWithTransport(Greece, "tran", units , way, { way[2], way[1] })[2]
Utils.Do(chalk, function(unit)
Trigger.OnAddedToWorld(unit, IdleHunt)
end)
ChinookAttacks = ChinookAttacks + 1
if ChinookAttacks <= ChinookWaves[Difficulty] then
ChinookAttack()
end
end)
end
ProduceInfantry = function()
if GermanyTent.IsDead or GermanyTent.Owner ~= Germany then
return
end
Germany.Build({ Utils.Random(AlliedInfantry) }, function(units)
table.insert(AttackGroup, units[1])
SendAttackGroup()
Trigger.AfterDelay(ProductionInterval[Difficulty], ProduceInfantry)
end)
end
ProduceVehicles = function()
if GermanyWarFactory.IsDead or GermanyWarFactory.Owner ~= Germany then
return
end
Germany.Build({ Utils.Random(AlliedVehicles) }, function(units)
table.insert(AttackGroup, units[1])
SendAttackGroup()
Trigger.AfterDelay(ProductionInterval[Difficulty], ProduceVehicles)
end)
end
SendAttackGroup = function()
if #AttackGroup < AttackGroupSize then
return
end
Utils.Do(AttackGroup, IdleHunt)
AttackGroup = { }
end
GreeceAircraft = function()
if (GreeceHpad1.IsDead or GreeceHpad1.Owner ~= Greece) and (GreeceHpad2.IsDead or GreeceHpad2.Owner ~= Greece) then
return
end
Greece.Build(AlliedAircraftType, function(units)
local longbow = units[1]
Longbows[#Longbows + 1] = longbow
Trigger.OnKilled(longbow, GreeceAircraft)
local alive = Utils.Where(Longbows, function(y) return not y.IsDead end)
if #alive < 2 then
Trigger.AfterDelay(DateTime.Seconds(90), GreeceAircraft)
end
InitializeAttackAircraft(longbow, USSR)
end)
end
GermanAircraft = function()
if (GermanyHpad1.IsDead or GermanyHpad1.Owner ~= Germany) and (GermanyHpad2.IsDead or GermanyHpad2.Owner ~= Germany) then
return
end
Germany.Build(AlliedAircraftType, function(units)
local longbow = units[1]
Longbows[#Longbows + 1] = longbow
Trigger.OnKilled(longbow, GermanAircraft)
local alive = Utils.Where(Longbows, function(y) return not y.IsDead end)
if #alive < 2 then
Trigger.AfterDelay(DateTime.Seconds(ProductionInterval[Difficulty] / 2), GermanAircraft)
end
InitializeAttackAircraft(longbow, USSR)
end)
end
WTransWaves = function()
local way = Utils.Random(WTransWays)
local units = Utils.Random(WTransUnits)
local attackUnits = Reinforcements.ReinforceWithTransport(Greece, "lst", units , way, { way[2], way[1] })[2]
Utils.Do(attackUnits, function(a)
Trigger.OnAddedToWorld(a, function()
a.AttackMove(DefaultCameraPosition.Location)
IdleHunt(a)
end)
end)
Trigger.AfterDelay(WTransDelays, WTransWaves)
end
ActivateAI = function()
WTransDelays = WTransDelays[Difficulty]
ChinookDelay = ChinookDelay[Difficulty]
local buildings = Utils.Where(Map.ActorsInWorld, function(self) return self.Owner ~= USSR and self.HasProperty("StartBuildingRepairs") end)
Utils.Do(buildings, function(actor)
Trigger.OnDamaged(actor, function(building)
if building.Owner ~= USSR and building.Health < building.MaxHealth * 3/4 then
building.StartBuildingRepairs()
end
end)
end)
Trigger.AfterDelay(DateTime.Minutes(3), WTransWaves)
ChinookAttack()
ProduceInfantry()
ProduceVehicles()
GreeceAircraft()
GermanAircraft()
end