Skip to content

Fix Terran mech armor research ID issues - #232

Merged
BurnySc2 merged 6 commits into
BurnySc2:developfrom
SamOgon-one:patch-1
Nov 5, 2026
Merged

BurnySc2 merged 6 commits into
BurnySc2:developfrom
SamOgon-one:patch-1

Conversation

@SamOgon-one

@SamOgon-one SamOgon-one commented Dec 20, 2025 •

Copy link
Copy Markdown
Contributor

Summary

Fixes an issue where Terran Armories fail to start researching Vehicle and Ship Plating (Levels 1–3) when using unit.research(...).

Problem & Root Cause

In Blizzard's SC2 protobuf game data, the ability_id mapped to Terran mech armor upgrades points to the Heart of the Swarm campaign variant (ARMORYRESEARCHSWARM_... with SWARM in the middle) instead of the standard multiplayer Armory ability:

Upgrade ID Protobuf Ability ID (Incorrect)
UpgradeId.TERRANVEHICLEANDSHIPARMORSLEVEL1 AbilityId.ARMORYRESEARCHSWARM_TERRANVEHICLEANDSHIPPLATINGLEVEL1
UpgradeId.TERRANVEHICLEANDSHIPARMORSLEVEL2 AbilityId.ARMORYRESEARCHSWARM_TERRANVEHICLEANDSHIPPLATINGLEVEL2
UpgradeId.TERRANVEHICLEANDSHIPARMORSLEVEL3 AbilityId.ARMORYRESEARCHSWARM_TERRANVEHICLEANDSHIPPLATINGLEVEL3

Because multiplayer Armories do not have access to the SWARM ability IDs, issuing research orders with them fails silently or gets rejected by the game engine.

Solution

Added an explicit override mapping that resolves these upgrades to their valid multiplayer ability equivalents:

  • TERRANVEHICLEANDSHIPARMORSLEVEL1 ➔ ARMORYRESEARCH_TERRANVEHICLEANDSHIPPLATINGLEVEL1
  • TERRANVEHICLEANDSHIPARMORSLEVEL2 ➔ ARMORYRESEARCH_TERRANVEHICLEANDSHIPPLATINGLEVEL2
  • TERRANVEHICLEANDSHIPARMORSLEVEL3 ➔ ARMORYRESEARCH_TERRANVEHICLEANDSHIPPLATINGLEVEL3

Prevent research bugs, where Terran mech armor research does not start due to an incorrect exact_id from the protobuf
Hardcode correct IDs

for some reason 'exact_id' for UpgradeId.TERRANVEHICLEANDSHIPARMORSLEVEL1 is returning the ability ID 'ARMORYRESEARCHSWARM_TERRANVEHICLEANDSHIPPLATINGLEVEL1' in the protobuf,

Similar for upgrade level 2 and 3
UpgradeId.TERRANVEHICLEANDSHIPARMORSLEVEL1
AbilityId.ARMORYRESEARCHSWARM_TERRANVEHICLEANDSHIPPLATINGLEVEL1
UpgradeId.TERRANVEHICLEANDSHIPARMORSLEVEL2
AbilityId.ARMORYRESEARCHSWARM_TERRANVEHICLEANDSHIPPLATINGLEVEL2
UpgradeId.TERRANVEHICLEANDSHIPARMORSLEVEL3
AbilityId.ARMORYRESEARCHSWARM_TERRANVEHICLEANDSHIPPLATINGLEVEL3
Correct hardcoded IDs for Terran vehicle and ship armor upgrades.
@chadspratt

chadspratt commented Dec 20, 2025 •

Copy link
Copy Markdown

could be less code-repetitive with something like

        creationAbilityID = self.bot.game_data.upgrades[upgrade_type.value].research_ability.exact_id
        if upgrade_type == UpgradeId.TERRANVEHICLEANDSHIPARMORSLEVEL1:
            creationAbilityID = AbilityId.ARMORYRESEARCH_TERRANVEHICLEANDSHIPPLATINGLEVEL1
        elif upgrade_type == UpgradeId.TERRANVEHICLEANDSHIPARMORSLEVEL2:
            creationAbilityID = AbilityId.ARMORYRESEARCH_TERRANVEHICLEANDSHIPPLATINGLEVEL2
        elif upgrade_type == UpgradeId.TERRANVEHICLEANDSHIPARMORSLEVEL3:
            creationAbilityID = AbilityId.ARMORYRESEARCH_TERRANVEHICLEANDSHIPPLATINGLEVEL3

@maxnus

maxnus commented Dec 20, 2025 •

Copy link
Copy Markdown
Contributor

Thanks for proposing a fix upstream!

I think a dictionary may be more extendable than if-then-else blocks - perhaps something like

ability_id_overrides = {
   UpgradeId.TERRANVEHICLEANDSHIPARMORSLEVEL1: AbilityId.ARMORYRESEARCH_TERRANVEHICLEANDSHIPPLATINGLEVEL1,
   UpgradeId.TERRANVEHICLEANDSHIPARMORSLEVEL2: AbilityId.ARMORYRESEARCH_TERRANVEHICLEANDSHIPPLATINGLEVEL2,
   UpgradeId.TERRANVEHICLEANDSHIPARMORSLEVEL3: AbilityId.ARMORYRESEARCH_TERRANVEHICLEANDSHIPPLATINGLEVEL3,
}
ability_id = ability_id_override.get(upgrade, self._bot_object.game_data.upgrades[upgrade.value].research_ability.exact_id)
self(ability_id, ...)

?

Added a workaround for incorrect ability IDs returned by Blizzard protobuf for certain upgrades.
Update research_ability property to use union type for return value.
@SamOgon-one

SamOgon-one commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor Author

A mapping dictionary would be much cleaner.

Moving this override into game_data.py so that game_data.upgrades[upgrade].research_ability is also corrected throughout the library

@BurnySc2
BurnySc2 merged commit 33d2c08 into BurnySc2:develop Nov 5, 2026
43 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants