200 lines
7.1 KiB
Lua
200 lines
7.1 KiB
Lua
--[[
|
|
Copyright 2007-2020 The OpenRA Developers (see AUTHORS)
|
|
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.
|
|
]]
|
|
|
|
NodUnitsVehicle = { 'bike', 'bike', 'bggy', 'ltnk', 'bike', 'bike' }
|
|
NodUnitsRocket = { 'e1', 'e1', 'e1', 'e1' }
|
|
NodUnitsGunner = { 'e3', 'e3', 'e3', 'e3' }
|
|
GDIReinforceUnits = { 'e2', 'e2', 'e2', 'e2', 'e2' }
|
|
|
|
GDI1Units = { ['e1'] = 3, ['e2'] = 1 }
|
|
GDI2Units = { ['e1'] = 2, ['e2'] = 1 }
|
|
GDI3Units = { ['jeep'] = 1 }
|
|
GDI4Units = { ['mtnk'] = 1 }
|
|
GDI5Units = { ['e1'] = 1, ['e2'] = 2 }
|
|
GDI6Units = { ['e1'] = 3 }
|
|
GDI7Units = { ['e2'] = 2 }
|
|
GDI8Units = { ['e2'] = 5 }
|
|
|
|
AllUnits = { GDI1Units, GDI2Units, GDI3Units, GDI4Units, GDI5Units, GDI6Units, GDI7Units, GDI8Units }
|
|
|
|
AirstrikeDelay = DateTime.Minutes(1) + DateTime.Seconds(40)
|
|
|
|
DelyCellTriggerActivator = { CPos.New(29,30), CPos.New(28,30), CPos.New(27,30), CPos.New(26,30), CPos.New(25,30), CPos.New(24,30), CPos.New(23,30), CPos.New(22,30), CPos.New(21,30), CPos.New(29,29), CPos.New(28,29), CPos.New(27,29), CPos.New(26,29), CPos.New(25,29), CPos.New(24,29), CPos.New(23,29), CPos.New(22,29) }
|
|
DelzCellTriggerActivator = { CPos.New(29,27), CPos.New(28,27), CPos.New(27,27), CPos.New(26,27), CPos.New(25,27), CPos.New(24,27), CPos.New(29,26), CPos.New(28,26), CPos.New(27,26), CPos.New(26,26), CPos.New(25,26), CPos.New(24,26) }
|
|
Atk5CellTriggerActivator = { CPos.New(10,33), CPos.New(9,33), CPos.New(8,33), CPos.New(9,32), CPos.New(8,32), CPos.New(7,32), CPos.New(8,31), CPos.New(7,31), CPos.New(6,31) }
|
|
Atk1CellTriggerActivator = { CPos.New(10,33), CPos.New(9,33), CPos.New(8,33), CPos.New(9,32), CPos.New(8,32), CPos.New(7,32), CPos.New(8,31), CPos.New(7,31), CPos.New(6,31) }
|
|
|
|
GDI1Waypoints = { waypoint0, waypoint1, waypoint3, waypoint4 }
|
|
GDI2Waypoints = { waypoint0, waypoint1, waypoint3, waypoint4, waypoint5 }
|
|
GDI3Waypoints = { waypoint0, waypoint1, waypoint2 }
|
|
GDI5Waypoints = { waypoint0, waypoint1, waypoint3, waypoint1, waypoint6 }
|
|
GDI11Waypoints = { waypoint0, waypoint1, waypoint3, waypoint4, waypoint7, waypoint8 }
|
|
GDI12Waypoints = { waypoint0, waypoint1, waypoint3, waypoint11, waypoint12 }
|
|
|
|
AllWaypoints = { GDI1Waypoints, GDI2Waypoints, GDI3Waypoints, GDI5Waypoints, GDI11Waypoints, GDI12Waypoints }
|
|
|
|
PrimaryTargets = { Tower1, Tower2, CommCenter, Silo1, Silo2, Silo3, Refinery, Barracks, Plant1, Plant2, Yard, Factory }
|
|
|
|
SendGDIAirstrike = function()
|
|
if not CommCenter.IsDead and CommCenter.Owner == GDI then
|
|
local target = GetAirstrikeTarget(Nod)
|
|
|
|
if target then
|
|
CommCenter.TargetAirstrike(target, Angle.NorthEast + Angle.New(16))
|
|
Trigger.AfterDelay(AirstrikeDelay, SendGDIAirstrike)
|
|
else
|
|
Trigger.AfterDelay(AirstrikeDelay/4, SendGDIAirstrike)
|
|
end
|
|
end
|
|
end
|
|
|
|
SendGDI2Units = function()
|
|
if DontSendGDI2 then
|
|
return
|
|
end
|
|
|
|
for type, count in pairs(GDI2Units) do
|
|
MoveAndHunt(Utils.Take(count, GDI.GetActorsByType(type)), GDI2Waypoints)
|
|
end
|
|
end
|
|
|
|
SendGDI1Units = function()
|
|
if DontSendGDI1 then
|
|
return
|
|
end
|
|
|
|
for type, count in pairs(GDI1Units) do
|
|
MoveAndHunt(Utils.Take(count, GDI.GetActorsByType(type)), GDI1Waypoints)
|
|
end
|
|
end
|
|
|
|
AutoPatrol = function()
|
|
local units = AllUnits[DateTime.GameTime % #AllUnits + 1]
|
|
local waypoints = AllWaypoints[DateTime.GameTime % #AllWaypoints + 1]
|
|
|
|
for type, count in pairs(units) do
|
|
MoveAndHunt(Utils.Take(count, GDI.GetActorsByType(type)), waypoints)
|
|
end
|
|
|
|
Trigger.AfterDelay(DateTime.Seconds(45), AutoPatrol)
|
|
end
|
|
|
|
RebuildStartUnits = function()
|
|
local types = { "e1", "e2", "jeep", "mtnk" }
|
|
local factories = { Barracks, Barracks, Factory, Factory }
|
|
|
|
for i = 1, 4 do
|
|
Utils.Do(GDI.GetActorsByType(types[i]), function(actor)
|
|
RebuildUnit({ actor }, GDI, factories[i])
|
|
end)
|
|
end
|
|
end
|
|
|
|
WorldLoaded = function()
|
|
Nod = Player.GetPlayer("Nod")
|
|
GDI = Player.GetPlayer("GDI")
|
|
|
|
Camera.Position = UnitsEntry.CenterPosition
|
|
|
|
Media.PlaySpeechNotification(Nod, "Reinforce")
|
|
Reinforcements.Reinforce(Nod, NodUnitsVehicle, { UnitsEntry.Location, UnitsRallyVehicle.Location }, 1)
|
|
Reinforcements.Reinforce(Nod, NodUnitsRocket, { UnitsEntry.Location, UnitsRallyRocket.Location }, 50)
|
|
Reinforcements.Reinforce(Nod, NodUnitsGunner, { UnitsEntry.Location, UnitsRallyGunner.Location }, 50)
|
|
Trigger.AfterDelay(DateTime.Seconds(6), function()
|
|
Reinforcements.Reinforce(Nod, { 'mcv' }, { UnitsEntry.Location, UnitsRallyMCV.Location })
|
|
end)
|
|
|
|
InitObjectives(Nod)
|
|
|
|
BuildSAMObjective = Nod.AddObjective("Build 3 SAMs.")
|
|
DestroyGDI = Nod.AddObjective("Destroy the GDI base.")
|
|
GDIObjective = GDI.AddObjective("Kill all enemies.")
|
|
|
|
Trigger.AfterDelay(AirstrikeDelay, SendGDIAirstrike)
|
|
Trigger.AfterDelay(DateTime.Minutes(1) + DateTime.Seconds(30), SendGDI2Units)
|
|
Trigger.AfterDelay(DateTime.Minutes(2) + DateTime.Seconds(30), SendGDI1Units)
|
|
|
|
Trigger.OnEnteredFootprint(DelyCellTriggerActivator, function(a, id)
|
|
if a.Owner == Nod then
|
|
DontSendGDI2 = true
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(DelzCellTriggerActivator, function(a, id)
|
|
if a.Owner == Nod then
|
|
DontSendGDI1 = true
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(Atk5CellTriggerActivator, function(a, id)
|
|
if a.Owner == Nod then
|
|
MoveAndHunt(Utils.Take(1, GDI.GetActorsByType("mtnk")), GDI12Waypoints)
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
end
|
|
end)
|
|
|
|
Trigger.AfterDelay(DateTime.Seconds(3), function()
|
|
MoveAndHunt(Utils.Take(2, GDI.GetActorsByType("jeep")), GDI5Waypoints)
|
|
end)
|
|
|
|
Trigger.AfterDelay(DateTime.Minutes(1) + DateTime.Seconds(10), function()
|
|
for type, count in pairs(GDI1Units) do
|
|
MoveAndHunt(Utils.Take(count, GDI.GetActorsByType(type)), GDI1Waypoints)
|
|
end
|
|
end)
|
|
|
|
Trigger.AfterDelay(DateTime.Minutes(3) + DateTime.Seconds(10), function()
|
|
for type, count in pairs(GDI2Units) do
|
|
MoveAndHunt(Utils.Take(count, GDI.GetActorsByType(type)), GDI2Waypoints)
|
|
end
|
|
end)
|
|
|
|
Trigger.AfterDelay(DateTime.Minutes(4) + DateTime.Seconds(40), function()
|
|
MoveAndHunt(Utils.Take(1, GDI.GetActorsByType("jeep")), GDI3Waypoints)
|
|
end)
|
|
|
|
Trigger.AfterDelay(DateTime.Minutes(2) + DateTime.Seconds(30), function()
|
|
MoveAndHunt(Utils.Take(1, GDI.GetActorsByType("mtnk")), GDI1Waypoints)
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(Atk1CellTriggerActivator, function(a, id)
|
|
if a.Owner == Nod then
|
|
local cargo = Reinforcements.ReinforceWithTransport(GDI, "tran", GDIReinforceUnits, { waypoint9.Location, waypoint26.Location }, { waypoint9.Location })[2]
|
|
Utils.Do(cargo, IdleHunt)
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
end
|
|
end)
|
|
|
|
Trigger.OnAllKilledOrCaptured(PrimaryTargets, function()
|
|
Nod.MarkCompletedObjective(DestroyGDI)
|
|
Utils.Do(GDI.GetGroundAttackers(), IdleHunt)
|
|
end)
|
|
|
|
Trigger.AfterDelay(0, RebuildStartUnits)
|
|
|
|
AutoPatrol()
|
|
end
|
|
|
|
Tick = function()
|
|
if DateTime.GameTime > 2 and Nod.HasNoRequiredUnits() then
|
|
GDI.MarkCompletedObjective(GDIObjective)
|
|
end
|
|
|
|
if not Nod.IsObjectiveCompleted(BuildSAMObjective) and CheckForSams(Nod) then
|
|
Nod.MarkCompletedObjective(BuildSAMObjective)
|
|
end
|
|
end
|
|
|
|
CheckForSams = function(Nod)
|
|
local sams = Nod.GetActorsByType("sam")
|
|
return #sams >= 3
|
|
end
|