From 15fff858be42b642fab88e750bce3368044944ec Mon Sep 17 00:00:00 2001
From: Alexander <84857900+4z0t@users.noreply.github.com>
Date: Tue, 1 Nov 2022 03:12:19 +0300
Subject: [PATCH] Fix and cleanup OtherArmyUnitCountBuildConditions.lua (#4310)

---
 .../OtherArmyUnitCountBuildConditions.lua     | 159 +++++++++---------
 1 file changed, 79 insertions(+), 80 deletions(-)

diff --git a/lua/editor/OtherArmyUnitCountBuildConditions.lua b/lua/editor/OtherArmyUnitCountBuildConditions.lua
index 77d5b9a2a1..eb3b9d0b7b 100644
--- a/lua/editor/OtherArmyUnitCountBuildConditions.lua
+++ b/lua/editor/OtherArmyUnitCountBuildConditions.lua
@@ -9,128 +9,127 @@
 --**  Copyright © 2005 Gas Powered Games, Inc.  All rights reserved.
 --****************************************************************************
 
+---@alias CompareType
+---| ">="
+---| "<="
+---| "=="
+---| '>'
+---| '<'
+
+
 ---@param aiBrain AIBrain
----@param targetBrain string
----@param numReq integer
+---@param targetBrains string[]
+---@param numReq number
 ---@param category EntityCategory
+---@param compareType CompareType? defaults to `">="`
 ---@return boolean
-function BrainGreaterThanNumCategory( aiBrain, targetBrain, numReq, category )
-    local testBrain = ArmyBrains[1]
-    for k,v in ArmyBrains do
-        if v.Name == targetBrain then
-            testBrain = v
-            break
+function BrainsCompareNumCategory(aiBrain, targetBrains, numReq, category, compareType)
+    local num = 0
+    local targetBrainSet = {}
+    local armySetup = ScenarioInfo.ArmySetup
+    for _, brain in targetBrains do
+        if brain == 'HumanPlayers' then
+            local tblArmy = ListArmies()
+            for _, strArmy in ipairs(tblArmy) do
+                if armySetup[strArmy].Human then
+                    targetBrainSet[armySetup[strArmy].ArmyName] = true
+                end
+            end
+        else
+            targetBrainSet[brain] = true
         end
     end
-    local numUnits = testBrain:GetCurrentUnits(category)
-    if numUnits > numReq then
-        return true
+
+    for _, testBrain in ipairs(ArmyBrains) do
+        if targetBrainSet[testBrain.Name] then
+            num = num + testBrain:GetCurrentUnits(category)
+        end
+    end
+
+    if not compareType or compareType == '>=' then
+        return num >= numReq
+    elseif compareType == '==' then
+        return num == numReq
+    elseif compareType == '<=' then
+        return num <= numReq
+    elseif compareType == '>' then
+        return num > numReq
+    elseif compareType == '<' then
+        return num < numReq
     else
         return false
     end
 end
 
 ---@param aiBrain AIBrain
----@param targetBrain string
+---@param targetBrain string[]
 ---@param numReq integer
 ---@param category EntityCategory
 ---@return boolean
-function BrainLessThanNumCategory( aiBrain, targetBrain, numReq, category )
-    local testBrain = ArmyBrains[1]
-    for k,v in ArmyBrains do
-        if v.Name == targetBrain then
-            testBrain = v
-            break
-        end
-    end
-    local numUnits = testBrain:GetCurrentUnits(category)
-    if numUnits < numReq then
-        return true
-    else
-        return false
-    end
+function BrainGreaterThanNumCategory(aiBrain, targetBrain, numReq, category)
+    return BrainsCompareNumCategory(aiBrain, targetBrain, numReq, category, ">")
 end
 
 ---@param aiBrain AIBrain
----@param targetBrain string
+---@param targetBrain string[]
 ---@param numReq integer
 ---@param category EntityCategory
 ---@return boolean
-function BrainGreaterThanOrEqualNumCategory( aiBrain, targetBrain, numReq, category )
-    local testBrain = ArmyBrains[1]
-    for k,v in ArmyBrains do
-        if v.Name == targetBrain then
-            testBrain = v
-            break
-        end
-    end
-    local numUnits = testBrain:GetCurrentUnits(category)
-    if numUnits >= numReq then
-        return true
-    else
-        return false
-    end
+function BrainLessThanNumCategory(aiBrain, targetBrain, numReq, category)
+    return BrainsCompareNumCategory(aiBrain, targetBrain, numReq, category, "<")
 end
 
 ---@param aiBrain AIBrain
----@param targetBrain string
+---@param targetBrain string[]
 ---@param numReq integer
 ---@param category EntityCategory
 ---@return boolean
-function BrainLessThanOrEqualNumCategory( aiBrain, targetBrain, numReq, category )
-    local testBrain = ArmyBrains[1]
-    for k,v in ArmyBrains do
-        if v.Name == targetBrain then
-            testBrain = v
-            break
-        end
-    end
-    local numUnits = testBrain:GetCurrentUnits(category)
-    if numUnits <= numReq then
-        return true
-    else
-        return false
-    end
+function BrainGreaterThanOrEqualNumCategory(aiBrain, targetBrain, numReq, category)
+    return BrainsCompareNumCategory(aiBrain, targetBrain, numReq, category, ">=")
+end
+
+---@param aiBrain AIBrain
+---@param targetBrain string[]
+---@param numReq integer
+---@param category EntityCategory
+---@return boolean
+function BrainLessThanOrEqualNumCategory(aiBrain, targetBrain, numReq, category)
+    return BrainsCompareNumCategory(aiBrain, targetBrain, numReq, category, "<=")
 end
 
 ---@param aiBrain AIBrain
 ---@param numReq integer
 ---@param categories EntityCategory
----@param compareType string
+---@param compareType CompareType? defaults to `">="`
 ---@return boolean
-function FocusBrainBeingBuiltOrActiveCategoryCompare( aiBrain, numReq, categories, compareType )
-    local testBrain = ArmyBrains[GetFocusArmy()]
+function FocusBrainBeingBuiltOrActiveCategoryCompare(aiBrain, numReq, categories, compareType)
     local num = 0
-    for k,v in categories do
-        num = num + testBrain:GetBlueprintStat('Units_BeingBuilt', v)
-        num = num + testBrain:GetBlueprintStat('Units_Active', v)
+    local tblArmy = ListArmies()
+    for iArmy, strArmy in pairs(tblArmy) do
+        if ScenarioInfo.ArmySetup[strArmy].Human then
+            local testBrain = GetArmyBrain(strArmy)
+            for k, v in categories do
+                num = num + testBrain:GetBlueprintStat('Units_BeingBuilt', v)
+                num = num + testBrain:GetBlueprintStat('Units_Active', v)
+            end
+        end
     end
-
     if not compareType or compareType == '>=' then
-        if num >= numReq then
-            return true
-        end
+        return num >= numReq
     elseif compareType == '==' then
-        if num == numReq then
-            return true
-        end
+        return num == numReq
     elseif compareType == '<=' then
-        if num <= numReq then
-            return true
-        end
+        return num <= numReq
     elseif compareType == '>' then
-        if num > numReq then
-            return true
-        end
+        return num > numReq
     elseif compareType == '<' then
-        if num < numReq then
-            return true
-        end
+        return num < numReq
+    else
+        return false
     end
-    return false
 end
 
 -- Moved unsed Imports to bottom for mod compatibilty
 local AIUtils = import('/lua/ai/aiutilities.lua')
 local ScenarioFramework = import('/lua/scenarioframework.lua')
-local ScenarioUtils = import('/lua/sim/ScenarioUtilities.lua')
\ No newline at end of file
+local ScenarioUtils = import('/lua/sim/scenarioutilities.lua')