NodUnits = { "bggy", "e1", "e1", "e1", "e1", "e1", "bggy", "e1", "e1", "e1", "bggy" } NodBaseBuildings = { "hand", "fact", "nuke" } DfndActorTriggerActivator = { Refinery, Barracks, Powerplant, Yard } Atk3ActorTriggerActivator = { Guard1, Guard2, Guard3, Guard4, Guard5, Guard6, Guard7 } Atk1CellTriggerActivator = { CPos.New(45,37), CPos.New(44,37), CPos.New(45,36), CPos.New(44,36), CPos.New(45,35), CPos.New(44,35), CPos.New(45,34), CPos.New(44,34) } Atk4CellTriggerActivator = { CPos.New(50,47), CPos.New(49,47), CPos.New(48,47), CPos.New(47,47), CPos.New(46,47), CPos.New(45,47), CPos.New(44,47), CPos.New(43,47), CPos.New(42,47), CPos.New(41,47), CPos.New(40,47), CPos.New(39,47), CPos.New(38,47), CPos.New(37,47), CPos.New(50,46), CPos.New(49,46), CPos.New(48,46), CPos.New(47,46), CPos.New(46,46), CPos.New(45,46), CPos.New(44,46), CPos.New(43,46), CPos.New(42,46), CPos.New(41,46), CPos.New(40,46), CPos.New(39,46), CPos.New(38,46) } Atk2TriggerFunctionTime = DateTime.Seconds(40) Atk5TriggerFunctionTime = DateTime.Minutes(1) + DateTime.Seconds(15) Atk6TriggerFunctionTime = DateTime.Minutes(1) + DateTime.Seconds(20) Atk7TriggerFunctionTime = DateTime.Seconds(50) Pat1TriggerFunctionTime = DateTime.Seconds(30) Atk1Waypoints = { waypoint2, waypoint4, waypoint5, waypoint6 } Atk2Waypoints = { waypoint2, waypoint5, waypoint7, waypoint6 } Atk3Waypoints = { waypoint2, waypoint4, waypoint5, waypoint9 } Atk4Waypoints = { waypoint0, waypoint8, waypoint9 } Pat1Waypoints = { waypoint0, waypoint1, waypoint2, waypoint3 } UnitToRebuild = 'e1' GDIStartUnits = 0 getActors = function(owner, units) local maxUnits = 0 local actors = { } for type, count in pairs(units) do local globalActors = Map.ActorsInBox(Map.TopLeft, Map.BottomRight, function(actor) return actor.Owner == owner and actor.Type == type and not actor.IsDead end) if #globalActors < count then maxUnits = #globalActors else maxUnits = count end for i = 1, maxUnits, 1 do actors[#actors + 1] = globalActors[i] end end return actors end InsertNodUnits = function() Media.PlaySpeechNotification(player, "Reinforce") Reinforcements.Reinforce(player, NodUnits, { UnitsEntry.Location, UnitsRally.Location }, 15) Reinforcements.Reinforce(player, { "mcv" }, { McvEntry.Location, McvRally.Location }) end OnAnyDamaged = function(actors, func) Utils.Do(actors, function(actor) Trigger.OnDamaged(actor, func) end) end CheckForBase = function(player) local buildings = 0 Utils.Do(NodBaseBuildings, function(name) if #player.GetActorsByType(name) > 0 then buildings = buildings + 1 end end) return buildings == #NodBaseBuildings end DfndTriggerFunction = function() local list = enemy.GetGroundAttackers() Utils.Do(list, function(unit) IdleHunt(unit) end) end Atk2TriggerFunction = function() local MyActors = getActors(enemy, { ['e1'] = 3 }) Utils.Do(MyActors, function(actor) Atk2Movement(actor) end) end Atk3TriggerFunction = function() if not Atk3TriggerSwitch then Atk3TriggerSwitch = true MyActors = getActors(enemy, { ['e1'] = 4 }) Utils.Do(MyActors, function(actor) Atk3Movement(actor) end) end end Atk5TriggerFunction = function() local MyActors = getActors(enemy, { ['e1'] = 3 }) Utils.Do(MyActors, function(actor) Atk2Movement(actor) end) end Atk6TriggerFunction = function() local MyActors = getActors(enemy, { ['e1'] = 4 }) Utils.Do(MyActors, function(actor) Atk3Movement(actor) end) end Atk7TriggerFunction = function() local MyActors = getActors(enemy, { ['e1'] = 3 }) Utils.Do(MyActors, function(actor) Atk4Movement(actor) end) end Pat1TriggerFunction = function() local MyActors = getActors(enemy, { ['e1'] = 3 }) Utils.Do(MyActors, function(actor) Pat1Movement(actor) end) end Atk1Movement = function(unit) Utils.Do(Atk1Waypoints, function(waypoint) unit.AttackMove(waypoint.Location) end) IdleHunt(unit) end Atk2Movement = function(unit) Utils.Do(Atk2Waypoints, function(waypoint) unit.AttackMove(waypoint.Location) end) IdleHunt(unit) end Atk3Movement = function(unit) Utils.Do(Atk3Waypoints, function(waypoint) unit.AttackMove(waypoint.Location) end) IdleHunt(unit) end Atk4Movement = function(unit) Utils.Do(Atk4Waypoints, function(waypoint) unit.AttackMove(waypoint.Location) end) IdleHunt(unit) end Pat1Movement = function(unit) Utils.Do(Pat1Waypoints, function(waypoint) unit.Move(waypoint.Location) end) IdleHunt(unit) end WorldLoaded = function() player = Player.GetPlayer("Nod") enemy = Player.GetPlayer("GDI") 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) NodObjective1 = player.AddPrimaryObjective("Build a base.") NodObjective2 = player.AddPrimaryObjective("Destroy the GDI base.") GDIObjective = enemy.AddPrimaryObjective("Kill all enemies.") OnAnyDamaged(Atk3ActorTriggerActivator, Atk3TriggerFunction) Trigger.OnAllRemovedFromWorld(DfndActorTriggerActivator, DfndTriggerFunction) Trigger.AfterDelay(Atk2TriggerFunctionTime, Atk2TriggerFunction) Trigger.AfterDelay(Atk5TriggerFunctionTime, Atk5TriggerFunction) Trigger.AfterDelay(Atk6TriggerFunctionTime, Atk6TriggerFunction) Trigger.AfterDelay(Atk7TriggerFunctionTime, Atk7TriggerFunction) Trigger.AfterDelay(Pat1TriggerFunctionTime, Pat1TriggerFunction) Trigger.OnEnteredFootprint(Atk1CellTriggerActivator, function(a, id) if a.Owner == player then MyActors = getActors(enemy, { ['e1'] = 5 }) Utils.Do(MyActors, function(actor) Atk1Movement(actor) end) Trigger.RemoveFootprintTrigger(id) end end) Trigger.OnEnteredFootprint(Atk4CellTriggerActivator, function(a, id) if a.Owner == player then MyActors = getActors(enemy, { ['e1'] = 3 } ) Utils.Do(MyActors, function(actor) Atk2Movement(actor) end) Trigger.RemoveFootprintTrigger(id) end end) Trigger.AfterDelay(0, getStartUnits) InsertNodUnits() end Tick = function() if enemy.HasNoRequiredUnits() then player.MarkCompletedObjective(NodObjective2) end if player.HasNoRequiredUnits() then if DateTime.GameTime > 2 then enemy.MarkCompletedObjective(GDIObjective) end end if DateTime.GameTime % DateTime.Seconds(1) == 0 and not player.IsObjectiveCompleted(NodObjective1) and CheckForBase(player) then player.MarkCompletedObjective(NodObjective1) end if DateTime.GameTime % DateTime.Seconds(3) == 0 and Barracks.IsInWorld and Barracks.Owner == enemy then checkProduction(enemy) end end checkProduction = function(player) local Units = Map.ActorsInBox(Map.TopLeft, Map.BottomRight, function(actor) return actor.Owner == player and actor.Type == UnitToRebuild end) if #Units < GDIStartUnits then local unitsToProduce = GDIStartUnits - #Units if Barracks.IsInWorld and unitsToProduce > 0 then local UnitsType = { } for i = 1, unitsToProduce, 1 do UnitsType[i] = UnitToRebuild end Barracks.Build(UnitsType) end end end getStartUnits = function() local Units = Map.ActorsInBox(Map.TopLeft, Map.BottomRight, function(actor) return actor.Owner == enemy end) Utils.Do(Units, function(unit) if unit.Type == UnitToRebuild then GDIStartUnits = GDIStartUnits + 1 end end) end IdleHunt = function(unit) if not unit.IsDead then Trigger.OnIdle(unit, unit.Hunt) end end