--[[ 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. ]] SamSites = { sam1, sam2, sam3 } WaypointGroup1 = { waypoint4, waypoint5, waypoint6, waypoint7, waypoint10, waypoint11, waypoint12 } WaypointGroup2 = { waypoint4, waypoint5, waypoint13, waypoint16 } WaypointGroup3 = { waypoint4, waypoint5, waypoint6, waypoint8 } WaypointGroup4 = { waypoint4, waypoint5, waypoint6, waypoint7, waypoint9 } WaypointGroup5 = { waypoint4, waypoint5, waypoint6 } WaypointGroup6 = { waypoint4, waypoint5, waypoint6, waypoint7, waypoint14, waypoint15 } WaypointGroup7 = { waypoint4, waypoint5 } WaypointGroupCiv = { waypoint0, waypoint1, waypoint2, waypoint3 } Atk1 = { units = { ['ltnk'] = 1 }, waypoints = WaypointGroup1, delay = 0 } Atk2 = { units = { ['ltnk'] = 1 }, waypoints = WaypointGroup2, delay = 0 } Civ1 = { units = { ['c3'] = 1 }, waypoints = WaypointGroupCiv, delay = 0 } Nod1 = { units = { ['e1'] = 2, ['e2'] = 2, ['e4'] = 2 }, waypoints = WaypointGroup3, delay = 90 } Nod2 = { units = { ['e3'] = 2, ['e4'] = 2 }, waypoints = WaypointGroup3, delay = 130 } Nod3 = { units = { ['e1'] = 2, ['e3'] = 3 }, waypoints = WaypointGroup3, delay = 50 } Nod4 = { units = { ['bggy'] = 2 }, waypoints = WaypointGroup3, delay = 200 } Nod5 = { units = { ['e4'] = 2, ['ltnk'] = 1 }, waypoints = WaypointGroup1, delay = 250 } Nod6 = { units = { ['arty'] = 1 }, waypoints = WaypointGroup4, delay = 40 } Nod7 = { units = { ['e3'] = 2, ['e4'] = 2 }, waypoints = WaypointGroup4, delay = 40 } Nod8 = { units = { ['ltnk'] = 1, ['bggy'] = 1 }, waypoints = WaypointGroup3, delay = 170 } Auto1 = { units = { ['e1'] = 2, ['e2'] = 2 }, waypoints = WaypointGroup5, delay = 50 } Auto2 = { units = { ['e3'] = 3, ['e4'] = 2 }, waypoints = WaypointGroup3, delay = 50 } Auto3 = { units = { ['ltnk'] = 1, ['bggy'] = 1 }, waypoints = WaypointGroup3, delay = 50 } Auto4 = { units = { ['bggy'] = 2 }, waypoints = WaypointGroup7, delay = 50 } Auto5 = { units = { ['ltnk'] = 1 }, waypoints = WaypointGroup6, delay = 50 } Auto6 = { units = { ['arty'] = 1 }, waypoints = WaypointGroup4, delay = 50 } Auto7 = { units = { ['e3'] = 3, ['e4'] = 2 }, waypoints = WaypointGroup6, delay = 50 } AutoAttackWaves = { Atk1, Atk2, Nod1, Nod2, Nod3, Nod4, Nod5, Nod6, Nod7, Nod8, Auto1, Auto2, Auto3, Auto4, Auto5, Auto6, Auto7 } StationaryGuardUnits = { Actor181, Actor182, Actor183, Actor184, Actor198, Actor199, Actor157, Actor175, Actor176, Actor173, Actor174, Actor158, Actor200, Actor159, Actor179, Actor180, Actor184, Actor185, Actor216, Actor217, Actor153, Actor215, Actor214, Actor213} DamagedGDIAssets = { Actor126, Actor127, Actor128, Actor129, Actor130,Actor131, Actor132, Actor133, Actor134, Actor135, Actor136, Actor137, Actor138, Actor160, Actor161, Actor162, Actor163, Actor164, Actor165, Actor166, Actor168, Actor169, Actor170} StartStationaryGuards = function(StationaryGuards) Utils.Do(StationaryGuards, function(unit) if not unit.IsDead then unit.Patrol( { unit.Location } , true, 20) end end) end SendWaves = function(counter, Waves) if counter <= #Waves then local team = Waves[counter] for type, amount in pairs(team.units) do MoveAndHunt(Utils.Take(amount, Nod.GetActorsByType(type)), team.waypoints) end Trigger.AfterDelay(DateTime.Seconds(team.delay), function() SendWaves(counter + 1, Waves) end) end end CheckRepairGDIAssetsObjective = function() local failed = false local repaired = true Utils.Do(DamagedGDIAssets, function(actor) if actor.IsDead then failed = true elseif actor.Health < actor.MaxHealth then repaired = false end end) if failed then GDI.MarkFailedObjective(RepairAssets) return elseif repaired then GDI.MarkCompletedObjective(RepairAssets) return end Trigger.AfterDelay(DateTime.Seconds(3), function() CheckRepairGDIAssetsObjective() end) end WorldLoaded = function() GDI = Player.GetPlayer("GDI") Nod = Player.GetPlayer("Nod") Camera.Position = DefaultCameraPosition.CenterPosition StartStationaryGuards(StationaryGuardUnits) StartAI() InitObjectives(GDI) SecureArea = AddPrimaryObjective(GDI, "destroy-nod-force") KillGDI = AddPrimaryObjective(Nod, "") RepairAssets = AddSecondaryObjective(GDI, "repair-base-vehicles") Trigger.AfterDelay(DateTime.Seconds(5), function() CheckRepairGDIAssetsObjective() end) AirSupport = AddSecondaryObjective(GDI, "destroy-sams") Trigger.OnAllKilled(SamSites, function() GDI.MarkCompletedObjective(AirSupport) Actor.Create("airstrike.proxy", true, { Owner = GDI }) end) local InitialArrivingUnits = { Actor166 } Utils.Do(InitialArrivingUnits, function(unit) unit.Move(unit.Location + CVec.New(1, 1), 0) end) Trigger.AfterDelay(DateTime.Minutes(1), function() SendWaves(1, AutoAttackWaves) end) Trigger.AfterDelay(DateTime.Minutes(2), function() ProduceInfantry(handofnod) end) Trigger.AfterDelay(DateTime.Minutes(2), function() ProduceVehicle(nodairfield) end) end Tick = function() if DateTime.GameTime > DateTime.Seconds(5) then if GDI.HasNoRequiredUnits() then Nod.MarkCompletedObjective(KillGDI) end if Nod.HasNoRequiredUnits() then GDI.MarkCompletedObjective(SecureArea) end end end