240 lines
6.5 KiB
Lua
240 lines
6.5 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.
|
|
]]
|
|
FirstPatrolActors = { Cruiser1, Gunboat1, Gunboat2 }
|
|
PatrolA = { Rocket1, Rocket2 }
|
|
PatrolB = { Rocket3, Rocket4 }
|
|
PatrolC = { Rocket5, Rocket6 }
|
|
PatrolPathA = { RocketPath1.Location, RocketPath2.Location }
|
|
PatrolPathB = { RocketPath3.Location, RocketPath4.Location }
|
|
PatrolPathC = { RocketPath5.Location, RocketPath6.Location }
|
|
|
|
Helipads = { Helipad1, Helipad2, Helipad3, Helipad4 }
|
|
HeliType = { "heli" }
|
|
DestroyerSquad = { "dd", "dd" }
|
|
|
|
DestroyerDelays =
|
|
{
|
|
easy = 4,
|
|
normal = 3,
|
|
hard = 2
|
|
}
|
|
|
|
TransportDelays =
|
|
{
|
|
easy = 6,
|
|
normal = 5,
|
|
hard = 4
|
|
}
|
|
|
|
AlliedShips =
|
|
{
|
|
easy = { "pt", "pt", "dd" },
|
|
normal = { "pt", "dd", "dd" },
|
|
hard = { "dd", "dd" , "dd" }
|
|
}
|
|
|
|
Helis = { }
|
|
|
|
PatrolWay = { ShipWaypoint1.Location, ShipWaypoint2.Location, ShipWaypoint3.Location, ShipWaypoint4.Location, ShipWaypoint5.Location }
|
|
|
|
TransportWays =
|
|
{
|
|
{ AlliedTransportEntry1.Location, AlliedTransportDrop1.Location },
|
|
{ AlliedTransportEntry2.Location, AlliedTransportDrop2.Location },
|
|
{ AlliedTransportEntry3.Location, AlliedTransportDrop3.Location }
|
|
}
|
|
|
|
SurpriseTransportWay = { SurpriseTransportEntry.Location, SurpriseTransportDrop.Location }
|
|
|
|
TransportUnits =
|
|
{
|
|
easy = { { "1tnk", "1tnk", "2tnk" }, { "arty", "jeep", "1tnk" } },
|
|
normal = { { "1tnk", "2tnk", "2tnk" }, { "arty", "arty", "1tnk" } },
|
|
hard = { { "2tnk", "2tnk", "2tnk" }, { "arty", "arty", "2tnk" } }
|
|
}
|
|
|
|
SurpriseTransportUnits =
|
|
{
|
|
easy = { "jeep", "jeep", "1tnk" },
|
|
normal = { "jeep", "jeep", "1tnk" },
|
|
hard = { "jeep", "1tnk", "2tnk" }
|
|
}
|
|
|
|
ProductionDelays =
|
|
{
|
|
easy = 3,
|
|
normal = 2,
|
|
hard = 1
|
|
}
|
|
|
|
SendCruiser = function()
|
|
if NavalYard2.IsDead or NavalYard2.Owner ~= Greece then
|
|
return
|
|
end
|
|
|
|
local boat = Reinforcements.Reinforce(Greece, { "ca" }, { CruiserEntry.Location })
|
|
Utils.Do(boat, function(ca)
|
|
ca.Move(DefaultCameraPosition.Location)
|
|
Trigger.OnKilled(ca, function()
|
|
Trigger.AfterDelay(DateTime.Minutes(3), SendCruiser)
|
|
end)
|
|
end)
|
|
end
|
|
|
|
WesternBoatAttacks = function()
|
|
if NavalYard3.IsDead or NavalYard3.Owner ~= Greece then
|
|
return
|
|
end
|
|
|
|
local boats = Reinforcements.Reinforce(Greece, DestroyerSquad, { ShipEntry.Location })
|
|
Utils.Do(boats, function(dd)
|
|
dd.Patrol(PatrolWay, false, 1)
|
|
IdleHunt(dd)
|
|
end)
|
|
Trigger.OnAllKilled(boats, function()
|
|
Trigger.AfterDelay(DateTime.Minutes(DestroyerDelays), WesternBoatAttacks)
|
|
end)
|
|
end
|
|
|
|
AlliedTransportReinforcements = function()
|
|
local way = Utils.Random(TransportWays)
|
|
local group = Utils.Random(TransportUnits)
|
|
local units = Reinforcements.ReinforceWithTransport(Greece, "lst", group, way, { way[2], way[1] } )[2]
|
|
Utils.Do(units, function(a)
|
|
Trigger.OnAddedToWorld(a, function()
|
|
a.AttackMove(PlayerBase.Location)
|
|
IdleHunt(a)
|
|
end)
|
|
end)
|
|
|
|
Trigger.AfterDelay(DateTime.Minutes(TransportDelays), AlliedTransportReinforcements)
|
|
end
|
|
|
|
BuildingsHealing = function()
|
|
local buildings = Utils.Where(Map.ActorsInWorld, function(self) return self.Owner == Greece and self.HasProperty("StartBuildingRepairs") end)
|
|
Utils.Do(buildings, function(actor)
|
|
Trigger.OnDamaged(actor, function(building)
|
|
if building.Owner == Greece and building.Health < building.MaxHealth * 3/4 then
|
|
building.StartBuildingRepairs()
|
|
end
|
|
end)
|
|
end)
|
|
end
|
|
|
|
StartPatrols = function()
|
|
Utils.Do(FirstPatrolActors, function(a)
|
|
if not a.IsDead then
|
|
a.Patrol(PatrolWay, false, 1)
|
|
IdleHunt(a)
|
|
end
|
|
end)
|
|
|
|
Utils.Do(PatrolA, function(a)
|
|
a.Patrol(PatrolPathA, true, 20)
|
|
end)
|
|
Utils.Do(PatrolB, function(b)
|
|
b.Patrol(PatrolPathB, true, 20)
|
|
end)
|
|
Utils.Do(PatrolC, function(c)
|
|
c.Patrol(PatrolPathC, true, 20)
|
|
end)
|
|
end
|
|
|
|
ProduceShips = function()
|
|
if NavalYard1.IsDead or NavalYard1.Owner ~= Greece then
|
|
return
|
|
end
|
|
|
|
Greece.Build(AlliedShips, function(ships)
|
|
Utils.Do(ships, function(a)
|
|
a.AttackMove(ShipWaypoint5.Location)
|
|
IdleHunt(a)
|
|
end)
|
|
end)
|
|
|
|
Trigger.AfterDelay(DateTime.Minutes(ProductionDelays), ProduceShips)
|
|
end
|
|
|
|
ProduceHelicopters = function()
|
|
if Utils.All(Helipads, function(a) return a.IsDead or a.Owner ~= Greece end) then
|
|
return
|
|
end
|
|
|
|
Greece.Build(HeliType, function(helis)
|
|
local heli = helis[1]
|
|
Helis[#Helis+1] = heli
|
|
|
|
Trigger.OnKilled(heli, ProduceHelicopters)
|
|
|
|
local alive = Utils.Where(Helis, function(y) return not y.IsDead end)
|
|
if #alive < 2 then
|
|
Trigger.AfterDelay(DateTime.Minutes(ProductionDelays), ProduceHelicopters)
|
|
end
|
|
|
|
InitializeAttackAircraft(heli, USSR)
|
|
end)
|
|
end
|
|
|
|
AlliedTransportAmbush = function()
|
|
Trigger.OnEnteredProximityTrigger(AmbushTrigger.CenterPosition, WDist.New(1024 * 7), function(a, id)
|
|
if a.Owner == USSR then
|
|
Trigger.RemoveProximityTrigger(id)
|
|
local way = SurpriseTransportWay
|
|
local group = SurpriseTransportUnits
|
|
local units = Reinforcements.ReinforceWithTransport(Greece, "lst", group, way, { way[2], way[1] } )[2]
|
|
Utils.Do(units, function(a)
|
|
Trigger.OnAddedToWorld(a, function()
|
|
a.AttackMove(PlayerBase.Location)
|
|
IdleHunt(a)
|
|
end)
|
|
end)
|
|
end
|
|
end)
|
|
end
|
|
|
|
BridgeTrigger = function()
|
|
TheBridge = Utils.Where(Map.ActorsInWorld, function(actor) return actor.Type == "bridge1" end)[1]
|
|
Trigger.OnKilled(BridgeBarrel, function()
|
|
if not TheBridge.IsDead then
|
|
TheBridge.Kill()
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredProximityTrigger(BaseBridge.CenterPosition, WDist.FromCells(3), function(actor, id)
|
|
if actor.Owner == USSR and actor.Type ~= "badr" and actor.Type ~= "u2" and actor.Type ~= "camera.spyplane" then
|
|
Trigger.RemoveProximityTrigger(id)
|
|
|
|
if not BridgeTank.IsDead and not BridgeBarrel.IsDead and not TheBridge.IsDead then
|
|
BridgeTank.Attack(BridgeBarrel, true, true)
|
|
end
|
|
end
|
|
end)
|
|
end
|
|
|
|
ActivateAI = function()
|
|
TransportDelays = TransportDelays[Difficulty]
|
|
DestroyerDelays = DestroyerDelays[Difficulty]
|
|
TransportUnits = TransportUnits[Difficulty]
|
|
ProductionDelays = ProductionDelays[Difficulty]
|
|
AlliedShips = AlliedShips[Difficulty]
|
|
SurpriseTransportUnits = SurpriseTransportUnits[Difficulty]
|
|
|
|
BuildingsHealing()
|
|
AlliedTransportAmbush()
|
|
BridgeTrigger()
|
|
NavalYard1.IsPrimaryBuilding = true
|
|
|
|
Trigger.AfterDelay(DateTime.Minutes(1), StartPatrols)
|
|
Trigger.AfterDelay(DateTime.Minutes(3), AlliedTransportReinforcements)
|
|
Trigger.AfterDelay(DateTime.Minutes(4), WesternBoatAttacks)
|
|
Trigger.AfterDelay(DateTime.Minutes(5), ProduceShips)
|
|
Trigger.AfterDelay(DateTime.Minutes(6), ProduceHelicopters)
|
|
Trigger.AfterDelay(DateTime.Minutes(7), SendCruiser)
|
|
end
|