From 6907929cb423b0d3dffbe7ae77b77d9b53c02efe Mon Sep 17 00:00:00 2001 From: abcdefg30 Date: Tue, 27 Jun 2017 17:57:29 +0200 Subject: [PATCH] Fix the harvest protection logic --- mods/d2k/bits/scripts/campaign-global.lua | 17 +++++++++++++++-- mods/d2k/maps/atreides-03a/atreides03a-AI.lua | 2 +- mods/d2k/maps/atreides-03a/atreides03a.lua | 4 ++-- mods/d2k/maps/atreides-03b/atreides03b-AI.lua | 2 +- mods/d2k/maps/atreides-03b/atreides03b.lua | 4 ++-- mods/d2k/maps/atreides-04/atreides04-AI.lua | 2 +- mods/d2k/maps/atreides-04/atreides04.lua | 4 ++-- mods/d2k/maps/atreides-05/atreides05-AI.lua | 2 +- mods/d2k/maps/atreides-05/atreides05.lua | 4 ++-- mods/d2k/maps/harkonnen-03a/harkonnen03a-AI.lua | 2 +- mods/d2k/maps/harkonnen-03a/harkonnen03a.lua | 4 ++-- mods/d2k/maps/harkonnen-03b/harkonnen03b-AI.lua | 2 +- mods/d2k/maps/harkonnen-03b/harkonnen03b.lua | 4 ++-- mods/d2k/maps/harkonnen-04/harkonnen04.lua | 4 ++-- mods/d2k/maps/ordos-03a/ordos03a-AI.lua | 2 +- mods/d2k/maps/ordos-03a/ordos03a.lua | 4 ++-- mods/d2k/maps/ordos-03b/ordos03b-AI.lua | 2 +- mods/d2k/maps/ordos-03b/ordos03b.lua | 4 ++-- mods/d2k/maps/ordos-04/ordos04-AI.lua | 2 +- mods/d2k/maps/ordos-04/ordos04.lua | 4 ++-- 20 files changed, 44 insertions(+), 31 deletions(-) diff --git a/mods/d2k/bits/scripts/campaign-global.lua b/mods/d2k/bits/scripts/campaign-global.lua index 16f1bdde8f..4ad46fc046 100644 --- a/mods/d2k/bits/scripts/campaign-global.lua +++ b/mods/d2k/bits/scripts/campaign-global.lua @@ -83,7 +83,7 @@ end IdlingUnits = { } Attacking = { } HoldProduction = { } -HarvesterKilled = { } +LastHarvesterEaten = { } SetupAttackGroup = function(owner, size) local units = { } @@ -153,7 +153,20 @@ end ProtectHarvester = function(unit, owner, defenderCount) DefendActor(unit, owner, defenderCount) - Trigger.OnKilled(unit, function() HarvesterKilled[unit.Owner] = true end) + + -- Worms don't kill the actor, but dispose it instead. + -- If a worm kills the last harvester (hence we check for remaining ones), + -- a new harvester is delivered by the harvester insurance. + -- Otherwise, there's no need to check for new harvesters. + local killed = false + Trigger.OnKilled(unit, function() + killed = true + end) + Trigger.OnRemovedFromWorld(unit, function() + if not killed and #unit.Owner.GetActorsByType("harvester") == 0 then + LastHarvesterEaten[owner] = true + end + end) end RepairBuilding = function(owner, actor, modifier) diff --git a/mods/d2k/maps/atreides-03a/atreides03a-AI.lua b/mods/d2k/maps/atreides-03a/atreides03a-AI.lua index 20ce90a9e2..3c60a3e0fa 100644 --- a/mods/d2k/maps/atreides-03a/atreides03a-AI.lua +++ b/mods/d2k/maps/atreides-03a/atreides03a-AI.lua @@ -33,7 +33,7 @@ InitAIUnits = function() end ActivateAI = function() - HarvesterKilled[ordos] = true + LastHarvesterEaten[ordos] = true Trigger.AfterDelay(0, InitAIUnits) OConyard.Produce(AtreidesUpgrades[1]) diff --git a/mods/d2k/maps/atreides-03a/atreides03a.lua b/mods/d2k/maps/atreides-03a/atreides03a.lua index 750de28126..fae7ff5b51 100644 --- a/mods/d2k/maps/atreides-03a/atreides03a.lua +++ b/mods/d2k/maps/atreides-03a/atreides03a.lua @@ -91,11 +91,11 @@ Tick = function() player.MarkCompletedObjective(KillOrdos) end - if DateTime.GameTime % DateTime.Seconds(30) and HarvesterKilled[ordos] then + if DateTime.GameTime % DateTime.Seconds(30) and LastHarvesterEaten[ordos] then local units = ordos.GetActorsByType("harvester") if #units > 0 then - HarvesterKilled[ordos] = false + LastHarvesterEaten[ordos] = false ProtectHarvester(units[1], ordos, AttackGroupSize[Difficulty]) end end diff --git a/mods/d2k/maps/atreides-03b/atreides03b-AI.lua b/mods/d2k/maps/atreides-03b/atreides03b-AI.lua index 631bc2ef48..bdfb334b7c 100644 --- a/mods/d2k/maps/atreides-03b/atreides03b-AI.lua +++ b/mods/d2k/maps/atreides-03b/atreides03b-AI.lua @@ -29,7 +29,7 @@ InitAIUnits = function() end ActivateAI = function() - HarvesterKilled[ordos] = true + LastHarvesterEaten[ordos] = true Trigger.AfterDelay(0, InitAIUnits) OConyard.Produce(AtreidesUpgrades[1]) diff --git a/mods/d2k/maps/atreides-03b/atreides03b.lua b/mods/d2k/maps/atreides-03b/atreides03b.lua index 56b4f710db..1f349f4833 100644 --- a/mods/d2k/maps/atreides-03b/atreides03b.lua +++ b/mods/d2k/maps/atreides-03b/atreides03b.lua @@ -91,11 +91,11 @@ Tick = function() player.MarkCompletedObjective(KillOrdos) end - if DateTime.GameTime % DateTime.Seconds(30) and HarvesterKilled[ordos] then + if DateTime.GameTime % DateTime.Seconds(30) and LastHarvesterEaten[ordos] then local units = ordos.GetActorsByType("harvester") if #units > 0 then - HarvesterKilled[ordos] = false + LastHarvesterEaten[ordos] = false ProtectHarvester(units[1], ordos, AttackGroupSize[Difficulty]) end end diff --git a/mods/d2k/maps/atreides-04/atreides04-AI.lua b/mods/d2k/maps/atreides-04/atreides04-AI.lua index 818541ed0c..34d7a1fcc7 100644 --- a/mods/d2k/maps/atreides-04/atreides04-AI.lua +++ b/mods/d2k/maps/atreides-04/atreides04-AI.lua @@ -52,7 +52,7 @@ InitAIUnits = function() end ActivateAI = function() - HarvesterKilled[harkonnen] = true + LastHarvesterEaten[harkonnen] = true InitAIUnits() FremenProduction() diff --git a/mods/d2k/maps/atreides-04/atreides04.lua b/mods/d2k/maps/atreides-04/atreides04.lua index 6c8e3f91b5..ea259b1e15 100644 --- a/mods/d2k/maps/atreides-04/atreides04.lua +++ b/mods/d2k/maps/atreides-04/atreides04.lua @@ -114,11 +114,11 @@ Tick = function() player.MarkCompletedObjective(KeepIntegrity) end - if DateTime.GameTime % DateTime.Seconds(30) and HarvesterKilled[harkonnen] then + if DateTime.GameTime % DateTime.Seconds(30) and LastHarvesterEaten[harkonnen] then local units = harkonnen.GetActorsByType("harvester") if #units > 0 then - HarvesterKilled[harkonnen] = false + LastHarvesterEaten[harkonnen] = false ProtectHarvester(units[1], harkonnen, AttackGroupSize[Difficulty]) end end diff --git a/mods/d2k/maps/atreides-05/atreides05-AI.lua b/mods/d2k/maps/atreides-05/atreides05-AI.lua index 71418ee0b0..e51fead68d 100644 --- a/mods/d2k/maps/atreides-05/atreides05-AI.lua +++ b/mods/d2k/maps/atreides-05/atreides05-AI.lua @@ -63,7 +63,7 @@ end ActivateAI = function() harkonnen.Cash = 15000 - HarvesterKilled[harkonnen] = true + LastHarvesterEaten[harkonnen] = true InitAIUnits() local delay = function() return Utils.RandomInteger(AttackDelays[Difficulty][1], AttackDelays[Difficulty][2] + 1) end diff --git a/mods/d2k/maps/atreides-05/atreides05.lua b/mods/d2k/maps/atreides-05/atreides05.lua index d5d4245211..c2a66d83d5 100644 --- a/mods/d2k/maps/atreides-05/atreides05.lua +++ b/mods/d2k/maps/atreides-05/atreides05.lua @@ -260,11 +260,11 @@ Tick = function() player.MarkCompletedObjective(KillSmuggler) end - if HarvesterKilled[harkonnen] and DateTime.GameTime % DateTime.Seconds(30) then + if LastHarvesterEaten[harkonnen] and DateTime.GameTime % DateTime.Seconds(30) then local units = harkonnen.GetActorsByType("harvester") if #units > 0 then - HarvesterKilled[harkonnen] = false + LastHarvesterEaten[harkonnen] = false ProtectHarvester(units[1], harkonnen, AttackGroupSize[Difficulty]) end end diff --git a/mods/d2k/maps/harkonnen-03a/harkonnen03a-AI.lua b/mods/d2k/maps/harkonnen-03a/harkonnen03a-AI.lua index b79fd8089b..17e612270b 100644 --- a/mods/d2k/maps/harkonnen-03a/harkonnen03a-AI.lua +++ b/mods/d2k/maps/harkonnen-03a/harkonnen03a-AI.lua @@ -26,7 +26,7 @@ AtreidesVehicleTypes = { "trike", "trike", "quad" } ActivateAI = function() IdlingUnits[atreides] = { } - HarvesterKilled[atreides] = true + LastHarvesterEaten[atreides] = true DefendAndRepairBase(atreides, AtreidesBase, 0.75, AttackGroupSize[Difficulty]) AConyard.Produce(HarkonnenUpgrades[1]) diff --git a/mods/d2k/maps/harkonnen-03a/harkonnen03a.lua b/mods/d2k/maps/harkonnen-03a/harkonnen03a.lua index 6154063d7d..fbc922bacc 100644 --- a/mods/d2k/maps/harkonnen-03a/harkonnen03a.lua +++ b/mods/d2k/maps/harkonnen-03a/harkonnen03a.lua @@ -107,11 +107,11 @@ Tick = function() player.MarkCompletedObjective(KillAtreides) end - if DateTime.GameTime % DateTime.Seconds(30) and HarvesterKilled[atreides] then + if DateTime.GameTime % DateTime.Seconds(30) and LastHarvesterEaten[atreides] then local units = atreides.GetActorsByType("harvester") if #units > 0 then - HarvesterKilled[atreides] = false + LastHarvesterEaten[atreides] = false ProtectHarvester(units[1], atreides, AttackGroupSize[Difficulty]) end end diff --git a/mods/d2k/maps/harkonnen-03b/harkonnen03b-AI.lua b/mods/d2k/maps/harkonnen-03b/harkonnen03b-AI.lua index 5cf7d247e0..b58ee1a17c 100644 --- a/mods/d2k/maps/harkonnen-03b/harkonnen03b-AI.lua +++ b/mods/d2k/maps/harkonnen-03b/harkonnen03b-AI.lua @@ -31,7 +31,7 @@ InitAIUnits = function() end ActivateAI = function() - HarvesterKilled[atreides] = true + LastHarvesterEaten[atreides] = true Trigger.AfterDelay(0, InitAIUnits) AConyard.Produce(HarkonnenUpgrades[1]) diff --git a/mods/d2k/maps/harkonnen-03b/harkonnen03b.lua b/mods/d2k/maps/harkonnen-03b/harkonnen03b.lua index 4b51896ef8..bd98462233 100644 --- a/mods/d2k/maps/harkonnen-03b/harkonnen03b.lua +++ b/mods/d2k/maps/harkonnen-03b/harkonnen03b.lua @@ -109,11 +109,11 @@ Tick = function() player.MarkCompletedObjective(KillAtreides) end - if DateTime.GameTime % DateTime.Seconds(30) and HarvesterKilled[atreides] then + if DateTime.GameTime % DateTime.Seconds(30) and LastHarvesterEaten[atreides] then local units = atreides.GetActorsByType("harvester") if #units > 0 then - HarvesterKilled[atreides] = false + LastHarvesterEaten[atreides] = false ProtectHarvester(units[1], atreides, AttackGroupSize[Difficulty]) end end diff --git a/mods/d2k/maps/harkonnen-04/harkonnen04.lua b/mods/d2k/maps/harkonnen-04/harkonnen04.lua index 7cd0c300f1..a99149ce64 100644 --- a/mods/d2k/maps/harkonnen-04/harkonnen04.lua +++ b/mods/d2k/maps/harkonnen-04/harkonnen04.lua @@ -142,11 +142,11 @@ Tick = function() player.MarkCompletedObjective(KillFremen) end - if DateTime.GameTime % DateTime.Seconds(30) and HarvesterKilled[atreides] then + if DateTime.GameTime % DateTime.Seconds(30) and LastHarvesterEaten[atreides] then local units = atreides.GetActorsByType("harvester") if #units > 0 then - HarvesterKilled[atreides] = false + LastHarvesterEaten[atreides] = false ProtectHarvester(units[1], atreides, AttackGroupSize[Difficulty]) end end diff --git a/mods/d2k/maps/ordos-03a/ordos03a-AI.lua b/mods/d2k/maps/ordos-03a/ordos03a-AI.lua index d1a5204fac..b3fcfb3af7 100644 --- a/mods/d2k/maps/ordos-03a/ordos03a-AI.lua +++ b/mods/d2k/maps/ordos-03a/ordos03a-AI.lua @@ -31,7 +31,7 @@ InitAIUnits = function() end ActivateAI = function() - HarvesterKilled[harkonnen] = true + LastHarvesterEaten[harkonnen] = true Trigger.AfterDelay(0, InitAIUnits) HConyard.Produce(OrdosUpgrades[1]) diff --git a/mods/d2k/maps/ordos-03a/ordos03a.lua b/mods/d2k/maps/ordos-03a/ordos03a.lua index 97d714cf97..da006aea21 100644 --- a/mods/d2k/maps/ordos-03a/ordos03a.lua +++ b/mods/d2k/maps/ordos-03a/ordos03a.lua @@ -90,11 +90,11 @@ Tick = function() player.MarkCompletedObjective(KillHarkonnen) end - if DateTime.GameTime % DateTime.Seconds(30) and HarvesterKilled[harkonnen] then + if DateTime.GameTime % DateTime.Seconds(30) and LastHarvesterEaten[harkonnen] then local units = harkonnen.GetActorsByType("harvester") if #units > 0 then - HarvesterKilled[harkonnen] = false + LastHarvesterEaten[harkonnen] = false ProtectHarvester(units[1], harkonnen, AttackGroupSize[Difficulty]) end end diff --git a/mods/d2k/maps/ordos-03b/ordos03b-AI.lua b/mods/d2k/maps/ordos-03b/ordos03b-AI.lua index d1a5204fac..b3fcfb3af7 100644 --- a/mods/d2k/maps/ordos-03b/ordos03b-AI.lua +++ b/mods/d2k/maps/ordos-03b/ordos03b-AI.lua @@ -31,7 +31,7 @@ InitAIUnits = function() end ActivateAI = function() - HarvesterKilled[harkonnen] = true + LastHarvesterEaten[harkonnen] = true Trigger.AfterDelay(0, InitAIUnits) HConyard.Produce(OrdosUpgrades[1]) diff --git a/mods/d2k/maps/ordos-03b/ordos03b.lua b/mods/d2k/maps/ordos-03b/ordos03b.lua index a4db82cab2..05e0855ff9 100644 --- a/mods/d2k/maps/ordos-03b/ordos03b.lua +++ b/mods/d2k/maps/ordos-03b/ordos03b.lua @@ -127,11 +127,11 @@ Tick = function() player.MarkCompletedObjective(KillHarkonnen) end - if DateTime.GameTime % DateTime.Seconds(30) and HarvesterKilled[harkonnen] then + if DateTime.GameTime % DateTime.Seconds(30) and LastHarvesterEaten[harkonnen] then local units = harkonnen.GetActorsByType("harvester") if #units > 0 then - HarvesterKilled[harkonnen] = false + LastHarvesterEaten[harkonnen] = false ProtectHarvester(units[1], harkonnen, AttackGroupSize[Difficulty]) end end diff --git a/mods/d2k/maps/ordos-04/ordos04-AI.lua b/mods/d2k/maps/ordos-04/ordos04-AI.lua index 8177a8664a..8e5bd09436 100644 --- a/mods/d2k/maps/ordos-04/ordos04-AI.lua +++ b/mods/d2k/maps/ordos-04/ordos04-AI.lua @@ -30,7 +30,7 @@ SmugglerVehicleTypes = { "raider", "raider", "quad" } SmugglerTankType = { "combat_tank_o" } InitAIUnits = function(house) - HarvesterKilled[house] = true + LastHarvesterEaten[house] = true IdlingUnits[house] = Reinforcements.Reinforce(house, InitialReinforcements[house.Name], InitialReinforcementsPaths[house.Name]) DefendAndRepairBase(house, Base[house.Name], 0.75, AttackGroupSize[Difficulty]) diff --git a/mods/d2k/maps/ordos-04/ordos04.lua b/mods/d2k/maps/ordos-04/ordos04.lua index 5ccea527c6..eca9d45e93 100644 --- a/mods/d2k/maps/ordos-04/ordos04.lua +++ b/mods/d2k/maps/ordos-04/ordos04.lua @@ -71,11 +71,11 @@ Hunt = function(house) end CheckHarvester = function(house) - if DateTime.GameTime % DateTime.Seconds(30) and HarvesterKilled[house] then + if DateTime.GameTime % DateTime.Seconds(30) and LastHarvesterEaten[house] then local units = house.GetActorsByType("harvester") if #units > 0 then - HarvesterKilled[house] = false + LastHarvesterEaten[house] = false ProtectHarvester(units[1], house, AttackGroupSize[Difficulty]) end end