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