From dbcd4af5bd43cf422d79e61890a44b9d58dd1326 Mon Sep 17 00:00:00 2001 From: lL1l1 <82986251+lL1l1@users.noreply.github.com> Date: Mon, 16 Jun 2025 22:33:56 -0700 Subject: [PATCH 1/7] Implement `UpgradeOnlyCategory` for `FactoryBuild` orders --- lua/sim/Unit.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lua/sim/Unit.lua b/lua/sim/Unit.lua index 82ac42a4ebe..d29d1a60d35 100644 --- a/lua/sim/Unit.lua +++ b/lua/sim/Unit.lua @@ -2844,11 +2844,11 @@ Unit = ClassUnit(moho.unit_methods, IntelComponent, VeterancyComponent, DebugUni return false -- Report failure of OnStartBuild end - -- If desired, prevent engineer stations from building their upgrades as a separate unit + -- If desired, prevent engineer stations and factories from building their upgrades as a separate unit -- We need a separate table for this just in case a unit is intended to be able to build its own upgrade as a separate unit too -- Its type is `UnparsedCategory[]` to make it behave identically to `Blueprint.Economy.BuildableCategory` local upgradeOnlyCategory = self.Blueprint.Economy.UpgradeOnlyCategory - if upgradeOnlyCategory and order == "MobileBuild" then + if upgradeOnlyCategory and (order == "MobileBuild" or order == "FactoryBuild") then for _, unparsedCat in upgradeOnlyCategory do if EntityCategoryContains(ParseEntityCategory(unparsedCat), built) then -- Destroying the built unit will clear the command too, so we don't need to clear the entire queue (in case this exploit was done on accident). From 325c6d8c1b9f10f20a088016c9d466c2bbea5f3c Mon Sep 17 00:00:00 2001 From: lL1l1 <82986251+lL1l1@users.noreply.github.com> Date: Tue, 17 Jun 2025 00:10:50 -0700 Subject: [PATCH 2/7] Annotate NotifyUpgrade --- engine/Sim.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/engine/Sim.lua b/engine/Sim.lua index db1d07e6ae4..19debc65b57 100644 --- a/engine/Sim.lua +++ b/engine/Sim.lua @@ -1045,6 +1045,11 @@ end function MetaImpact(instigator, location, maxRadius, amount, affectsCategory, damageFriendly) end +--- Handles command structure when a unit upgrades to another: +--- - Adds the new unit to the old unit's queued commands. +--- - Retargets assisters onto the new unit. +--- - Sets repeat queue. +--- - Sets missing health proportion of the new unit. ---@param from Unit ---@param to Unit function NotifyUpgrade(from, to) From 6dc2553386736e9413ad07f6c8f29236b3907806 Mon Sep 17 00:00:00 2001 From: lL1l1 <82986251+lL1l1@users.noreply.github.com> Date: Tue, 17 Jun 2025 00:11:22 -0700 Subject: [PATCH 3/7] Move `UpgradeOnlyCategory` code to `CheckBuildRestriction` --- lua/sim/Unit.lua | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/lua/sim/Unit.lua b/lua/sim/Unit.lua index d29d1a60d35..1fc530af970 100644 --- a/lua/sim/Unit.lua +++ b/lua/sim/Unit.lua @@ -2844,20 +2844,6 @@ Unit = ClassUnit(moho.unit_methods, IntelComponent, VeterancyComponent, DebugUni return false -- Report failure of OnStartBuild end - -- If desired, prevent engineer stations and factories from building their upgrades as a separate unit - -- We need a separate table for this just in case a unit is intended to be able to build its own upgrade as a separate unit too - -- Its type is `UnparsedCategory[]` to make it behave identically to `Blueprint.Economy.BuildableCategory` - local upgradeOnlyCategory = self.Blueprint.Economy.UpgradeOnlyCategory - if upgradeOnlyCategory and (order == "MobileBuild" or order == "FactoryBuild") then - for _, unparsedCat in upgradeOnlyCategory do - if EntityCategoryContains(ParseEntityCategory(unparsedCat), built) then - -- Destroying the built unit will clear the command too, so we don't need to clear the entire queue (in case this exploit was done on accident). - built:Destroy() - return false - end - end - end - -- We just started a construction (and haven't just been tasked to work on a half-done -- project.) if built:GetHealth() == 1 then @@ -4106,6 +4092,19 @@ Unit = ClassUnit(moho.unit_methods, IntelComponent, VeterancyComponent, DebugUni ---@return boolean CheckBuildRestriction = function(self, target_bp) if self:CanBuild(target_bp.BlueprintId) then + + -- If desired, prevent engineer stations and factories from building their upgrades as a separate unit + -- We need a separate table for this just in case a unit is intended to be able to build its own upgrade as a separate unit too + -- Its type is `UnparsedCategory[]` to make it behave identically to `Blueprint.Economy.BuildableCategory` + local upgradeOnlyCategory = self.Blueprint.Economy.UpgradeOnlyCategory + if upgradeOnlyCategory then + for _, unparsedCat in upgradeOnlyCategory do + if EntityCategoryContains(ParseEntityCategory(unparsedCat), target_bp.BlueprintId) then + return false + end + end + end + return true else return false From 6b0a0bf6a66e69d33c93d33768d8ab33cb8c2a46 Mon Sep 17 00:00:00 2001 From: lL1l1 <82986251+lL1l1@users.noreply.github.com> Date: Tue, 17 Jun 2025 00:11:40 -0700 Subject: [PATCH 4/7] Annotate `CheckBuildRestriction` --- lua/sim/Unit.lua | 1 + lua/sim/units/FactoryUnit.lua | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lua/sim/Unit.lua b/lua/sim/Unit.lua index 1fc530af970..c8743015f25 100644 --- a/lua/sim/Unit.lua +++ b/lua/sim/Unit.lua @@ -4087,6 +4087,7 @@ Unit = ClassUnit(moho.unit_methods, IntelComponent, VeterancyComponent, DebugUni return false end, + --- Called by the engine on `FactoryBuild` and `MobileBuild` orders to determine if a unit is allowed to be built. ---@param self Unit ---@param target_bp UnitBlueprint ---@return boolean diff --git a/lua/sim/units/FactoryUnit.lua b/lua/sim/units/FactoryUnit.lua index 074c118afb0..bc3358f91ea 100644 --- a/lua/sim/units/FactoryUnit.lua +++ b/lua/sim/units/FactoryUnit.lua @@ -289,7 +289,7 @@ FactoryUnit = ClassUnit(StructureUnit) { end, ---@param self FactoryUnit - ---@param target_bp any + ---@param target_bp UnitBlueprint ---@return boolean CheckBuildRestriction = function(self, target_bp) -- Check basic build restrictions first (Unit.CheckBuildRestriction but we only go up one inheritance level) From a1c9bea743e6c2a01e2e204c843d09314bf7f69c Mon Sep 17 00:00:00 2001 From: lL1l1 <82986251+lL1l1@users.noreply.github.com> Date: Tue, 17 Jun 2025 00:14:08 -0700 Subject: [PATCH 5/7] Remove FactoryUnit.CheckBuildRestriction 1. it didn't work 2. we will use UpgradeOnlyCategory --- lua/sim/units/FactoryUnit.lua | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/lua/sim/units/FactoryUnit.lua b/lua/sim/units/FactoryUnit.lua index bc3358f91ea..2a4146ce7a2 100644 --- a/lua/sim/units/FactoryUnit.lua +++ b/lua/sim/units/FactoryUnit.lua @@ -288,20 +288,6 @@ FactoryUnit = ClassUnit(StructureUnit) { end end, - ---@param self FactoryUnit - ---@param target_bp UnitBlueprint - ---@return boolean - CheckBuildRestriction = function(self, target_bp) - -- Check basic build restrictions first (Unit.CheckBuildRestriction but we only go up one inheritance level) - if not StructureUnitCheckBuildRestriction(self, target_bp) then - return false - end - -- Factories never build factories (this does not break Upgrades since CheckBuildRestriction is never called for Upgrades) - -- Note: We check for the primary category, since e.g. AircraftCarriers have the FACTORY category. - -- TODO: This is a hotfix for --1043, remove when engymod design is properly fixed - return target_bp.General.Category ~= 'Factory' - end, - ---@param self FactoryUnit CalculateRollOffPoint = function(self) local px, py, pz = self:GetPositionXYZ() From ba1e8da2db0f70a9071d7caf55981b97fa124fe7 Mon Sep 17 00:00:00 2001 From: lL1l1 <82986251+lL1l1@users.noreply.github.com> Date: Tue, 17 Jun 2025 01:18:02 -0700 Subject: [PATCH 6/7] Fix start build success not being passed in factory/structure unit classes --- lua/sim/units/FactoryUnit.lua | 5 ++++- lua/sim/units/StructureUnit.lua | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lua/sim/units/FactoryUnit.lua b/lua/sim/units/FactoryUnit.lua index 2a4146ce7a2..1f73de61fe2 100644 --- a/lua/sim/units/FactoryUnit.lua +++ b/lua/sim/units/FactoryUnit.lua @@ -107,8 +107,9 @@ FactoryUnit = ClassUnit(StructureUnit) { ---@param self FactoryUnit ---@param unitBeingBuilt Unit ---@param order string + ---@return boolean OnStartBuild = function(self, unitBeingBuilt, order) - StructureUnitOnStartBuild(self, unitBeingBuilt, order) + if not StructureUnitOnStartBuild(self, unitBeingBuilt, order) then return false end self.FactoryBuildFailed = nil self.BuildingUnit = true @@ -120,6 +121,8 @@ FactoryUnit = ClassUnit(StructureUnit) { self:RemoveCommandCap('RULEUCC_Guard') self.DisabledAssist = true end + + return true end, --- Introduce a rolloff delay, where defined. diff --git a/lua/sim/units/StructureUnit.lua b/lua/sim/units/StructureUnit.lua index 974d7f88cb8..9fea001b70b 100644 --- a/lua/sim/units/StructureUnit.lua +++ b/lua/sim/units/StructureUnit.lua @@ -590,10 +590,11 @@ StructureUnit = ClassUnit(Unit, BlinkingLightsUnitComponent) { ---@param self StructureUnit ---@param unitBeingBuilt Unit ---@param order string + ---@return boolean OnStartBuild = function(self, unitBeingBuilt, order) -- Check for death loop if not UnitOnStartBuild(self, unitBeingBuilt, order) then - return + return false end self.UnitBeingBuilt = unitBeingBuilt @@ -635,6 +636,8 @@ StructureUnit = ClassUnit(Unit, BlinkingLightsUnitComponent) { end end end + + return true end, ---@param self StructureUnit From 2493d1df717a74b461154903302f743c6ecd70d9 Mon Sep 17 00:00:00 2001 From: lL1l1 <82986251+lL1l1@users.noreply.github.com> Date: Tue, 17 Jun 2025 03:15:16 -0700 Subject: [PATCH 7/7] Add UpgradeOnlyCategory to all the factories Regex find: `((\s+)BuildableCategory\s*=\s*\{(?:\n.*)*?("BUILTBY.*STRUCTURE.*",)(?:\n.*)*?\2\},)` Regex replace: `$1$2UpgradeOnlyCategory = {$2\t$3$2},` 60 files replaced. There are 4 factions * 3 fac types * (2 support tiers + 3 HQ tiers) = 60 replacements expected. I don't know why T3 Factories have a T3 structure build possibility, but it's best to have it upgrade-only just in case imo. --- units/UAB0101/UAB0101_unit.bp | 3 +++ units/UAB0102/UAB0102_unit.bp | 3 +++ units/UAB0103/UAB0103_unit.bp | 3 +++ units/UAB0201/UAB0201_unit.bp | 3 +++ units/UAB0202/UAB0202_unit.bp | 3 +++ units/UAB0203/UAB0203_unit.bp | 3 +++ units/UAB0301/UAB0301_unit.bp | 3 +++ units/UAB0302/UAB0302_unit.bp | 3 +++ units/UAB0303/UAB0303_unit.bp | 3 +++ units/UEB0101/UEB0101_unit.bp | 3 +++ units/UEB0102/UEB0102_unit.bp | 3 +++ units/UEB0103/UEB0103_unit.bp | 3 +++ units/UEB0201/UEB0201_unit.bp | 3 +++ units/UEB0202/UEB0202_unit.bp | 3 +++ units/UEB0203/UEB0203_unit.bp | 3 +++ units/UEB0301/UEB0301_unit.bp | 3 +++ units/UEB0302/UEB0302_unit.bp | 3 +++ units/UEB0303/UEB0303_unit.bp | 3 +++ units/URB0101/URB0101_unit.bp | 3 +++ units/URB0102/URB0102_unit.bp | 3 +++ units/URB0103/URB0103_unit.bp | 3 +++ units/URB0201/URB0201_unit.bp | 3 +++ units/URB0202/URB0202_unit.bp | 3 +++ units/URB0203/URB0203_unit.bp | 3 +++ units/URB0301/URB0301_unit.bp | 3 +++ units/URB0302/URB0302_unit.bp | 3 +++ units/URB0303/URB0303_unit.bp | 3 +++ units/XSB0101/XSB0101_unit.bp | 3 +++ units/XSB0102/XSB0102_unit.bp | 3 +++ units/XSB0103/XSB0103_unit.bp | 3 +++ units/XSB0201/XSB0201_unit.bp | 3 +++ units/XSB0202/XSB0202_unit.bp | 3 +++ units/XSB0203/XSB0203_unit.bp | 3 +++ units/XSB0301/XSB0301_unit.bp | 3 +++ units/XSB0302/XSB0302_unit.bp | 3 +++ units/XSB0303/XSB0303_unit.bp | 3 +++ units/ZAB9501/ZAB9501_unit.bp | 3 +++ units/ZAB9502/ZAB9502_unit.bp | 3 +++ units/ZAB9503/ZAB9503_unit.bp | 3 +++ units/ZAB9601/ZAB9601_unit.bp | 3 +++ units/ZAB9602/ZAB9602_unit.bp | 3 +++ units/ZAB9603/ZAB9603_unit.bp | 3 +++ units/ZEB9501/ZEB9501_unit.bp | 3 +++ units/ZEB9502/ZEB9502_unit.bp | 3 +++ units/ZEB9503/ZEB9503_unit.bp | 3 +++ units/ZEB9601/ZEB9601_unit.bp | 3 +++ units/ZEB9602/ZEB9602_unit.bp | 3 +++ units/ZEB9603/ZEB9603_unit.bp | 3 +++ units/ZRB9501/ZRB9501_unit.bp | 3 +++ units/ZRB9502/ZRB9502_unit.bp | 3 +++ units/ZRB9503/ZRB9503_unit.bp | 3 +++ units/ZRB9601/ZRB9601_unit.bp | 3 +++ units/ZRB9602/ZRB9602_unit.bp | 3 +++ units/ZRB9603/ZRB9603_unit.bp | 3 +++ units/ZSB9501/ZSB9501_unit.bp | 3 +++ units/ZSB9502/ZSB9502_unit.bp | 3 +++ units/ZSB9503/ZSB9503_unit.bp | 3 +++ units/ZSB9601/ZSB9601_unit.bp | 3 +++ units/ZSB9602/ZSB9602_unit.bp | 3 +++ units/ZSB9603/ZSB9603_unit.bp | 3 +++ 60 files changed, 180 insertions(+) diff --git a/units/UAB0101/UAB0101_unit.bp b/units/UAB0101/UAB0101_unit.bp index 91c4d7206be..6eb74ac519f 100644 --- a/units/UAB0101/UAB0101_unit.bp +++ b/units/UAB0101/UAB0101_unit.bp @@ -105,6 +105,9 @@ UnitBlueprint{ "BUILTBYTIER1FACTORY AEON STRUCTURE LAND", "BUILTBYTIER1FACTORY AEON MOBILE LAND", }, + UpgradeOnlyCategory = { + "BUILTBYTIER1FACTORY AEON STRUCTURE LAND", + }, RebuildBonusIds = { "uab0101" }, StorageEnergy = 0, StorageMass = 80, diff --git a/units/UAB0102/UAB0102_unit.bp b/units/UAB0102/UAB0102_unit.bp index f85c775a9ff..8f60a70fd72 100644 --- a/units/UAB0102/UAB0102_unit.bp +++ b/units/UAB0102/UAB0102_unit.bp @@ -101,6 +101,9 @@ UnitBlueprint{ "BUILTBYTIER1FACTORY AEON MOBILE AIR", "TRANSPORTBUILTBYTIER1FACTORY AEON MOBILE AIR", }, + UpgradeOnlyCategory = { + "BUILTBYTIER1FACTORY AEON STRUCTURE AIR", + }, RebuildBonusIds = { "uab0102" }, StorageEnergy = 0, StorageMass = 80, diff --git a/units/UAB0103/UAB0103_unit.bp b/units/UAB0103/UAB0103_unit.bp index 824c5dedf52..3aa47f1ff25 100644 --- a/units/UAB0103/UAB0103_unit.bp +++ b/units/UAB0103/UAB0103_unit.bp @@ -91,6 +91,9 @@ UnitBlueprint{ "BUILTBYTIER1FACTORY AEON STRUCTURE NAVAL", "BUILTBYTIER1FACTORY AEON MOBILE NAVAL", }, + UpgradeOnlyCategory = { + "BUILTBYTIER1FACTORY AEON STRUCTURE NAVAL", + }, InitialRallyX = 0, InitialRallyZ = 10, RebuildBonusIds = { "uab0103" }, diff --git a/units/UAB0201/UAB0201_unit.bp b/units/UAB0201/UAB0201_unit.bp index 102af84cd46..81bc20b11d9 100644 --- a/units/UAB0201/UAB0201_unit.bp +++ b/units/UAB0201/UAB0201_unit.bp @@ -101,6 +101,9 @@ UnitBlueprint{ "BUILTBYTIER2FACTORY AEON STRUCTURE LAND", "BUILTBYTIER2FACTORY AEON MOBILE LAND", }, + UpgradeOnlyCategory = { + "BUILTBYTIER2FACTORY AEON STRUCTURE LAND", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "uab0201" }, StorageEnergy = 0, diff --git a/units/UAB0202/UAB0202_unit.bp b/units/UAB0202/UAB0202_unit.bp index 98772685419..02b599791cb 100644 --- a/units/UAB0202/UAB0202_unit.bp +++ b/units/UAB0202/UAB0202_unit.bp @@ -94,6 +94,9 @@ UnitBlueprint{ "BUILTBYTIER2FACTORY AEON MOBILE AIR", "TRANSPORTBUILTBYTIER2FACTORY AEON MOBILE AIR", }, + UpgradeOnlyCategory = { + "BUILTBYTIER2FACTORY AEON STRUCTURE AIR", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "uab0202" }, StorageEnergy = 0, diff --git a/units/UAB0203/UAB0203_unit.bp b/units/UAB0203/UAB0203_unit.bp index 0896e742af6..80d554ff965 100644 --- a/units/UAB0203/UAB0203_unit.bp +++ b/units/UAB0203/UAB0203_unit.bp @@ -91,6 +91,9 @@ UnitBlueprint{ "BUILTBYTIER2FACTORY AEON STRUCTURE NAVAL", "BUILTBYTIER2FACTORY AEON MOBILE NAVAL", }, + UpgradeOnlyCategory = { + "BUILTBYTIER2FACTORY AEON STRUCTURE NAVAL", + }, DifferentialUpgradeCostCalculation = true, InitialRallyX = 0, InitialRallyZ = 10, diff --git a/units/UAB0301/UAB0301_unit.bp b/units/UAB0301/UAB0301_unit.bp index c1d65f9a6e8..c5caf75ba41 100644 --- a/units/UAB0301/UAB0301_unit.bp +++ b/units/UAB0301/UAB0301_unit.bp @@ -100,6 +100,9 @@ UnitBlueprint{ "BUILTBYTIER3FACTORY AEON STRUCTURE LAND", "BUILTBYTIER3FACTORY AEON MOBILE LAND", }, + UpgradeOnlyCategory = { + "BUILTBYTIER3FACTORY AEON STRUCTURE LAND", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "uab0301" }, StorageEnergy = 0, diff --git a/units/UAB0302/UAB0302_unit.bp b/units/UAB0302/UAB0302_unit.bp index a22221be05d..f8c3b81d8e9 100644 --- a/units/UAB0302/UAB0302_unit.bp +++ b/units/UAB0302/UAB0302_unit.bp @@ -93,6 +93,9 @@ UnitBlueprint{ "BUILTBYTIER3FACTORY AEON MOBILE AIR", "TRANSPORTBUILTBYTIER3FACTORY AEON MOBILE AIR", }, + UpgradeOnlyCategory = { + "BUILTBYTIER3FACTORY AEON STRUCTURE AIR", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "uab0302" }, StorageEnergy = 0, diff --git a/units/UAB0303/UAB0303_unit.bp b/units/UAB0303/UAB0303_unit.bp index a73b9e236e7..62c1369576b 100644 --- a/units/UAB0303/UAB0303_unit.bp +++ b/units/UAB0303/UAB0303_unit.bp @@ -90,6 +90,9 @@ UnitBlueprint{ "BUILTBYTIER3FACTORY AEON STRUCTURE NAVAL", "BUILTBYTIER3FACTORY AEON MOBILE NAVAL", }, + UpgradeOnlyCategory = { + "BUILTBYTIER3FACTORY AEON STRUCTURE NAVAL", + }, DifferentialUpgradeCostCalculation = true, InitialRallyX = 0, InitialRallyZ = 10, diff --git a/units/UEB0101/UEB0101_unit.bp b/units/UEB0101/UEB0101_unit.bp index bc68ad4d74c..9a03f45c2d8 100644 --- a/units/UEB0101/UEB0101_unit.bp +++ b/units/UEB0101/UEB0101_unit.bp @@ -96,6 +96,9 @@ UnitBlueprint{ "BUILTBYTIER1FACTORY UEF STRUCTURE LAND", "BUILTBYTIER1FACTORY UEF MOBILE LAND", }, + UpgradeOnlyCategory = { + "BUILTBYTIER1FACTORY UEF STRUCTURE LAND", + }, RebuildBonusIds = { "ueb0101" }, StorageEnergy = 0, StorageMass = 80, diff --git a/units/UEB0102/UEB0102_unit.bp b/units/UEB0102/UEB0102_unit.bp index eac549525da..ec58620506f 100644 --- a/units/UEB0102/UEB0102_unit.bp +++ b/units/UEB0102/UEB0102_unit.bp @@ -97,6 +97,9 @@ UnitBlueprint{ "BUILTBYTIER1FACTORY UEF MOBILE AIR", "TRANSPORTBUILTBYTIER1FACTORY UEF MOBILE AIR", }, + UpgradeOnlyCategory = { + "BUILTBYTIER1FACTORY UEF STRUCTURE AIR", + }, RebuildBonusIds = { "ueb0102" }, StorageEnergy = 0, StorageMass = 80, diff --git a/units/UEB0103/UEB0103_unit.bp b/units/UEB0103/UEB0103_unit.bp index 27586c4ab22..fb6c5141cdb 100644 --- a/units/UEB0103/UEB0103_unit.bp +++ b/units/UEB0103/UEB0103_unit.bp @@ -96,6 +96,9 @@ UnitBlueprint{ "BUILTBYTIER1FACTORY UEF STRUCTURE NAVAL", "BUILTBYTIER1FACTORY UEF MOBILE NAVAL", }, + UpgradeOnlyCategory = { + "BUILTBYTIER1FACTORY UEF STRUCTURE NAVAL", + }, InitialRallyX = 0, InitialRallyZ = 10, RebuildBonusIds = { "ueb0103" }, diff --git a/units/UEB0201/UEB0201_unit.bp b/units/UEB0201/UEB0201_unit.bp index 653dc79b80c..e9b6ed63446 100644 --- a/units/UEB0201/UEB0201_unit.bp +++ b/units/UEB0201/UEB0201_unit.bp @@ -97,6 +97,9 @@ UnitBlueprint{ "BUILTBYTIER2FACTORY UEF MOBILE LAND", "BUILTBYLANDTIER2FACTORY UEF MOBILE CONSTRUCTION", }, + UpgradeOnlyCategory = { + "BUILTBYTIER2FACTORY UEF STRUCTURE LAND", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "ueb0201" }, StorageEnergy = 0, diff --git a/units/UEB0202/UEB0202_unit.bp b/units/UEB0202/UEB0202_unit.bp index 02a7570fbb9..d7b67241047 100644 --- a/units/UEB0202/UEB0202_unit.bp +++ b/units/UEB0202/UEB0202_unit.bp @@ -97,6 +97,9 @@ UnitBlueprint{ "TRANSPORTBUILTBYTIER2FACTORY UEF MOBILE AIR", "BUILTBYAIRTIER2FACTORY UEF MOBILE CONSTRUCTION", }, + UpgradeOnlyCategory = { + "BUILTBYTIER2FACTORY UEF STRUCTURE AIR", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "ueb0202" }, StorageEnergy = 0, diff --git a/units/UEB0203/UEB0203_unit.bp b/units/UEB0203/UEB0203_unit.bp index 381d89a4f32..914e03fee9b 100644 --- a/units/UEB0203/UEB0203_unit.bp +++ b/units/UEB0203/UEB0203_unit.bp @@ -96,6 +96,9 @@ UnitBlueprint{ "BUILTBYTIER2FACTORY UEF MOBILE NAVAL", "BUILTBYNAVALTIER2FACTORY UEF MOBILE CONSTRUCTION", }, + UpgradeOnlyCategory = { + "BUILTBYTIER2FACTORY UEF STRUCTURE NAVAL", + }, DifferentialUpgradeCostCalculation = true, InitialRallyX = 0, InitialRallyZ = 10, diff --git a/units/UEB0301/UEB0301_unit.bp b/units/UEB0301/UEB0301_unit.bp index b92b52517a7..1e62f59c72b 100644 --- a/units/UEB0301/UEB0301_unit.bp +++ b/units/UEB0301/UEB0301_unit.bp @@ -95,6 +95,9 @@ UnitBlueprint{ "BUILTBYTIER3FACTORY UEF MOBILE LAND", "BUILTBYLANDTIER3FACTORY UEF MOBILE CONSTRUCTION", }, + UpgradeOnlyCategory = { + "BUILTBYTIER3FACTORY UEF STRUCTURE LAND", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "ueb0301" }, StorageEnergy = 0, diff --git a/units/UEB0302/UEB0302_unit.bp b/units/UEB0302/UEB0302_unit.bp index 7b207fa2d51..f04b62e44c1 100644 --- a/units/UEB0302/UEB0302_unit.bp +++ b/units/UEB0302/UEB0302_unit.bp @@ -95,6 +95,9 @@ UnitBlueprint{ "TRANSPORTBUILTBYTIER3FACTORY UEF MOBILE AIR", "BUILTBYAIRTIER3FACTORY UEF MOBILE CONSTRUCTION", }, + UpgradeOnlyCategory = { + "BUILTBYTIER3FACTORY UEF STRUCTURE AIR", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "ueb0302" }, StorageEnergy = 0, diff --git a/units/UEB0303/UEB0303_unit.bp b/units/UEB0303/UEB0303_unit.bp index d795c62074b..1bc60c1e4cf 100644 --- a/units/UEB0303/UEB0303_unit.bp +++ b/units/UEB0303/UEB0303_unit.bp @@ -96,6 +96,9 @@ UnitBlueprint{ "BUILTBYTIER3FACTORY UEF MOBILE NAVAL", "BUILTBYNAVALTIER3FACTORY UEF MOBILE CONSTRUCTION", }, + UpgradeOnlyCategory = { + "BUILTBYTIER3FACTORY UEF STRUCTURE NAVAL", + }, DifferentialUpgradeCostCalculation = true, InitialRallyX = 0, InitialRallyZ = 10, diff --git a/units/URB0101/URB0101_unit.bp b/units/URB0101/URB0101_unit.bp index 137d5f12a14..b07ff264e2e 100644 --- a/units/URB0101/URB0101_unit.bp +++ b/units/URB0101/URB0101_unit.bp @@ -96,6 +96,9 @@ UnitBlueprint{ "BUILTBYTIER1FACTORY CYBRAN STRUCTURE LAND", "BUILTBYTIER1FACTORY CYBRAN MOBILE LAND", }, + UpgradeOnlyCategory = { + "BUILTBYTIER1FACTORY CYBRAN STRUCTURE LAND", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "urb0101" }, StorageEnergy = 0, diff --git a/units/URB0102/URB0102_unit.bp b/units/URB0102/URB0102_unit.bp index 7aa6d4960db..2faffe145a5 100644 --- a/units/URB0102/URB0102_unit.bp +++ b/units/URB0102/URB0102_unit.bp @@ -103,6 +103,9 @@ UnitBlueprint{ "BUILTBYTIER1FACTORY CYBRAN MOBILE AIR", "TRANSPORTBUILTBYTIER1FACTORY CYBRAN MOBILE AIR", }, + UpgradeOnlyCategory = { + "BUILTBYTIER1FACTORY CYBRAN STRUCTURE AIR", + }, RebuildBonusIds = { "urb0102" }, StorageEnergy = 0, StorageMass = 80, diff --git a/units/URB0103/URB0103_unit.bp b/units/URB0103/URB0103_unit.bp index 7966db7209f..a1bf2bd8403 100644 --- a/units/URB0103/URB0103_unit.bp +++ b/units/URB0103/URB0103_unit.bp @@ -101,6 +101,9 @@ UnitBlueprint{ "BUILTBYTIER1FACTORY CYBRAN STRUCTURE NAVAL", "BUILTBYTIER1FACTORY CYBRAN MOBILE NAVAL", }, + UpgradeOnlyCategory = { + "BUILTBYTIER1FACTORY CYBRAN STRUCTURE NAVAL", + }, InitialRallyX = 0, InitialRallyZ = 10, RebuildBonusIds = { "urb0103" }, diff --git a/units/URB0201/URB0201_unit.bp b/units/URB0201/URB0201_unit.bp index 3a2be9900c3..64df0ee7a4a 100644 --- a/units/URB0201/URB0201_unit.bp +++ b/units/URB0201/URB0201_unit.bp @@ -95,6 +95,9 @@ UnitBlueprint{ "BUILTBYTIER2FACTORY CYBRAN STRUCTURE LAND", "BUILTBYTIER2FACTORY CYBRAN MOBILE LAND", }, + UpgradeOnlyCategory = { + "BUILTBYTIER2FACTORY CYBRAN STRUCTURE LAND", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "urb0201" }, StorageEnergy = 0, diff --git a/units/URB0202/URB0202_unit.bp b/units/URB0202/URB0202_unit.bp index ac6067306bf..221fca45682 100644 --- a/units/URB0202/URB0202_unit.bp +++ b/units/URB0202/URB0202_unit.bp @@ -104,6 +104,9 @@ UnitBlueprint{ "BUILTBYTIER2FACTORY CYBRAN MOBILE AIR", "TRANSPORTBUILTBYTIER2FACTORY CYBRAN MOBILE AIR", }, + UpgradeOnlyCategory = { + "BUILTBYTIER2FACTORY CYBRAN STRUCTURE AIR", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "urb0202" }, StorageEnergy = 0, diff --git a/units/URB0203/URB0203_unit.bp b/units/URB0203/URB0203_unit.bp index cb2d6fc4030..b33c1cb904f 100644 --- a/units/URB0203/URB0203_unit.bp +++ b/units/URB0203/URB0203_unit.bp @@ -101,6 +101,9 @@ UnitBlueprint{ "BUILTBYTIER2FACTORY CYBRAN STRUCTURE NAVAL", "BUILTBYTIER2FACTORY CYBRAN MOBILE NAVAL", }, + UpgradeOnlyCategory = { + "BUILTBYTIER2FACTORY CYBRAN STRUCTURE NAVAL", + }, DifferentialUpgradeCostCalculation = true, InitialRallyX = 0, InitialRallyZ = 10, diff --git a/units/URB0301/URB0301_unit.bp b/units/URB0301/URB0301_unit.bp index 65c837ee73a..164ae3b81a8 100644 --- a/units/URB0301/URB0301_unit.bp +++ b/units/URB0301/URB0301_unit.bp @@ -93,6 +93,9 @@ UnitBlueprint{ "BUILTBYTIER3FACTORY CYBRAN STRUCTURE LAND", "BUILTBYTIER3FACTORY CYBRAN MOBILE LAND", }, + UpgradeOnlyCategory = { + "BUILTBYTIER3FACTORY CYBRAN STRUCTURE LAND", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "urb0301" }, StorageEnergy = 0, diff --git a/units/URB0302/URB0302_unit.bp b/units/URB0302/URB0302_unit.bp index 1a582d7db39..ea833a80a5e 100644 --- a/units/URB0302/URB0302_unit.bp +++ b/units/URB0302/URB0302_unit.bp @@ -103,6 +103,9 @@ UnitBlueprint{ "BUILTBYTIER3FACTORY CYBRAN MOBILE AIR", "TRANSPORTBUILTBYTIER3FACTORY CYBRAN MOBILE AIR", }, + UpgradeOnlyCategory = { + "BUILTBYTIER3FACTORY CYBRAN STRUCTURE AIR", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "urb0302" }, StorageEnergy = 0, diff --git a/units/URB0303/URB0303_unit.bp b/units/URB0303/URB0303_unit.bp index 840ef5d42f0..902bdd237af 100644 --- a/units/URB0303/URB0303_unit.bp +++ b/units/URB0303/URB0303_unit.bp @@ -100,6 +100,9 @@ UnitBlueprint{ "BUILTBYTIER3FACTORY CYBRAN STRUCTURE NAVAL", "BUILTBYTIER3FACTORY CYBRAN MOBILE NAVAL", }, + UpgradeOnlyCategory = { + "BUILTBYTIER3FACTORY CYBRAN STRUCTURE NAVAL", + }, DifferentialUpgradeCostCalculation = true, InitialRallyX = 0, InitialRallyZ = 10, diff --git a/units/XSB0101/XSB0101_unit.bp b/units/XSB0101/XSB0101_unit.bp index 56f3b23a1b0..3d302af762f 100644 --- a/units/XSB0101/XSB0101_unit.bp +++ b/units/XSB0101/XSB0101_unit.bp @@ -112,6 +112,9 @@ UnitBlueprint{ "BUILTBYTIER1FACTORY SERAPHIM STRUCTURE LAND", "BUILTBYTIER1FACTORY SERAPHIM MOBILE LAND", }, + UpgradeOnlyCategory = { + "BUILTBYTIER1FACTORY SERAPHIM STRUCTURE LAND", + }, RebuildBonusIds = { "xsb0101" }, StorageEnergy = 0, StorageMass = 80, diff --git a/units/XSB0102/XSB0102_unit.bp b/units/XSB0102/XSB0102_unit.bp index c5fc9b07330..d833d1c7d65 100644 --- a/units/XSB0102/XSB0102_unit.bp +++ b/units/XSB0102/XSB0102_unit.bp @@ -112,6 +112,9 @@ UnitBlueprint{ "BUILTBYTIER1FACTORY SERAPHIM MOBILE AIR", "TRANSPORTBUILTBYTIER1FACTORY SERAPHIM MOBILE AIR", }, + UpgradeOnlyCategory = { + "BUILTBYTIER1FACTORY SERAPHIM STRUCTURE AIR", + }, RebuildBonusIds = { "xsb0102" }, StorageEnergy = 0, StorageMass = 80, diff --git a/units/XSB0103/XSB0103_unit.bp b/units/XSB0103/XSB0103_unit.bp index 4ef9999eab0..b79a66d241f 100644 --- a/units/XSB0103/XSB0103_unit.bp +++ b/units/XSB0103/XSB0103_unit.bp @@ -103,6 +103,9 @@ UnitBlueprint{ "BUILTBYTIER1FACTORY SERAPHIM STRUCTURE NAVAL", "BUILTBYTIER1FACTORY SERAPHIM MOBILE NAVAL", }, + UpgradeOnlyCategory = { + "BUILTBYTIER1FACTORY SERAPHIM STRUCTURE NAVAL", + }, InitialRallyX = 0, InitialRallyZ = 10, RebuildBonusIds = { "xsb0103" }, diff --git a/units/XSB0201/XSB0201_unit.bp b/units/XSB0201/XSB0201_unit.bp index f6762893db9..1f33dc629fb 100644 --- a/units/XSB0201/XSB0201_unit.bp +++ b/units/XSB0201/XSB0201_unit.bp @@ -101,6 +101,9 @@ UnitBlueprint{ "BUILTBYTIER2FACTORY SERAPHIM STRUCTURE LAND", "BUILTBYTIER2FACTORY SERAPHIM MOBILE LAND", }, + UpgradeOnlyCategory = { + "BUILTBYTIER2FACTORY SERAPHIM STRUCTURE LAND", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "xsb0201" }, StorageEnergy = 0, diff --git a/units/XSB0202/XSB0202_unit.bp b/units/XSB0202/XSB0202_unit.bp index a0e36fe6746..9433e95c33d 100644 --- a/units/XSB0202/XSB0202_unit.bp +++ b/units/XSB0202/XSB0202_unit.bp @@ -105,6 +105,9 @@ UnitBlueprint{ "BUILTBYTIER2FACTORY SERAPHIM MOBILE AIR", "TRANSPORTBUILTBYTIER2FACTORY SERAPHIM MOBILE AIR", }, + UpgradeOnlyCategory = { + "BUILTBYTIER2FACTORY SERAPHIM STRUCTURE AIR", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "xsb0202" }, StorageEnergy = 0, diff --git a/units/XSB0203/XSB0203_unit.bp b/units/XSB0203/XSB0203_unit.bp index 3658b20a902..2f3f9d8c9d1 100644 --- a/units/XSB0203/XSB0203_unit.bp +++ b/units/XSB0203/XSB0203_unit.bp @@ -105,6 +105,9 @@ UnitBlueprint{ "BUILTBYTIER2FACTORY SERAPHIM STRUCTURE NAVAL", "BUILTBYTIER2FACTORY SERAPHIM MOBILE NAVAL", }, + UpgradeOnlyCategory = { + "BUILTBYTIER2FACTORY SERAPHIM STRUCTURE NAVAL", + }, DifferentialUpgradeCostCalculation = true, InitialRallyX = 0, InitialRallyZ = 10, diff --git a/units/XSB0301/XSB0301_unit.bp b/units/XSB0301/XSB0301_unit.bp index 69573152a79..84a6e907ee0 100644 --- a/units/XSB0301/XSB0301_unit.bp +++ b/units/XSB0301/XSB0301_unit.bp @@ -99,6 +99,9 @@ UnitBlueprint{ "BUILTBYTIER3FACTORY SERAPHIM STRUCTURE LAND", "BUILTBYTIER3FACTORY SERAPHIM MOBILE LAND", }, + UpgradeOnlyCategory = { + "BUILTBYTIER3FACTORY SERAPHIM STRUCTURE LAND", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "xsb0301" }, StorageEnergy = 0, diff --git a/units/XSB0302/XSB0302_unit.bp b/units/XSB0302/XSB0302_unit.bp index cc79daf4aa0..c625170e922 100644 --- a/units/XSB0302/XSB0302_unit.bp +++ b/units/XSB0302/XSB0302_unit.bp @@ -110,6 +110,9 @@ UnitBlueprint{ "BUILTBYTIER3FACTORY SERAPHIM MOBILE AIR", "TRANSPORTBUILTBYTIER3FACTORY SERAPHIM MOBILE AIR", }, + UpgradeOnlyCategory = { + "BUILTBYTIER3FACTORY SERAPHIM STRUCTURE AIR", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "xsb0302" }, StorageEnergy = 0, diff --git a/units/XSB0303/XSB0303_unit.bp b/units/XSB0303/XSB0303_unit.bp index 264d773b75a..4e6cb5458b1 100644 --- a/units/XSB0303/XSB0303_unit.bp +++ b/units/XSB0303/XSB0303_unit.bp @@ -104,6 +104,9 @@ UnitBlueprint{ "BUILTBYTIER3FACTORY SERAPHIM STRUCTURE NAVAL", "BUILTBYTIER3FACTORY SERAPHIM MOBILE NAVAL", }, + UpgradeOnlyCategory = { + "BUILTBYTIER3FACTORY SERAPHIM STRUCTURE NAVAL", + }, DifferentialUpgradeCostCalculation = true, InitialRallyX = 0, InitialRallyZ = 10, diff --git a/units/ZAB9501/ZAB9501_unit.bp b/units/ZAB9501/ZAB9501_unit.bp index c7d5dbc8d8f..4cb78060f81 100644 --- a/units/ZAB9501/ZAB9501_unit.bp +++ b/units/ZAB9501/ZAB9501_unit.bp @@ -103,6 +103,9 @@ UnitBlueprint{ "BUILTBYTIER2SUPPORTFACTORY AEON STRUCTURE LAND", "BUILTBYTIER2FACTORY AEON MOBILE LAND", }, + UpgradeOnlyCategory = { + "BUILTBYTIER2SUPPORTFACTORY AEON STRUCTURE LAND", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "zab9501" }, StorageEnergy = 0, diff --git a/units/ZAB9502/ZAB9502_unit.bp b/units/ZAB9502/ZAB9502_unit.bp index 06a05708e52..20918a1f362 100644 --- a/units/ZAB9502/ZAB9502_unit.bp +++ b/units/ZAB9502/ZAB9502_unit.bp @@ -97,6 +97,9 @@ UnitBlueprint{ "BUILTBYTIER2FACTORY AEON MOBILE AIR", "TRANSPORTBUILTBYTIER2FACTORY AEON MOBILE AIR", }, + UpgradeOnlyCategory = { + "BUILTBYTIER2SUPPORTFACTORY AEON STRUCTURE AIR", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "zab9502" }, StorageEnergy = 0, diff --git a/units/ZAB9503/ZAB9503_unit.bp b/units/ZAB9503/ZAB9503_unit.bp index a4990e5ec64..462d8c71ff8 100644 --- a/units/ZAB9503/ZAB9503_unit.bp +++ b/units/ZAB9503/ZAB9503_unit.bp @@ -94,6 +94,9 @@ UnitBlueprint{ "BUILTBYTIER2SUPPORTFACTORY AEON STRUCTURE NAVAL", "BUILTBYTIER2FACTORY AEON MOBILE NAVAL", }, + UpgradeOnlyCategory = { + "BUILTBYTIER2SUPPORTFACTORY AEON STRUCTURE NAVAL", + }, DifferentialUpgradeCostCalculation = true, InitialRallyX = 0, InitialRallyZ = 10, diff --git a/units/ZAB9601/ZAB9601_unit.bp b/units/ZAB9601/ZAB9601_unit.bp index b23ab76838f..1da8053306c 100644 --- a/units/ZAB9601/ZAB9601_unit.bp +++ b/units/ZAB9601/ZAB9601_unit.bp @@ -99,6 +99,9 @@ UnitBlueprint{ "BUILTBYTIER3FACTORY AEON STRUCTURE LAND", "BUILTBYTIER3FACTORY AEON MOBILE LAND", }, + UpgradeOnlyCategory = { + "BUILTBYTIER3FACTORY AEON STRUCTURE LAND", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "zab9601" }, StorageEnergy = 0, diff --git a/units/ZAB9602/ZAB9602_unit.bp b/units/ZAB9602/ZAB9602_unit.bp index 3cf0e0499b3..d8206701fdd 100644 --- a/units/ZAB9602/ZAB9602_unit.bp +++ b/units/ZAB9602/ZAB9602_unit.bp @@ -94,6 +94,9 @@ UnitBlueprint{ "BUILTBYTIER3FACTORY AEON MOBILE AIR", "TRANSPORTBUILTBYTIER3FACTORY AEON MOBILE AIR", }, + UpgradeOnlyCategory = { + "BUILTBYTIER3FACTORY AEON STRUCTURE AIR", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "zab9602" }, StorageEnergy = 0, diff --git a/units/ZAB9603/ZAB9603_unit.bp b/units/ZAB9603/ZAB9603_unit.bp index 0f87da49567..1c37d71edca 100644 --- a/units/ZAB9603/ZAB9603_unit.bp +++ b/units/ZAB9603/ZAB9603_unit.bp @@ -91,6 +91,9 @@ UnitBlueprint{ "BUILTBYTIER3FACTORY AEON STRUCTURE NAVAL", "BUILTBYTIER3FACTORY AEON MOBILE NAVAL", }, + UpgradeOnlyCategory = { + "BUILTBYTIER3FACTORY AEON STRUCTURE NAVAL", + }, DifferentialUpgradeCostCalculation = true, InitialRallyX = 0, InitialRallyZ = 10, diff --git a/units/ZEB9501/ZEB9501_unit.bp b/units/ZEB9501/ZEB9501_unit.bp index 30bfb0ac668..3f11eef0191 100644 --- a/units/ZEB9501/ZEB9501_unit.bp +++ b/units/ZEB9501/ZEB9501_unit.bp @@ -100,6 +100,9 @@ UnitBlueprint{ "BUILTBYTIER2FACTORY UEF MOBILE LAND", "BUILTBYLANDTIER2FACTORY UEF MOBILE CONSTRUCTION", }, + UpgradeOnlyCategory = { + "BUILTBYTIER2SUPPORTFACTORY UEF STRUCTURE LAND", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "zeb9501" }, StorageEnergy = 0, diff --git a/units/ZEB9502/ZEB9502_unit.bp b/units/ZEB9502/ZEB9502_unit.bp index f6d38fcae68..686d7115eba 100644 --- a/units/ZEB9502/ZEB9502_unit.bp +++ b/units/ZEB9502/ZEB9502_unit.bp @@ -101,6 +101,9 @@ UnitBlueprint{ "TRANSPORTBUILTBYTIER2FACTORY UEF MOBILE AIR", "BUILTBYAIRTIER2FACTORY UEF MOBILE CONSTRUCTION", }, + UpgradeOnlyCategory = { + "BUILTBYTIER2SUPPORTFACTORY UEF STRUCTURE AIR", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "zeb9502" }, StorageEnergy = 0, diff --git a/units/ZEB9503/ZEB9503_unit.bp b/units/ZEB9503/ZEB9503_unit.bp index b198fc3421c..10d960b0f3b 100644 --- a/units/ZEB9503/ZEB9503_unit.bp +++ b/units/ZEB9503/ZEB9503_unit.bp @@ -99,6 +99,9 @@ UnitBlueprint{ "BUILTBYTIER2FACTORY UEF MOBILE NAVAL", "BUILTBYNAVALTIER2FACTORY UEF MOBILE CONSTRUCTION", }, + UpgradeOnlyCategory = { + "BUILTBYTIER2SUPPORTFACTORY UEF STRUCTURE NAVAL", + }, DifferentialUpgradeCostCalculation = true, InitialRallyX = 0, InitialRallyZ = 10, diff --git a/units/ZEB9601/ZEB9601_unit.bp b/units/ZEB9601/ZEB9601_unit.bp index 21a8cb57150..81c54706352 100644 --- a/units/ZEB9601/ZEB9601_unit.bp +++ b/units/ZEB9601/ZEB9601_unit.bp @@ -97,6 +97,9 @@ UnitBlueprint{ "BUILTBYTIER3FACTORY UEF MOBILE LAND", "BUILTBYLANDTIER3FACTORY UEF MOBILE CONSTRUCTION", }, + UpgradeOnlyCategory = { + "BUILTBYTIER3FACTORY UEF STRUCTURE LAND", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "zeb9601" }, StorageEnergy = 0, diff --git a/units/ZEB9602/ZEB9602_unit.bp b/units/ZEB9602/ZEB9602_unit.bp index 4b06e91f809..c1fa7d2a867 100644 --- a/units/ZEB9602/ZEB9602_unit.bp +++ b/units/ZEB9602/ZEB9602_unit.bp @@ -97,6 +97,9 @@ UnitBlueprint{ "TRANSPORTBUILTBYTIER3FACTORY UEF MOBILE AIR", "BUILTBYAIRTIER3FACTORY UEF MOBILE CONSTRUCTION", }, + UpgradeOnlyCategory = { + "BUILTBYTIER3FACTORY UEF STRUCTURE AIR", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "zeb9602" }, StorageEnergy = 0, diff --git a/units/ZEB9603/ZEB9603_unit.bp b/units/ZEB9603/ZEB9603_unit.bp index 6d853ed7c84..d8c0def6f4b 100644 --- a/units/ZEB9603/ZEB9603_unit.bp +++ b/units/ZEB9603/ZEB9603_unit.bp @@ -97,6 +97,9 @@ UnitBlueprint{ "BUILTBYTIER3FACTORY UEF MOBILE NAVAL", "BUILTBYNAVALTIER3FACTORY UEF MOBILE CONSTRUCTION", }, + UpgradeOnlyCategory = { + "BUILTBYTIER3FACTORY UEF STRUCTURE NAVAL", + }, DifferentialUpgradeCostCalculation = true, InitialRallyX = 0, InitialRallyZ = 10, diff --git a/units/ZRB9501/ZRB9501_unit.bp b/units/ZRB9501/ZRB9501_unit.bp index f3c91120ac1..db98cad2fbc 100644 --- a/units/ZRB9501/ZRB9501_unit.bp +++ b/units/ZRB9501/ZRB9501_unit.bp @@ -98,6 +98,9 @@ UnitBlueprint{ "BUILTBYTIER2SUPPORTFACTORY CYBRAN STRUCTURE LAND", "BUILTBYTIER2FACTORY CYBRAN MOBILE LAND", }, + UpgradeOnlyCategory = { + "BUILTBYTIER2SUPPORTFACTORY CYBRAN STRUCTURE LAND", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "zrb9501" }, StorageEnergy = 0, diff --git a/units/ZRB9502/ZRB9502_unit.bp b/units/ZRB9502/ZRB9502_unit.bp index 34ca4dc41da..fe68f9e1418 100644 --- a/units/ZRB9502/ZRB9502_unit.bp +++ b/units/ZRB9502/ZRB9502_unit.bp @@ -105,6 +105,9 @@ UnitBlueprint{ "BUILTBYTIER2FACTORY CYBRAN MOBILE AIR", "TRANSPORTBUILTBYTIER2FACTORY CYBRAN MOBILE AIR", }, + UpgradeOnlyCategory = { + "BUILTBYTIER2SUPPORTFACTORY CYBRAN STRUCTURE AIR", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "zrb9502" }, StorageEnergy = 0, diff --git a/units/ZRB9503/ZRB9503_unit.bp b/units/ZRB9503/ZRB9503_unit.bp index 40fdd89e381..7053434099d 100644 --- a/units/ZRB9503/ZRB9503_unit.bp +++ b/units/ZRB9503/ZRB9503_unit.bp @@ -104,6 +104,9 @@ UnitBlueprint{ "BUILTBYTIER2SUPPORTFACTORY CYBRAN STRUCTURE NAVAL", "BUILTBYTIER2FACTORY CYBRAN MOBILE NAVAL", }, + UpgradeOnlyCategory = { + "BUILTBYTIER2SUPPORTFACTORY CYBRAN STRUCTURE NAVAL", + }, DifferentialUpgradeCostCalculation = true, InitialRallyX = 0, InitialRallyZ = 10, diff --git a/units/ZRB9601/ZRB9601_unit.bp b/units/ZRB9601/ZRB9601_unit.bp index 88094369d4b..f7adf4ff684 100644 --- a/units/ZRB9601/ZRB9601_unit.bp +++ b/units/ZRB9601/ZRB9601_unit.bp @@ -94,6 +94,9 @@ UnitBlueprint{ "BUILTBYTIER3FACTORY CYBRAN STRUCTURE LAND", "BUILTBYTIER3FACTORY CYBRAN MOBILE LAND", }, + UpgradeOnlyCategory = { + "BUILTBYTIER3FACTORY CYBRAN STRUCTURE LAND", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "zrb9601" }, StorageEnergy = 0, diff --git a/units/ZRB9602/ZRB9602_unit.bp b/units/ZRB9602/ZRB9602_unit.bp index 62acbaaf1f6..5a8609b53c7 100644 --- a/units/ZRB9602/ZRB9602_unit.bp +++ b/units/ZRB9602/ZRB9602_unit.bp @@ -101,6 +101,9 @@ UnitBlueprint{ "BUILTBYTIER3FACTORY CYBRAN MOBILE AIR", "TRANSPORTBUILTBYTIER3FACTORY CYBRAN MOBILE AIR", }, + UpgradeOnlyCategory = { + "BUILTBYTIER3FACTORY CYBRAN STRUCTURE AIR", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "zrb9602" }, StorageEnergy = 0, diff --git a/units/ZRB9603/ZRB9603_unit.bp b/units/ZRB9603/ZRB9603_unit.bp index f28182210d7..581fe569c40 100644 --- a/units/ZRB9603/ZRB9603_unit.bp +++ b/units/ZRB9603/ZRB9603_unit.bp @@ -101,6 +101,9 @@ UnitBlueprint{ "BUILTBYTIER3FACTORY CYBRAN STRUCTURE NAVAL", "BUILTBYTIER3FACTORY CYBRAN MOBILE NAVAL", }, + UpgradeOnlyCategory = { + "BUILTBYTIER3FACTORY CYBRAN STRUCTURE NAVAL", + }, DifferentialUpgradeCostCalculation = true, InitialRallyX = 0, InitialRallyZ = 10, diff --git a/units/ZSB9501/ZSB9501_unit.bp b/units/ZSB9501/ZSB9501_unit.bp index 4a86d027344..765a5688dc3 100644 --- a/units/ZSB9501/ZSB9501_unit.bp +++ b/units/ZSB9501/ZSB9501_unit.bp @@ -111,6 +111,9 @@ UnitBlueprint{ "BUILTBYTIER2SUPPORTFACTORY SERAPHIM STRUCTURE LAND", "BUILTBYTIER2FACTORY SERAPHIM MOBILE LAND", }, + UpgradeOnlyCategory = { + "BUILTBYTIER2SUPPORTFACTORY SERAPHIM STRUCTURE LAND", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "zsb9501" }, StorageEnergy = 0, diff --git a/units/ZSB9502/ZSB9502_unit.bp b/units/ZSB9502/ZSB9502_unit.bp index 4495efdb2e4..1f2c0510fe3 100644 --- a/units/ZSB9502/ZSB9502_unit.bp +++ b/units/ZSB9502/ZSB9502_unit.bp @@ -108,6 +108,9 @@ UnitBlueprint{ "BUILTBYTIER2FACTORY SERAPHIM MOBILE AIR", "TRANSPORTBUILTBYTIER2FACTORY SERAPHIM MOBILE AIR", }, + UpgradeOnlyCategory = { + "BUILTBYTIER2SUPPORTFACTORY SERAPHIM STRUCTURE AIR", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "zsb9502" }, StorageEnergy = 0, diff --git a/units/ZSB9503/ZSB9503_unit.bp b/units/ZSB9503/ZSB9503_unit.bp index 843fd66a36d..6d01934d874 100644 --- a/units/ZSB9503/ZSB9503_unit.bp +++ b/units/ZSB9503/ZSB9503_unit.bp @@ -108,6 +108,9 @@ UnitBlueprint{ "BUILTBYTIER2SUPPORTFACTORY SERAPHIM STRUCTURE NAVAL", "BUILTBYTIER2FACTORY SERAPHIM MOBILE NAVAL", }, + UpgradeOnlyCategory = { + "BUILTBYTIER2SUPPORTFACTORY SERAPHIM STRUCTURE NAVAL", + }, DifferentialUpgradeCostCalculation = true, InitialRallyX = 0, InitialRallyZ = 10, diff --git a/units/ZSB9601/ZSB9601_unit.bp b/units/ZSB9601/ZSB9601_unit.bp index 22c7d396972..e6b064cdd7f 100644 --- a/units/ZSB9601/ZSB9601_unit.bp +++ b/units/ZSB9601/ZSB9601_unit.bp @@ -107,6 +107,9 @@ UnitBlueprint{ "BUILTBYTIER3FACTORY SERAPHIM STRUCTURE LAND", "BUILTBYTIER3FACTORY SERAPHIM MOBILE LAND", }, + UpgradeOnlyCategory = { + "BUILTBYTIER3FACTORY SERAPHIM STRUCTURE LAND", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "zsb9601" }, StorageEnergy = 0, diff --git a/units/ZSB9602/ZSB9602_unit.bp b/units/ZSB9602/ZSB9602_unit.bp index 437bc28bf3b..66e2ef7eaeb 100644 --- a/units/ZSB9602/ZSB9602_unit.bp +++ b/units/ZSB9602/ZSB9602_unit.bp @@ -105,6 +105,9 @@ UnitBlueprint{ "BUILTBYTIER3FACTORY SERAPHIM MOBILE AIR", "TRANSPORTBUILTBYTIER3FACTORY SERAPHIM MOBILE AIR", }, + UpgradeOnlyCategory = { + "BUILTBYTIER3FACTORY SERAPHIM STRUCTURE AIR", + }, DifferentialUpgradeCostCalculation = true, RebuildBonusIds = { "zsb9602" }, StorageEnergy = 0, diff --git a/units/ZSB9603/ZSB9603_unit.bp b/units/ZSB9603/ZSB9603_unit.bp index f6967d4d661..28dc03f502f 100644 --- a/units/ZSB9603/ZSB9603_unit.bp +++ b/units/ZSB9603/ZSB9603_unit.bp @@ -105,6 +105,9 @@ UnitBlueprint{ "BUILTBYTIER3FACTORY SERAPHIM STRUCTURE NAVAL", "BUILTBYTIER3FACTORY SERAPHIM MOBILE NAVAL", }, + UpgradeOnlyCategory = { + "BUILTBYTIER3FACTORY SERAPHIM STRUCTURE NAVAL", + }, DifferentialUpgradeCostCalculation = true, InitialRallyX = 0, InitialRallyZ = 10,