diff --git a/sc2dump.cpp b/sc2dump.cpp index f23fe64f..8fb1e473 100644 --- a/sc2dump.cpp +++ b/sc2dump.cpp @@ -1,262 +1,234 @@ -/* Dump type ids for Units and Abils for SC2. - * - * Authors: Robert Nix (@mischanix), Graylin Kim (@GraylinKim) - * - * Must be linked with the Microsoft Version.lib library. If compiling on 32 bit you may require the LAA option. - * - * Usage: sc2dump.exe - * Example: - * - * $ sc2dump.exe 24764/units.csv 24764/abils.csv - * Searching for a live SC2 process. - * - * Found SC2.exe - * Path: C:\Program Files (x86)\StarCraft II 2012 Beta\Versions\Base24764\SC2.exe - * Base Address: 590000 - * Build: 24764 - * - * Dumping Catalog@0x7903b54 - * Dumping CAbil@0x790b7f4 to 24764/24764_abils.csv - * Dumping CUnit@0x791f864 to 24764/24764_units.csv - * - * Done. - * - * If the script can't find the SC2 process or the offset is bad it will tell you. If SC2 is running an - * unknown offset you'll need to use CheatEngine to find a new one and make a new case for the switch - * statement. - * - * For Heart of the Swarm: - * 1. Attach to the process - * 2. Make sure that writable is unchecked and executable is fully checked - * 3. Do an array search for "8b 0d ?? ?? ?? ?? 8b 49" - * 4. Look for the most common match. - * 5. The the ?? ?? ?? ?? portion is the bytes in reverse order for the gameCatalog - * 6. Subtract the base address for the process (which you can get by running this script) - * 7. Add a new case for this build with that information. cUnitIndex and stringNameOffset generally won't change - * - * For Wings of Liberty: - * 1. Use the "a1 ?? ?? ?? ?? 8b 80" search string with the HotS instructions above. - * - */ -#include -#include -#include - -#include -#include -#include - -const int MAX_PROC_NAME_SIZE = 512; -const int MAX_PROC_LIST_SIZE = 2048; - -void DumpIds(HANDLE sc2_handle, uint32_t catalogRecordList, uint32_t stringNameOffset, FILE* out); -uint32_t ReadUInt(uint32_t address, HANDLE sc2_handle); -char* ReadString(uint32_t address, uint32_t length, HANDLE sc2_handle); -uint32_t GetModuleBase(DWORD, char *); - -HANDLE getSC2Handle(); -char* getSC2Info(HANDLE sc2_handle, uint32_t &base_address, uint32_t &build); - -int main(int argc, char* argv[]) { - if (argc < 3) { - printf("Both unit and ability output files are required (in that order).\n"); - ExitProcess(1); - } - - char* units_filename = argv[1]; - char* abils_filename = argv[2]; - - - printf("Searching for a live SC2 process.\n"); - HANDLE sc2_handle = getSC2Handle(); - if (sc2_handle == NULL) { - printf("Error: SC2.exe not found\n"); - ExitProcess(1); - } - - uint32_t build; - uint32_t base_address; - char* sc2_exe_path = getSC2Info(sc2_handle, base_address, build); - if (sc2_exe_path == NULL) { - printf("Error: Unable to acquire base address and build information.\n"); - ExitProcess(1); - } else { - printf("\nFound SC2.exe\n"); - printf(" Path: %s\n", sc2_exe_path); - printf(" Base Address: %x\n", base_address); - printf(" Build: %d\n", build); - } - - uint32_t gameCatalog = 0; - uint32_t cUnitIndex = 0; - uint32_t stringNameOffset = 0; - switch(build) { - case 23260: // WoL 1.5.3.23260 - gameCatalog = 0x1362BA0u; - cUnitIndex = 0x110u; - stringNameOffset = 0x64u; - break; - case 23925: // HotS beta 2.0.0.23925 - gameCatalog = 0x1EA2BE8u; - cUnitIndex = 0x110u; - stringNameOffset = 0x40u; - break; - case 24247: // HotS beta 2.0.0.24247 - gameCatalog = 0x10C9B28u; - cUnitIndex = 0x11cu; - stringNameOffset = 0x40u; - break; - case 24764: // HotS beta 2.0.3.24764 - gameCatalog = 0x10E79B8u; - cUnitIndex = 0x11cu; - stringNameOffset = 0x40u; - break; - default: - printf("Error: Missing offset values for build %d\n",build); - ExitProcess(1); - } - - uint32_t gameCatalogTable = ReadUInt(base_address + gameCatalog,sc2_handle); - printf("\nDumping Catalog@0x%x\n", gameCatalogTable); - - FILE* abils_file; - if (fopen_s(&abils_file,abils_filename, "w")==0) { - uint32_t abilCatalogList = ReadUInt(gameCatalogTable + 0x1c,sc2_handle); - printf(" Dumping CAbil@0x%x to %s\n", abilCatalogList, abils_filename); - DumpIds(sc2_handle, abilCatalogList, stringNameOffset, abils_file); - fclose(abils_file); - } else { - printf(" ERROR: Could not open %s for writing.",abils_filename); - } - - FILE* units_file; - if (fopen_s(&units_file, units_filename , "w")==0) { - uint32_t unitCatalogList = ReadUInt(gameCatalogTable + cUnitIndex,sc2_handle); - printf(" Dumping CUnit@0x%x to %s\n", unitCatalogList, units_filename); - DumpIds(sc2_handle, unitCatalogList, stringNameOffset, units_file); - fclose(units_file); - } else { - printf(" ERROR: Could not open %s for writing.",units_filename); - } - - printf("\nDone.\n"); - CloseHandle(sc2_handle); - return 0; -} - -void DumpIds(HANDLE sc2_handle, uint32_t catalogRecordList, uint32_t stringNameOffset, FILE* out) { - uint32_t recordsList = ReadUInt(catalogRecordList + 0x5c, sc2_handle); - if (recordsList == 0) { - printf("-- Error dumping table@%x: no list of catalog records found.\n", catalogRecordList); - return; - } - - uint32_t numEntries = ReadUInt(catalogRecordList + 0x50, sc2_handle); - for (uint32_t id = 0; id < numEntries; id++) { - uint32_t recordPtr = ReadUInt(recordsList + 4 * id, sc2_handle); - if (recordPtr != 0) { - uint32_t stringPtr = ReadUInt(ReadUInt(recordPtr + stringNameOffset, sc2_handle) + 0x10, sc2_handle) + 4; - uint32_t stringLength = ReadUInt(stringPtr, sc2_handle); - uint32_t string_flags = ReadUInt(stringPtr + 4,sc2_handle); - - // Some strings are actually stored else where in memory - uint32_t stringDataPtr = stringPtr+8; - if (string_flags & 4) { - stringDataPtr = ReadUInt(stringDataPtr,sc2_handle); - } - - char* name = ReadString(stringDataPtr, stringLength, sc2_handle); - if (strlen(name) != 0) { - fprintf(out, "%d,%s\n", id, name); - } - free(name); - } - } -} - -char* ReadString(uint32_t address, uint32_t length, HANDLE sc2_handle) { - char* result = (char*)malloc(length+1); - memset(result, 0, length+1); - ReadProcessMemory(sc2_handle, (LPCVOID)address, result, length, 0); - return result; -} - -uint32_t ReadUInt(uint32_t address, HANDLE sc2_handle) { - uint32_t result = 0; - ReadProcessMemory(sc2_handle, (LPCVOID)address, &result, sizeof(uint32_t), 0); - return result; -} - -uint32_t GetModuleBase(DWORD procId, char* modName) -{ - HANDLE snapshot; - MODULEENTRY32 modInfo; - snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, procId); - modInfo.dwSize = sizeof(MODULEENTRY32); - - if (Module32First(snapshot, &modInfo)) - { - // printf("mod %s\n", modInfo.szModule); - if (!strcmp(modInfo.szModule, modName)) - { - CloseHandle(snapshot); - return (uint32_t)modInfo.modBaseAddr; - } - - while (Module32Next(snapshot, &modInfo)) - { - // printf("mod %s\n", modInfo.szModule); - if (!strcmp(modInfo.szModule, modName)) - { - CloseHandle(snapshot); - return (uint32_t)modInfo.modBaseAddr; - } - } - } - CloseHandle(snapshot); - return 0; -} - -char* getSC2Info(HANDLE sc2_handle, uint32_t &base_address, uint32_t &build) { - char* sc2_exe_path = (char*)malloc(MAX_PROC_NAME_SIZE); - if(GetModuleFileNameEx(sc2_handle, 0, sc2_exe_path, MAX_PROC_NAME_SIZE)==0) { - printf("ERROR %d: Unable to retrieve executable file name", GetLastError()); - return NULL; - } - - DWORD infoSize = GetFileVersionInfoSize(sc2_exe_path, 0); - void *infoBuffer = malloc(infoSize); - VS_FIXEDFILEINFO *sc2VersionInfo; - - GetFileVersionInfo(sc2_exe_path, 0, infoSize, infoBuffer); - VerQueryValue(infoBuffer, "\\", (LPVOID*)&sc2VersionInfo, 0); - build = sc2VersionInfo->dwFileVersionLS & 0xffff; - free(infoBuffer); - - DWORD proc_id = GetProcessId(sc2_handle); - base_address = GetModuleBase(proc_id, "SC2.exe"); - return sc2_exe_path; -} - -HANDLE getSC2Handle() { - DWORD bytes_returned = 0; - DWORD proc_ids[MAX_PROC_LIST_SIZE]; // Should be large enough - if (EnumProcesses(proc_ids, MAX_PROC_LIST_SIZE, &bytes_returned)!=0) { - char buf[MAX_PROC_NAME_SIZE]; - DWORD proc_count = bytes_returned/sizeof(DWORD); - for (DWORD i=0; i < proc_count; i++) { - DWORD proc_id = proc_ids[i]; - HANDLE handle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, proc_id); - if (handle != NULL) { - if(GetModuleBaseName(handle, 0, buf, MAX_PROC_NAME_SIZE)!=0 && strcmp(buf, "SC2.exe")==0) { - return handle; - } else { - CloseHandle(handle); - } - } - } - } else { - printf("Error %d: Unable to enumerate processes.\n",GetLastError()); - } - return NULL; -} +/* Dump type ids for Units and Abils for SC2. + * + * Authors: Robert Nix (@mischanix), Graylin Kim (@GraylinKim) + * + * to compile with mingw-w64-x86_64-clang: + * clang -Wextra -Wall -Werror -O3 sc2dump.cpp -static -lversion -lpsapi + * + * Must be linked with the Microsoft Version.lib library. If compiling on 32 bit you may require the LAA option. + * + * Usage: sc2dump.exe + * Example: + * + * $ sc2dump.exe 24764/units.csv 24764/abils.csv + * Searching for a live SC2 process. + * + * Found SC2.exe + * Path: C:\Program Files (x86)\StarCraft II 2012 Beta\Versions\Base24764\SC2.exe + * Base Address: 590000 + * Build: 24764 + * + * Dumping Catalog@0x7903b54 + * Dumping CAbil@0x790b7f4 to 24764/24764_abils.csv + * Dumping CUnit@0x791f864 to 24764/24764_units.csv + * + * Done. + * + */ + +#include +#include +#include + +#include +#include +#include + +#define MODULE_NAME "SC2_x64.exe" +typedef uint64_t rptr_t; +#define PTR(x) (const void *)(x) + +HANDLE sc2_handle; + +char* ReadString(rptr_t address, uint32_t length) { + char* result = (char*)malloc(length+1); + memset(result, 0, length+1); + ReadProcessMemory(sc2_handle, PTR(address), result, length, 0); + return result; +} + +uint32_t ReadUInt(rptr_t address) { + uint32_t result = 0; + ReadProcessMemory(sc2_handle, PTR(address), &result, sizeof(uint32_t), 0); + return result; +} + +rptr_t ReadPtr(rptr_t address) { + rptr_t result = 0; + ReadProcessMemory(sc2_handle, PTR(address), &result, sizeof(rptr_t), 0); + return result; +} + +void DumpIds(rptr_t catalogRecordList, rptr_t stringNameOffset, FILE* out) { + rptr_t recordsList = ReadPtr(catalogRecordList + 0x48); + if (recordsList == 0) { + printf("-- Error dumping table@%p: no list of catalog records found.\n", PTR(catalogRecordList)); + return; + } + + uint32_t numEntries = ReadUInt(catalogRecordList + 0x38); + printf("%u %p\n", numEntries, PTR(recordsList)); + for (uint32_t id = 0; id < numEntries; id++) { + rptr_t recordPtr = ReadPtr(recordsList + sizeof(rptr_t) * id); + if (recordPtr != 0) { + rptr_t stringPtr = ReadPtr(ReadPtr(recordPtr + stringNameOffset) + 0x20) + 0x18; + uint32_t stringLength = ReadUInt(stringPtr) >> 2; + uint32_t stringFlags = ReadUInt(stringPtr + 4); + + // Strings are either inline or a pointer depending on length: + rptr_t stringDataPtr = stringPtr + 8; + if (stringFlags & 2) { + stringDataPtr = ReadPtr(stringDataPtr); + } + + char* name = ReadString(stringDataPtr, stringLength); + if (strlen(name) != 0) { + fprintf(out, "%d,%s\n", id, name); + } + free(name); + } + } +} + +rptr_t GetModuleBase(DWORD procId, const char* modName) +{ + HANDLE snapshot; + MODULEENTRY32 modInfo; + snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, procId); + modInfo.dwSize = sizeof(MODULEENTRY32); + + if (Module32First(snapshot, &modInfo)) + { + if (!strcmp(modInfo.szModule, modName)) + { + CloseHandle(snapshot); + return (rptr_t)(uintptr_t)modInfo.modBaseAddr; + } + + while (Module32Next(snapshot, &modInfo)) + { + if (!strcmp(modInfo.szModule, modName)) + { + CloseHandle(snapshot); + return (rptr_t)(uintptr_t)modInfo.modBaseAddr; + } + } + } + CloseHandle(snapshot); + return 0; +} + +char* getSC2Info(rptr_t &base_address, uint32_t &build) { + char* sc2_exe_path = (char*)malloc(512); + if(GetModuleFileNameEx(sc2_handle, 0, sc2_exe_path, 512)==0) { + printf("ERROR %lu: Unable to retrieve executable file name", GetLastError()); + return NULL; + } + + DWORD infoSize = GetFileVersionInfoSize(sc2_exe_path, 0); + void *infoBuffer = malloc(infoSize); + VS_FIXEDFILEINFO *sc2VersionInfo; + + GetFileVersionInfo(sc2_exe_path, 0, infoSize, infoBuffer); + VerQueryValue(infoBuffer, "\\", (LPVOID*)&sc2VersionInfo, 0); + build = sc2VersionInfo->dwFileVersionLS & 0xffff; + free(infoBuffer); + + DWORD proc_id = GetProcessId(sc2_handle); + base_address = GetModuleBase(proc_id, MODULE_NAME); + return sc2_exe_path; +} + +HANDLE getSC2Handle() { + DWORD bytes_returned = 0; + DWORD proc_ids[2048]; // Should be large enough + if (EnumProcesses(proc_ids, 2048, &bytes_returned)!=0) { + char buf[512]; + DWORD proc_count = bytes_returned/sizeof(DWORD); + for (DWORD i=0; i < proc_count; i++) { + DWORD proc_id = proc_ids[i]; + HANDLE handle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, proc_id); + if (handle != NULL) { + if(GetModuleBaseName(handle, 0, buf, 512)!=0 && strcmp(buf, MODULE_NAME)==0) { + return handle; + } else { + CloseHandle(handle); + } + } + } + } else { + printf("Error %lu: Unable to enumerate processes.\n", GetLastError()); + } + return NULL; +} + +int main(int argc, char *argv[]) { + if (argc < 3) { + printf("Both unit and ability output files are required (in that order).\n"); + ExitProcess(1); + } + + char *units_filename = argv[1]; + char *abils_filename = argv[2]; + + printf("Searching for a live SC2 process.\n"); + sc2_handle = getSC2Handle(); + if (sc2_handle == NULL) { + printf("Error: " MODULE_NAME " not found\n"); + ExitProcess(1); + } + + uint32_t build; + rptr_t base_address; + char* sc2_exe_path = getSC2Info(base_address, build); + if (sc2_exe_path == NULL) { + printf("Error: Unable to acquire base address and build information.\n"); + ExitProcess(1); + } else { + printf("\nFound " MODULE_NAME "\n"); + printf(" Path: %s\n", sc2_exe_path); + printf(" Base Address: %p\n", PTR(base_address)); + printf(" Build: %d\n", build); + } + + rptr_t gameCatalog = 0; + uint32_t cUnitIndex = 0; + uint32_t stringNameOffset = 0; + switch(build) { + case 37164: // LotV beta 2.5.5.37164 + gameCatalog = 0x3E7DC58u; + cUnitIndex = 0x280u; + stringNameOffset = 0x70u; + break; + default: + printf("Error: Missing offset values for build %d\n", build); + ExitProcess(1); + } + + rptr_t gameCatalogTable = ReadPtr(base_address + gameCatalog); + printf("\nDumping Catalog@0x%p\n", PTR(gameCatalogTable)); + + FILE* abils_file; + if (fopen_s(&abils_file, abils_filename, "w") == 0) { + rptr_t abilCatalogList = ReadPtr(gameCatalogTable + 0x8); + printf(" Dumping CAbil@0x%p to %s\n", PTR(abilCatalogList), abils_filename); + DumpIds(abilCatalogList, stringNameOffset, abils_file); + fclose(abils_file); + } else { + printf(" ERROR: Could not open %s for writing\n", abils_filename); + } + + FILE* units_file; + if (fopen_s(&units_file, units_filename, "w") == 0) { + rptr_t unitCatalogList = ReadPtr(gameCatalogTable + cUnitIndex); + printf(" Dumping CUnit@0x%p to %s\n", PTR(unitCatalogList), units_filename); + DumpIds(unitCatalogList, stringNameOffset, units_file); + fclose(units_file); + } else { + printf(" ERROR: Could not open %s for writing.\n", units_filename); + } + + printf("\nDone.\n"); + CloseHandle(sc2_handle); + return 0; +} diff --git a/sc2reader/data/LotV/base_abilities.csv b/sc2reader/data/LotV/base_abilities.csv index 8da0580d..1708ccb7 100755 --- a/sc2reader/data/LotV/base_abilities.csv +++ b/sc2reader/data/LotV/base_abilities.csv @@ -269,129 +269,251 @@ 270,que5PassiveCancelToSelection 292,BridgeExtend 293,BridgeRetract -294,DigesterCreepSpray -295,MorphToCollapsibleTerranTowerDebris -296,MorphToCollapsibleTerranTowerDebrisRampLeft -297,MorphToCollapsibleTerranTowerDebrisRampRight -298,MorphToMothership -299,MothershipStasis -300,MothershipCoreWeapon -301,NexusTrainMothershipCore -302,MothershipCoreTeleport -303,SalvageDroneRefund -304,SalvageDrone -305,SalvageZerglingRefund -306,SalvageZergling -307,SalvageQueenRefund -308,SalvageQueen -309,SalvageRoachRefund -310,SalvageRoach -311,SalvageBanelingRefund -312,SalvageBaneling -313,SalvageHydraliskRefund -314,SalvageHydralisk -315,SalvageInfestorRefund -316,SalvageInfestor -317,SalvageSwarmHostRefund -318,SalvageSwarmHost -319,SalvageUltraliskRefund -320,SalvageUltralisk -321,DigesterTransport -322,SpectreShield -323,XelNagaHealingShrine -324,NexusInvulnerability -325,NexusPhaseShift -326,SpawnChangelingTarget -327,QueenLand -328,QueenFly -329,OracleCloakField -330,FlyerShield -331,LocustTrain -332,MothershipCoreMassRecall -333,SingleRecall -334,MorphToHellion -335,RestoreShields -336,Scryer -337,BurrowChargeTrial -338,LeechResources -339,SnipeDoT -340,SwarmHostSpawnLocusts -341,Clone -342,BuildingShield -343,MorphToCollapsibleRockTowerDebris -344,MorphToHellionTank -345,BuildingStasis -346,ResourceBlocker -347,ResourceStun -348,MaxiumThrust -349,Sacrifice -350,BurrowChargeMP -351,BurrowChargeRevD -352,MorphToSwarmHostBurrowedMP -353,MorphToSwarmHostMP -354,SpawnInfestedTerran -355,attackProtossBuilding -356,burrowedBanelingStop -357,stopProtossBuilding -358,BlindingCloud -359,EyeStalk -360,Yoink -361,ViperConsume -362,ViperConsumeMinerals -363,ViperConsumeStructure -364,ProtossBuildingQueue -365,que8 -366,TestZerg -367,VolatileBurstBuilding -368,PickupScrapSmall -369,PickupScrapMedium -370,PickupScrapLarge -371,PickupPalletGas -372,PickupPalletMinerals -373,MassiveKnockover -374,WidowMineBurrow -375,WidowMineUnburrow -376,WidowMineAttack -377,TornadoMissile -378,MothershipCoreEnergize -379,LurkerAspectMPFromHydraliskBurrowed -380,LurkerAspectMP -381,BurrowLurkerMPDown -382,BurrowLurkerMPUp -383,UpgradeToLurkerDenMP -384,HallucinationOracle -385,MedivacSpeedBoost -386,ExtendingBridgeNEWide8Out -387,ExtendingBridgeNEWide8 -388,ExtendingBridgeNWWide8Out -389,ExtendingBridgeNWWide8 -390,ExtendingBridgeNEWide10Out -391,ExtendingBridgeNEWide10 -392,ExtendingBridgeNWWide10Out -393,ExtendingBridgeNWWide10 -394,ExtendingBridgeNEWide12Out -395,ExtendingBridgeNEWide12 -396,ExtendingBridgeNWWide12Out -397,ExtendingBridgeNWWide12 -398,InvulnerabilityShield -399,CritterFlee -400,OracleRevelation -401,OracleRevelationMode -402,OracleNormalMode -403,MorphToCollapsibleRockTowerDebrisRampRight -404,MorphToCollapsibleRockTowerDebrisRampLeft -405,VoidSiphon -406,UltraliskWeaponCooldown -407,MothershipCorePurifyNexusCancel -408,MothershipCorePurifyNexus -409,TemporalField -431,ArmoryResearchSwarm -432,ArmorpiercingMissiles -433,ExplosiveMissiles -434,LightofAiur -435,MothershipMassRecall -436,OracleWeapon -437,PulsarBeam -438,PulsarCannon -439,VoidRaySwarmDamageBoost -440,SeekerDummyChannel +294,XelNaga_Caverns_DoorDefaultOpen +295,XelNaga_Caverns_DoorDefaultClose +296,DigesterCreepSpray +297,MorphToCollapsibleTerranTowerDebris +298,MorphToCollapsibleTerranTowerDebrisRampLeft +299,MorphToCollapsibleTerranTowerDebrisRampRight +300,MorphToMothership +301,MothershipStasis +302,MothershipCoreWeapon +303,NexusTrainMothershipCore +304,MothershipCoreTeleport +305,SalvageDroneRefund +306,SalvageDrone +307,SalvageZerglingRefund +308,SalvageZergling +309,SalvageQueenRefund +310,SalvageQueen +311,SalvageRoachRefund +312,SalvageRoach +313,SalvageBanelingRefund +314,SalvageBaneling +315,SalvageHydraliskRefund +316,SalvageHydralisk +317,SalvageInfestorRefund +318,SalvageInfestor +319,SalvageSwarmHostRefund +320,SalvageSwarmHost +321,SalvageUltraliskRefund +322,SalvageUltralisk +323,DigesterTransport +324,SpectreShield +325,XelNagaHealingShrine +326,NexusInvulnerability +327,NexusPhaseShift +328,SpawnChangelingTarget +329,QueenLand +330,QueenFly +331,OracleCloakField +332,FlyerShield +333,LocustTrain +334,MothershipCoreMassRecall +335,SingleRecall +336,MorphToHellion +337,RestoreShields +338,Scryer +339,BurrowChargeTrial +340,LeechResources +341,SnipeDoT +342,SwarmHostSpawnLocusts +343,Clone +344,BuildingShield +345,MorphToCollapsibleRockTowerDebris +346,MorphToHellionTank +347,BuildingStasis +348,ResourceBlocker +349,ResourceStun +350,MaxiumThrust +351,Sacrifice +352,BurrowChargeMP +353,BurrowChargeRevD +354,MorphToSwarmHostBurrowedMP +355,MorphToSwarmHostMP +356,SpawnInfestedTerran +357,attackProtossBuilding +358,burrowedBanelingStop +359,stopProtossBuilding +360,BlindingCloud +361,EyeStalk +362,Yoink +363,ViperConsume +364,ViperConsumeMinerals +365,ViperConsumeStructure +366,ProtossBuildingQueue +367,que8 +368,TestZerg +369,VolatileBurstBuilding +370,PickupScrapSmall +371,PickupScrapMedium +372,PickupScrapLarge +373,PickupPalletGas +374,PickupPalletMinerals +375,MassiveKnockover +376,WidowMineBurrow +377,WidowMineUnburrow +378,WidowMineAttack +379,TornadoMissile +380,MothershipCoreEnergize +381,LurkerAspectMPFromHydraliskBurrowed +382,LurkerAspectMP +383,BurrowLurkerMPDown +384,BurrowLurkerMPUp +385,UpgradeToLurkerDenMP +386,HallucinationOracle +387,MedivacSpeedBoost +388,ExtendingBridgeNEWide8Out +389,ExtendingBridgeNEWide8 +390,ExtendingBridgeNWWide8Out +391,ExtendingBridgeNWWide8 +392,ExtendingBridgeNEWide10Out +393,ExtendingBridgeNEWide10 +394,ExtendingBridgeNWWide10Out +395,ExtendingBridgeNWWide10 +396,ExtendingBridgeNEWide12Out +397,ExtendingBridgeNEWide12 +398,ExtendingBridgeNWWide12Out +399,ExtendingBridgeNWWide12 +400,InvulnerabilityShield +401,CritterFlee +402,OracleRevelation +403,OracleRevelationMode +404,OracleNormalMode +405,MorphToCollapsibleRockTowerDebrisRampRight +406,MorphToCollapsibleRockTowerDebrisRampLeft +407,VoidSiphon +408,UltraliskWeaponCooldown +409,MothershipCorePurifyNexusCancel +410,MothershipCorePurifyNexus +411,XelNaga_Caverns_DoorE +412,XelNaga_Caverns_DoorEOpened +413,XelNaga_Caverns_DoorN +414,XelNaga_Caverns_DoorNE +415,XelNaga_Caverns_DoorNEOpened +416,XelNaga_Caverns_DoorNOpened +417,XelNaga_Caverns_DoorNW +418,XelNaga_Caverns_DoorNWOpened +419,XelNaga_Caverns_DoorS +420,XelNaga_Caverns_DoorSE +421,XelNaga_Caverns_DoorSEOpened +422,XelNaga_Caverns_DoorSOpened +423,XelNaga_Caverns_DoorSW +424,XelNaga_Caverns_DoorSWOpened +425,XelNaga_Caverns_DoorW +426,XelNaga_Caverns_DoorWOpened +427,XelNaga_Caverns_Floating_BridgeNE8Out +428,XelNaga_Caverns_Floating_BridgeNE8 +429,XelNaga_Caverns_Floating_BridgeNW8Out +430,XelNaga_Caverns_Floating_BridgeNW8 +431,XelNaga_Caverns_Floating_BridgeNE10Out +432,XelNaga_Caverns_Floating_BridgeNE10 +433,XelNaga_Caverns_Floating_BridgeNW10Out +434,XelNaga_Caverns_Floating_BridgeNW10 +435,XelNaga_Caverns_Floating_BridgeNE12Out +436,XelNaga_Caverns_Floating_BridgeNE12 +437,XelNaga_Caverns_Floating_BridgeNW12Out +438,XelNaga_Caverns_Floating_BridgeNW12 +439,XelNaga_Caverns_Floating_BridgeH8Out +440,XelNaga_Caverns_Floating_BridgeH8 +441,XelNaga_Caverns_Floating_BridgeV8Out +442,XelNaga_Caverns_Floating_BridgeV8 +443,XelNaga_Caverns_Floating_BridgeH10Out +444,XelNaga_Caverns_Floating_BridgeH10 +445,XelNaga_Caverns_Floating_BridgeV10Out +446,XelNaga_Caverns_Floating_BridgeV10 +447,XelNaga_Caverns_Floating_BridgeH12Out +448,XelNaga_Caverns_Floating_BridgeH12 +449,XelNaga_Caverns_Floating_BridgeV12Out +450,XelNaga_Caverns_Floating_BridgeV12 +451,TemporalField +473,ArmoryResearchSwarm +474,CausticSpray +475,OracleCloakingFieldTargeted +476,ImmortalOverload +477,MorphToRavager +478,MorphToLurker +479,OraclePhaseShift +480,ReleaseInterceptors +481,RavagerCorrosiveBile +482,BurrowRavagerDown +483,BurrowRavagerUp +484,PurificationNova +485,Impale +486,LockOn +487,LockOnCancel +488,CorruptionBomb +489,Hyperjump +490,Overcharge +491,ThorAPMode +492,ThorNormalMode +493,LightofAiur +494,MothershipMassRecall +495,NydusWormTransport +496,OracleWeapon +497,PulsarBeam +498,PulsarCannon +499,VoidSwarmHostSpawnLocust +500,LocustMPFlyingMorphToGround +501,LocustMPMorphToAir +502,LocustMPFlyingSwoop +503,HallucinationDisruptor +504,HallucinationAdept +505,VoidRaySwarmDamageBoost +506,SeekerDummyChannel +507,AiurTempleBridgeNE8Out +508,AiurTempleBridgeNE8 +509,AiurTempleBridgeNE10Out +510,AiurTempleBridgeNE10 +511,AiurTempleBridgeNE12Out +512,AiurTempleBridgeNE12 +513,AiurTempleBridgeNW8Out +514,AiurTempleBridgeNW8 +515,AiurTempleBridgeNW10Out +516,AiurTempleBridgeNW10 +517,AiurTempleBridgeNW12Out +518,AiurTempleBridgeNW12 +519,VoidMPImmortalReviveRebuild +520,VoidMPImmortalReviveDeath +521,ArbiterMPStasisField +522,ArbiterMPRecall +523,CorsairMPDisruptionWeb +524,MorphToGuardianMP +525,MorphToDevourerMP +526,DefilerMPConsume +527,DefilerMPDarkSwarm +528,DefilerMPPlague +529,DefilerMPBurrow +530,DefilerMPUnburrow +531,QueenMPEnsnare +532,QueenMPSpawnBroodlings +533,QueenMPInfestCommandCenter +534,LightningBomb +535,Grapple +536,OracleStasisTrap +537,OracleStasisTrapBuild +538,OracleStasisTrapActivate +539,SelfRepair +540,ParasiticBomb +541,AdeptPhaseShift +542,PurificationNovaMorph +543,PurificationNovaMorphBack +544,LurkerHoldFire +545,LurkerRemoveHoldFire +546,LiberatorMorphtoAG +547,LiberatorMorphtoAA +548,LiberatorAGTarget +549,LiberatorAATarget +550,TimeStop +551,KD8Charge +552,AdeptPhaseShiftCancel +553,AdeptShadePhaseShiftCancel +557,LaunchInterceptors +558,SpawnLocustsTargeted +559,LocustMPFlyingSwoopAttack +560,MorphToTransportOverlord +561,BypassArmor +562,BypassArmorDroneCU +563,ChannelSnipe +564,LockOnAir +565,PurificationNovaTargetted diff --git a/sc2reader/data/LotV/base_units.csv b/sc2reader/data/LotV/base_units.csv index 1e2b8e9d..40b710c5 100755 --- a/sc2reader/data/LotV/base_units.csv +++ b/sc2reader/data/LotV/base_units.csv @@ -1,521 +1,654 @@ 1,System_Snapshot_Dummy -5,BeaconRally -6,BeaconArmy -7,BeaconAttack -8,BeaconDefend -9,BeaconHarass -10,BeaconIdle -11,BeaconAuto -12,BeaconDetect -13,BeaconScout -14,BeaconClaim -15,BeaconExpand -16,BeaconCustom1 -17,BeaconCustom2 -18,BeaconCustom3 -19,BeaconCustom4 -22,DESTRUCTIBLE -23,ITEM -24,POWERUP -25,SMCAMERA -26,SMCHARACTER -27,STARMAP -28,SMSET -29,MISSILE -30,MISSILE_INVULNERABLE -31,MISSILE_HALFLIFE -32,PLACEHOLDER -33,PLACEHOLDER_AIR -34,PATHINGBLOCKER -35,BEACON -36,Ball -37,StereoscopicOptionsUnit -38,Colossus -39,TechLab -40,Reactor -42,InfestorTerran -43,BanelingCocoon -44,Baneling -45,Mothership -46,PointDefenseDrone -47,Changeling -48,ChangelingZealot -49,ChangelingMarineShield -50,ChangelingMarine -51,ChangelingZerglingWings -52,ChangelingZergling -54,CommandCenter -55,SupplyDepot -56,Refinery -57,Barracks -58,EngineeringBay -59,MissileTurret -60,Bunker -61,SensorTower -62,GhostAcademy -63,Factory -64,Starport -66,Armory -67,FusionCore -68,AutoTurret -69,SiegeTankSieged -70,SiegeTank -71,VikingAssault -72,VikingFighter -73,CommandCenterFlying -74,BarracksTechLab -75,BarracksReactor -76,FactoryTechLab -77,FactoryReactor -78,StarportTechLab -79,StarportReactor -80,FactoryFlying -81,StarportFlying -82,SCV -83,BarracksFlying -84,SupplyDepotLowered -85,Marine -86,Reaper -87,Ghost -88,Marauder -89,Thor -90,Hellion -91,Medivac -92,Banshee -93,Raven -94,Battlecruiser -95,Nuke -96,Nexus -97,Pylon -98,Assimilator -99,Gateway -100,Forge -101,FleetBeacon -102,TwilightCouncil -103,PhotonCannon -104,Stargate -105,TemplarArchive -106,DarkShrine -107,RoboticsBay -108,RoboticsFacility -109,CyberneticsCore -110,Zealot -111,Stalker -112,HighTemplar -113,DarkTemplar -114,Sentry -115,Phoenix -116,Carrier -117,VoidRay -118,WarpPrism -119,Observer -120,Immortal -121,Probe -122,Interceptor -123,Hatchery -124,CreepTumor -125,Extractor -126,SpawningPool -127,EvolutionChamber -128,HydraliskDen -129,Spire -130,UltraliskCavern -131,InfestationPit -132,NydusNetwork -133,BanelingNest -134,RoachWarren -135,SpineCrawler -136,SporeCrawler -137,Lair -138,Hive -139,GreaterSpire -140,Egg -141,Drone -142,Zergling -143,Overlord -144,Hydralisk -145,Mutalisk -146,Ultralisk -147,Roach -148,Infestor -149,Corruptor -150,BroodLordCocoon -151,BroodLord -152,BanelingBurrowed -153,DroneBurrowed -154,HydraliskBurrowed -155,RoachBurrowed -156,ZerglingBurrowed -157,InfestorTerranBurrowed -158,RedstoneLavaCritterBurrowed -159,RedstoneLavaCritterInjuredBurrowed -160,RedstoneLavaCritter -161,RedstoneLavaCritterInjured -162,QueenBurrowed -163,Queen -164,InfestorBurrowed -165,OverlordCocoon -166,Overseer -167,PlanetaryFortress -168,UltraliskBurrowed -169,OrbitalCommand -170,WarpGate -171,OrbitalCommandFlying -172,ForceField -173,WarpPrismPhasing -174,CreepTumorBurrowed -175,CreepTumorQueen -176,SpineCrawlerUprooted -177,SporeCrawlerUprooted -178,Archon -179,NydusCanal -180,BroodlingEscort -181,RichMineralField -183,XelNagaTower -187,InfestedTerransEgg -188,Larva -189,ReaperPlaceholder -190,NeedleSpinesWeapon -191,CorruptionWeapon -192,InfestedTerransWeapon -193,NeuralParasiteWeapon -194,PointDefenseDroneReleaseWeapon -195,HunterSeekerWeapon -196,MULE -198,ThorAAWeapon -199,PunisherGrenadesLMWeapon -200,VikingFighterWeapon -201,ATALaserBatteryLMWeapon -202,ATSLaserBatteryLMWeapon -203,LongboltMissileWeapon -204,D8ChargeWeapon -205,YamatoWeapon -206,IonCannonsWeapon -207,AcidSalivaWeapon -208,SpineCrawlerWeapon -209,SporeCrawlerWeapon -210,GlaiveWurmWeapon -211,GlaiveWurmM2Weapon -212,GlaiveWurmM3Weapon -213,StalkerWeapon -214,EMP2Weapon -215,BacklashRocketsLMWeapon -216,PhotonCannonWeapon -217,ParasiteSporeWeapon -219,Broodling -220,BroodLordBWeapon -223,AutoTurretReleaseWeapon -224,LarvaReleaseMissile -225,AcidSpinesWeapon -226,FrenzyWeapon -227,ContaminateWeapon -228,BroodlingDefault -229,Critter -230,CritterStationary -231,Shape -232,FungalGrowthMissile -233,NeuralParasiteTentacleMissile -234,Beacon_Protoss -235,Beacon_ProtossSmall -236,Beacon_Terran -237,Beacon_TerranSmall -238,Beacon_Zerg -239,Beacon_ZergSmall -240,Lyote -241,CarrionBird -242,KarakMale -243,KarakFemale -244,UrsadakFemaleExotic -245,UrsadakMale -246,UrsadakFemale -247,UrsadakCalf -248,UrsadakMaleExotic -249,UtilityBot -250,CommentatorBot1 -251,CommentatorBot2 -252,CommentatorBot3 -253,CommentatorBot4 -254,Scantipede -255,Dog -256,Sheep -257,Cow -258,InfestedTerransEggPlacement -259,InfestorTerransWeapon -260,MineralField -261,VespeneGeyser -262,SpacePlatformGeyser -263,RichVespeneGeyser -264,DestructibleSearchlight -265,DestructibleBullhornLights -266,DestructibleStreetlight -267,DestructibleSpacePlatformSign -268,DestructibleStoreFrontCityProps -269,DestructibleBillboardTall -270,DestructibleBillboardScrollingText -271,DestructibleSpacePlatformBarrier -272,DestructibleSignsDirectional -273,DestructibleSignsConstruction -274,DestructibleSignsFunny -275,DestructibleSignsIcons -276,DestructibleSignsWarning -277,DestructibleGarage -278,DestructibleGarageLarge -279,DestructibleTrafficSignal -280,TrafficSignal -281,BraxisAlphaDestructible1x1 -282,BraxisAlphaDestructible2x2 -283,DestructibleDebris4x4 -284,DestructibleDebris6x6 -285,DestructibleRock2x4Vertical -286,DestructibleRock2x4Horizontal -287,DestructibleRock2x6Vertical -288,DestructibleRock2x6Horizontal -289,DestructibleRock4x4 -290,DestructibleRock6x6 -291,DestructibleRampDiagonalHugeULBR -292,DestructibleRampDiagonalHugeBLUR -293,DestructibleRampVerticalHuge -294,DestructibleRampHorizontalHuge -295,DestructibleDebrisRampDiagonalHugeULBR -296,DestructibleDebrisRampDiagonalHugeBLUR -297,MengskStatueAlone -298,MengskStatue -299,WolfStatue -300,GlobeStatue -301,Weapon -302,GlaiveWurmBounceWeapon -303,BroodLordWeapon -304,BroodLordAWeapon -305,CreepBlocker1x1 -306,PathingBlocker1x1 -307,PathingBlocker2x2 -308,AutoTestAttackTargetGround -309,AutoTestAttackTargetAir -310,AutoTestAttacker -311,HelperEmitterSelectionArrow -312,MultiKillObject -313,ShapeGolfball -314,ShapeCone -315,ShapeCube -316,ShapeCylinder -317,ShapeDodecahedron -318,ShapeIcosahedron -319,ShapeOctahedron -320,ShapePyramid -321,ShapeRoundedCube -322,ShapeSphere -323,ShapeTetrahedron -324,ShapeThickTorus -325,ShapeThinTorus -326,ShapeTorus -327,Shape4PointStar -328,Shape5PointStar -329,Shape6PointStar -330,Shape8PointStar -331,ShapeArrowPointer -332,ShapeBowl -333,ShapeBox -334,ShapeCapsule -335,ShapeCrescentMoon -336,ShapeDecahedron -337,ShapeDiamond -338,ShapeFootball -339,ShapeGemstone -340,ShapeHeart -341,ShapeJack -342,ShapePlusSign -343,ShapeShamrock -344,ShapeSpade -345,ShapeTube -346,ShapeEgg -347,ShapeYenSign -348,ShapeX -349,ShapeWatermelon -350,ShapeWonSign -351,ShapeTennisball -352,ShapeStrawberry -353,ShapeSmileyFace -354,ShapeSoccerball -355,ShapeRainbow -356,ShapeSadFace -357,ShapePoundSign -358,ShapePear -359,ShapePineapple -360,ShapeOrange -361,ShapePeanut -362,ShapeO -363,ShapeLemon -364,ShapeMoneyBag -365,ShapeHorseshoe -366,ShapeHockeyStick -367,ShapeHockeyPuck -368,ShapeHand -369,ShapeGolfClub -370,ShapeGrape -371,ShapeEuroSign -372,ShapeDollarSign -373,ShapeBasketball -374,ShapeCarrot -375,ShapeCherry -376,ShapeBaseball -377,ShapeBaseballBat -378,ShapeBanana -379,ShapeApple -380,ShapeCashLarge -381,ShapeCashMedium -382,ShapeCashSmall -383,ShapeFootballColored -384,ShapeLemonSmall -385,ShapeOrangeSmall -386,ShapeTreasureChestOpen -387,ShapeTreasureChestClosed -388,ShapeWatermelonSmall -389,UnbuildableRocksDestructible -390,UnbuildableBricksDestructible -391,UnbuildablePlatesDestructible -407,HellionTank -408,CollapsibleTerranTowerDebris -409,DebrisRampLeft -410,DebrisRampRight -411,MothershipCore -415,LocustMP -416,CollapsibleRockTowerDebris -417,NydusCanalAttacker -418,NydusCanalCreeper -419,SwarmHostBurrowedMP -420,SwarmHostMP -421,Oracle -422,Tempest -423,WarHound -424,WidowMine -425,Viper -426,WidowMineBurrowed -427,LurkerMPEgg -428,LurkerMP -429,LurkerMPBurrowed -430,LurkerDenMP -431,ExtendingBridgeNEWide8Out -432,ExtendingBridgeNEWide8 -433,ExtendingBridgeNWWide8Out -434,ExtendingBridgeNWWide8 -435,ExtendingBridgeNEWide10Out -436,ExtendingBridgeNEWide10 -437,ExtendingBridgeNWWide10Out -438,ExtendingBridgeNWWide10 -439,ExtendingBridgeNEWide12Out -440,ExtendingBridgeNEWide12 -441,ExtendingBridgeNWWide12Out -442,ExtendingBridgeNWWide12 -444,CollapsibleRockTowerDebrisRampRight -445,CollapsibleRockTowerDebrisRampLeft -447,CollapsibleTerranTowerPushUnitRampLeft -448,CollapsibleTerranTowerPushUnitRampRight -451,CollapsibleRockTowerPushUnit -452,CollapsibleTerranTowerPushUnit -453,CollapsibleRockTowerPushUnitRampRight -454,CollapsibleRockTowerPushUnitRampLeft -455,DigesterCreepSprayTargetUnit -456,DigesterCreepSprayUnit -457,NydusCanalAttackerWeapon -458,ViperConsumeStructureWeapon -461,ResourceBlocker -462,TempestWeapon -463,YoinkMissile -465,YoinkVikingAirMissile -467,YoinkVikingGroundMissile -469,WarHoundWeapon -471,EyeStalkWeapon -474,WidowMineWeapon -475,WidowMineAirWeapon -476,MothershipCoreWeaponWeapon -477,TornadoMissileWeapon -478,TornadoMissileDummyWeapon -479,TalonsMissileWeapon -480,CreepTumorMissile -481,LocustMPEggAMissileWeapon -482,LocustMPEggBMissileWeapon -483,LocustMPWeapon -485,RepulsorCannonWeapon -486,ExtendingBridge -487,PhysicsPrimitiveParent -488,CollapsibleRockTowerDiagonal -489,CollapsibleTerranTowerDiagonal -490,CollapsibleTerranTowerRampLeft -491,CollapsibleTerranTowerRampRight -492,IceProtossCrates -493,ProtossCrates -494,TowerMine -495,PickupPalletGas -496,PickupPalletMinerals -497,PickupScrapSalvage1x1 -498,PickupScrapSalvage2x2 -499,PickupScrapSalvage3x3 -500,RoughTerrain -501,UnbuildableBricksSmallUnit -502,UnbuildablePlatesSmallUnit -503,UnbuildablePlatesUnit -504,UnbuildableRocksSmallUnit -505,XelNagaHealingShrine -506,InvisibleTargetDummy -507,ProtossVespeneGeyser -508,CollapsibleRockTower -509,CollapsibleTerranTower -510,ThornLizard -511,CleaningBot -512,DestructibleRock6x6Weak -513,ProtossSnakeSegmentDemo -514,PhysicsCapsule -515,PhysicsCube -516,PhysicsCylinder -517,PhysicsKnot -518,PhysicsL -519,PhysicsPrimitives -520,PhysicsSphere -521,PhysicsStar -522,CreepBlocker4x4 -523,DestructibleCityDebris2x4Vertical -524,DestructibleCityDebris2x4Horizontal -525,DestructibleCityDebris2x6Vertical -526,DestructibleCityDebris2x6Horizontal -527,DestructibleCityDebris4x4 -528,DestructibleCityDebris6x6 -529,DestructibleCityDebrisHugeDiagonalBLUR -530,DestructibleCityDebrisHugeDiagonalULBR -531,TestZerg -532,PathingBlockerRadius1 -533,DestructibleRockEx12x4Vertical -534,DestructibleRockEx12x4Horizontal -535,DestructibleRockEx12x6Vertical -536,DestructibleRockEx12x6Horizontal -537,DestructibleRockEx14x4 -538,DestructibleRockEx16x6 -539,DestructibleRockEx1DiagonalHugeULBR -540,DestructibleRockEx1DiagonalHugeBLUR -541,DestructibleRockEx1VerticalHuge -542,DestructibleRockEx1HorizontalHuge -543,DestructibleIce2x4Vertical -544,DestructibleIce2x4Horizontal -545,DestructibleIce2x6Vertical -546,DestructibleIce2x6Horizontal -547,DestructibleIce4x4 -548,DestructibleIce6x6 -549,DestructibleIceDiagonalHugeULBR -550,DestructibleIceDiagonalHugeBLUR -551,DestructibleIceVerticalHuge -552,DestructibleIceHorizontalHuge -553,DesertPlanetSearchlight -554,DesertPlanetStreetlight -555,UnbuildableBricksUnit -556,UnbuildableRocksUnit -557,ZerusDestructibleArch -558,Artosilope -559,Anteplott -560,LabBot -561,Crabeetle -562,CollapsibleRockTowerRampRight -563,CollapsibleRockTowerRampLeft -564,LabMineralField -580,ThorAALance -581,OracleWeapon -582,TempestWeaponGround -583,SeekerMissile +7,DESTRUCTIBLE +8,ITEM +9,POWERUP +10,SMCAMERA +11,SMCHARACTER +12,STARMAP +13,SMSET +14,MISSILE +15,MISSILE_INVULNERABLE +16,MISSILE_HALFLIFE +17,PLACEHOLDER +18,PLACEHOLDER_AIR +19,PATHINGBLOCKER +20,BEACON +21,Ball +22,StereoscopicOptionsUnit +23,Colossus +24,TechLab +25,Reactor +27,InfestorTerran +28,BanelingCocoon +29,Baneling +30,Mothership +31,PointDefenseDrone +32,Changeling +33,ChangelingZealot +34,ChangelingMarineShield +35,ChangelingMarine +36,ChangelingZerglingWings +37,ChangelingZergling +39,CommandCenter +40,SupplyDepot +41,Refinery +42,Barracks +43,EngineeringBay +44,MissileTurret +45,Bunker +46,SensorTower +47,GhostAcademy +48,Factory +49,Starport +51,Armory +52,FusionCore +53,AutoTurret +54,SiegeTankSieged +55,SiegeTank +56,VikingAssault +57,VikingFighter +58,CommandCenterFlying +59,BarracksTechLab +60,BarracksReactor +61,FactoryTechLab +62,FactoryReactor +63,StarportTechLab +64,StarportReactor +65,FactoryFlying +66,StarportFlying +67,SCV +68,BarracksFlying +69,SupplyDepotLowered +70,Marine +71,Reaper +72,Ghost +73,Marauder +74,Thor +75,Hellion +76,Medivac +77,Banshee +78,Raven +79,Battlecruiser +80,Nuke +81,Nexus +82,Pylon +83,Assimilator +84,Gateway +85,Forge +86,FleetBeacon +87,TwilightCouncil +88,PhotonCannon +89,Stargate +90,TemplarArchive +91,DarkShrine +92,RoboticsBay +93,RoboticsFacility +94,CyberneticsCore +95,Zealot +96,Stalker +97,HighTemplar +98,DarkTemplar +99,Sentry +100,Phoenix +101,Carrier +102,VoidRay +103,WarpPrism +104,Observer +105,Immortal +106,Probe +107,Interceptor +108,Hatchery +109,CreepTumor +110,Extractor +111,SpawningPool +112,EvolutionChamber +113,HydraliskDen +114,Spire +115,UltraliskCavern +116,InfestationPit +117,NydusNetwork +118,BanelingNest +119,RoachWarren +120,SpineCrawler +121,SporeCrawler +122,Lair +123,Hive +124,GreaterSpire +125,Egg +126,Drone +127,Zergling +128,Overlord +129,Hydralisk +130,Mutalisk +131,Ultralisk +132,Roach +133,Infestor +134,Corruptor +135,BroodLordCocoon +136,BroodLord +137,BanelingBurrowed +138,DroneBurrowed +139,HydraliskBurrowed +140,RoachBurrowed +141,ZerglingBurrowed +142,InfestorTerranBurrowed +143,RedstoneLavaCritterBurrowed +144,RedstoneLavaCritterInjuredBurrowed +145,RedstoneLavaCritter +146,RedstoneLavaCritterInjured +147,QueenBurrowed +148,Queen +149,InfestorBurrowed +150,OverlordCocoon +151,Overseer +152,PlanetaryFortress +153,UltraliskBurrowed +154,OrbitalCommand +155,WarpGate +156,OrbitalCommandFlying +157,ForceField +158,WarpPrismPhasing +159,CreepTumorBurrowed +160,CreepTumorQueen +161,SpineCrawlerUprooted +162,SporeCrawlerUprooted +163,Archon +164,NydusCanal +165,BroodlingEscort +166,RichMineralField +168,XelNagaTower +172,InfestedTerransEgg +173,Larva +174,ReaperPlaceholder +185,Cyclone +187,HellionTank +208,NeedleSpinesWeapon +209,CorruptionWeapon +210,InfestedTerransWeapon +211,NeuralParasiteWeapon +212,PointDefenseDroneReleaseWeapon +213,HunterSeekerWeapon +214,MULE +216,ThorAAWeapon +217,PunisherGrenadesLMWeapon +218,VikingFighterWeapon +219,ATALaserBatteryLMWeapon +220,ATSLaserBatteryLMWeapon +221,LongboltMissileWeapon +222,D8ChargeWeapon +223,YamatoWeapon +224,IonCannonsWeapon +225,AcidSalivaWeapon +226,SpineCrawlerWeapon +227,SporeCrawlerWeapon +228,GlaiveWurmWeapon +229,GlaiveWurmM2Weapon +230,GlaiveWurmM3Weapon +231,StalkerWeapon +232,EMP2Weapon +233,BacklashRocketsLMWeapon +234,PhotonCannonWeapon +235,ParasiteSporeWeapon +237,Broodling +238,BroodLordBWeapon +241,AutoTurretReleaseWeapon +242,LarvaReleaseMissile +243,AcidSpinesWeapon +244,FrenzyWeapon +245,ContaminateWeapon +253,BeaconRally +254,BeaconArmy +255,BeaconAttack +256,BeaconDefend +257,BeaconHarass +258,BeaconIdle +259,BeaconAuto +260,BeaconDetect +261,BeaconScout +262,BeaconClaim +263,BeaconExpand +264,BeaconCustom1 +265,BeaconCustom2 +266,BeaconCustom3 +267,BeaconCustom4 +268,BroodlingDefault +269,Critter +270,CritterStationary +271,Shape +272,Rocks2x2NonConjoined +273,FungalGrowthMissile +274,NeuralParasiteTentacleMissile +275,Beacon_Protoss +276,Beacon_ProtossSmall +277,Beacon_Terran +278,Beacon_TerranSmall +279,Beacon_Zerg +280,Beacon_ZergSmall +281,Lyote +282,CarrionBird +283,KarakMale +284,KarakFemale +285,UrsadakFemaleExotic +286,UrsadakMale +287,UrsadakFemale +288,UrsadakCalf +289,UrsadakMaleExotic +290,UtilityBot +291,CommentatorBot1 +292,CommentatorBot2 +293,CommentatorBot3 +294,CommentatorBot4 +295,Scantipede +296,Dog +297,Sheep +298,Cow +299,InfestedTerransEggPlacement +300,InfestorTerransWeapon +301,MineralField +302,VespeneGeyser +303,SpacePlatformGeyser +304,RichVespeneGeyser +305,DestructibleSearchlight +306,DestructibleBullhornLights +307,DestructibleStreetlight +308,DestructibleSpacePlatformSign +309,DestructibleStoreFrontCityProps +310,DestructibleBillboardTall +311,DestructibleBillboardScrollingText +312,DestructibleSpacePlatformBarrier +313,DestructibleSignsDirectional +314,DestructibleSignsConstruction +315,DestructibleSignsFunny +316,DestructibleSignsIcons +317,DestructibleSignsWarning +318,DestructibleGarage +319,DestructibleGarageLarge +320,DestructibleTrafficSignal +321,TrafficSignal +322,BraxisAlphaDestructible1x1 +323,BraxisAlphaDestructible2x2 +324,DestructibleDebris4x4 +325,DestructibleDebris6x6 +326,DestructibleRock2x4Vertical +327,DestructibleRock2x4Horizontal +328,DestructibleRock2x6Vertical +329,DestructibleRock2x6Horizontal +330,DestructibleRock4x4 +331,DestructibleRock6x6 +332,DestructibleRampDiagonalHugeULBR +333,DestructibleRampDiagonalHugeBLUR +334,DestructibleRampVerticalHuge +335,DestructibleRampHorizontalHuge +336,DestructibleDebrisRampDiagonalHugeULBR +337,DestructibleDebrisRampDiagonalHugeBLUR +338,OverlordGenerateCreepKeybind +339,MengskStatueAlone +340,MengskStatue +341,WolfStatue +342,GlobeStatue +343,Weapon +344,GlaiveWurmBounceWeapon +345,BroodLordWeapon +346,BroodLordAWeapon +347,CreepBlocker1x1 +348,PathingBlocker1x1 +349,PathingBlocker2x2 +350,AutoTestAttackTargetGround +351,AutoTestAttackTargetAir +352,AutoTestAttacker +353,HelperEmitterSelectionArrow +354,MultiKillObject +355,ShapeGolfball +356,ShapeCone +357,ShapeCube +358,ShapeCylinder +359,ShapeDodecahedron +360,ShapeIcosahedron +361,ShapeOctahedron +362,ShapePyramid +363,ShapeRoundedCube +364,ShapeSphere +365,ShapeTetrahedron +366,ShapeThickTorus +367,ShapeThinTorus +368,ShapeTorus +369,Shape4PointStar +370,Shape5PointStar +371,Shape6PointStar +372,Shape8PointStar +373,ShapeArrowPointer +374,ShapeBowl +375,ShapeBox +376,ShapeCapsule +377,ShapeCrescentMoon +378,ShapeDecahedron +379,ShapeDiamond +380,ShapeFootball +381,ShapeGemstone +382,ShapeHeart +383,ShapeJack +384,ShapePlusSign +385,ShapeShamrock +386,ShapeSpade +387,ShapeTube +388,ShapeEgg +389,ShapeYenSign +390,ShapeX +391,ShapeWatermelon +392,ShapeWonSign +393,ShapeTennisball +394,ShapeStrawberry +395,ShapeSmileyFace +396,ShapeSoccerball +397,ShapeRainbow +398,ShapeSadFace +399,ShapePoundSign +400,ShapePear +401,ShapePineapple +402,ShapeOrange +403,ShapePeanut +404,ShapeO +405,ShapeLemon +406,ShapeMoneyBag +407,ShapeHorseshoe +408,ShapeHockeyStick +409,ShapeHockeyPuck +410,ShapeHand +411,ShapeGolfClub +412,ShapeGrape +413,ShapeEuroSign +414,ShapeDollarSign +415,ShapeBasketball +416,ShapeCarrot +417,ShapeCherry +418,ShapeBaseball +419,ShapeBaseballBat +420,ShapeBanana +421,ShapeApple +422,ShapeCashLarge +423,ShapeCashMedium +424,ShapeCashSmall +425,ShapeFootballColored +426,ShapeLemonSmall +427,ShapeOrangeSmall +428,ShapeTreasureChestOpen +429,ShapeTreasureChestClosed +430,ShapeWatermelonSmall +431,UnbuildableRocksDestructible +432,UnbuildableBricksDestructible +433,UnbuildablePlatesDestructible +434,Debris2x2NonConjoined +435,EnemyPathingBlocker1x1 +436,EnemyPathingBlocker2x2 +437,EnemyPathingBlocker4x4 +438,EnemyPathingBlocker8x8 +439,EnemyPathingBlocker16x16 +440,ScopeTest +456,CollapsibleTerranTowerDebris +457,DebrisRampLeft +458,DebrisRampRight +459,MothershipCore +463,LocustMP +464,CollapsibleRockTowerDebris +465,NydusCanalAttacker +466,NydusCanalCreeper +467,SwarmHostBurrowedMP +468,SwarmHostMP +469,Oracle +470,Tempest +471,WarHound +472,WidowMine +473,Viper +474,WidowMineBurrowed +475,LurkerMPEgg +476,LurkerMP +477,LurkerMPBurrowed +478,LurkerDenMP +479,ExtendingBridgeNEWide8Out +480,ExtendingBridgeNEWide8 +481,ExtendingBridgeNWWide8Out +482,ExtendingBridgeNWWide8 +483,ExtendingBridgeNEWide10Out +484,ExtendingBridgeNEWide10 +485,ExtendingBridgeNWWide10Out +486,ExtendingBridgeNWWide10 +487,ExtendingBridgeNEWide12Out +488,ExtendingBridgeNEWide12 +489,ExtendingBridgeNWWide12Out +490,ExtendingBridgeNWWide12 +492,CollapsibleRockTowerDebrisRampRight +493,CollapsibleRockTowerDebrisRampLeft +494,XelNaga_Caverns_DoorE +495,XelNaga_Caverns_DoorEOpened +496,XelNaga_Caverns_DoorN +497,XelNaga_Caverns_DoorNE +498,XelNaga_Caverns_DoorNEOpened +499,XelNaga_Caverns_DoorNOpened +500,XelNaga_Caverns_DoorNW +501,XelNaga_Caverns_DoorNWOpened +502,XelNaga_Caverns_DoorS +503,XelNaga_Caverns_DoorSE +504,XelNaga_Caverns_DoorSEOpened +505,XelNaga_Caverns_DoorSOpened +506,XelNaga_Caverns_DoorSW +507,XelNaga_Caverns_DoorSWOpened +508,XelNaga_Caverns_DoorW +509,XelNaga_Caverns_DoorWOpened +510,XelNaga_Caverns_Floating_BridgeNE8Out +511,XelNaga_Caverns_Floating_BridgeNE8 +512,XelNaga_Caverns_Floating_BridgeNW8Out +513,XelNaga_Caverns_Floating_BridgeNW8 +514,XelNaga_Caverns_Floating_BridgeNE10Out +515,XelNaga_Caverns_Floating_BridgeNE10 +516,XelNaga_Caverns_Floating_BridgeNW10Out +517,XelNaga_Caverns_Floating_BridgeNW10 +518,XelNaga_Caverns_Floating_BridgeNE12Out +519,XelNaga_Caverns_Floating_BridgeNE12 +520,XelNaga_Caverns_Floating_BridgeNW12Out +521,XelNaga_Caverns_Floating_BridgeNW12 +522,XelNaga_Caverns_Floating_BridgeH8Out +523,XelNaga_Caverns_Floating_BridgeH8 +524,XelNaga_Caverns_Floating_BridgeV8Out +525,XelNaga_Caverns_Floating_BridgeV8 +526,XelNaga_Caverns_Floating_BridgeH10Out +527,XelNaga_Caverns_Floating_BridgeH10 +528,XelNaga_Caverns_Floating_BridgeV10Out +529,XelNaga_Caverns_Floating_BridgeV10 +530,XelNaga_Caverns_Floating_BridgeH12Out +531,XelNaga_Caverns_Floating_BridgeH12 +532,XelNaga_Caverns_Floating_BridgeV12Out +533,XelNaga_Caverns_Floating_BridgeV12 +536,CollapsibleTerranTowerPushUnitRampLeft +537,CollapsibleTerranTowerPushUnitRampRight +540,CollapsibleRockTowerPushUnit +541,CollapsibleTerranTowerPushUnit +542,CollapsibleRockTowerPushUnitRampRight +543,CollapsibleRockTowerPushUnitRampLeft +544,DigesterCreepSprayTargetUnit +545,DigesterCreepSprayUnit +546,NydusCanalAttackerWeapon +547,ViperConsumeStructureWeapon +550,ResourceBlocker +551,TempestWeapon +552,YoinkMissile +556,YoinkVikingAirMissile +558,YoinkVikingGroundMissile +560,YoinkSiegeTankMissile +562,WarHoundWeapon +564,EyeStalkWeapon +567,WidowMineWeapon +568,WidowMineAirWeapon +569,MothershipCoreWeaponWeapon +570,TornadoMissileWeapon +571,TornadoMissileDummyWeapon +572,TalonsMissileWeapon +573,CreepTumorMissile +574,LocustMPEggAMissileWeapon +575,LocustMPEggBMissileWeapon +576,LocustMPWeapon +578,RepulsorCannonWeapon +579,ExtendingBridge +580,PhysicsPrimitiveParent +581,XelNaga_Caverns_Door +582,CollapsibleRockTowerDiagonal +583,CollapsibleTerranTowerDiagonal +584,CollapsibleTerranTowerRampLeft +585,CollapsibleTerranTowerRampRight +586,Ice2x2NonConjoined +587,IceProtossCrates +588,ProtossCrates +589,TowerMine +590,PickupPalletGas +591,PickupPalletMinerals +592,PickupScrapSalvage1x1 +593,PickupScrapSalvage2x2 +594,PickupScrapSalvage3x3 +595,RoughTerrain +596,UnbuildableBricksSmallUnit +597,UnbuildablePlatesSmallUnit +598,UnbuildablePlatesUnit +599,UnbuildableRocksSmallUnit +600,XelNagaHealingShrine +601,InvisibleTargetDummy +602,ProtossVespeneGeyser +603,CollapsibleRockTower +604,CollapsibleTerranTower +605,ThornLizard +606,CleaningBot +607,DestructibleRock6x6Weak +608,ProtossSnakeSegmentDemo +609,PhysicsCapsule +610,PhysicsCube +611,PhysicsCylinder +612,PhysicsKnot +613,PhysicsL +614,PhysicsPrimitives +615,PhysicsSphere +616,PhysicsStar +617,CreepBlocker4x4 +618,DestructibleCityDebris2x4Vertical +619,DestructibleCityDebris2x4Horizontal +620,DestructibleCityDebris2x6Vertical +621,DestructibleCityDebris2x6Horizontal +622,DestructibleCityDebris4x4 +623,DestructibleCityDebris6x6 +624,DestructibleCityDebrisHugeDiagonalBLUR +625,DestructibleCityDebrisHugeDiagonalULBR +626,TestZerg +627,PathingBlockerRadius1 +628,DestructibleRockEx12x4Vertical +629,DestructibleRockEx12x4Horizontal +630,DestructibleRockEx12x6Vertical +631,DestructibleRockEx12x6Horizontal +632,DestructibleRockEx14x4 +633,DestructibleRockEx16x6 +634,DestructibleRockEx1DiagonalHugeULBR +635,DestructibleRockEx1DiagonalHugeBLUR +636,DestructibleRockEx1VerticalHuge +637,DestructibleRockEx1HorizontalHuge +638,DestructibleIce2x4Vertical +639,DestructibleIce2x4Horizontal +640,DestructibleIce2x6Vertical +641,DestructibleIce2x6Horizontal +642,DestructibleIce4x4 +643,DestructibleIce6x6 +644,DestructibleIceDiagonalHugeULBR +645,DestructibleIceDiagonalHugeBLUR +646,DestructibleIceVerticalHuge +647,DestructibleIceHorizontalHuge +648,DesertPlanetSearchlight +649,DesertPlanetStreetlight +650,UnbuildableBricksUnit +651,UnbuildableRocksUnit +652,ZerusDestructibleArch +653,Artosilope +654,Anteplott +655,LabBot +656,Crabeetle +657,CollapsibleRockTowerRampRight +658,CollapsibleRockTowerRampLeft +659,LabMineralField +675,RavagerCocoon +676,Ravager +677,RavagerBurrowed +679,ThorAP +680,LocustMPFlying +681,Disruptor +682,Adept +683,AiurTempleBridgeNE8Out +685,AiurTempleBridgeNE10Out +687,AiurTempleBridgeNE12Out +689,AiurTempleBridgeNW8Out +691,AiurTempleBridgeNW10Out +693,AiurTempleBridgeNW12Out +695,VoidMPImmortalReviveCorpse +696,GuardianCocoonMP +697,GuardianMP +698,DevourerCocoonMP +699,DevourerMP +700,DefilerMPBurrowed +701,DefilerMP +702,OracleStasisTrap +703,DisruptorPhased +704,LiberatorAG +705,Liberator +709,LocustMPPrecursor +710,ReleaseInterceptorsBeacon +711,AdeptPhaseShift +712,RavagerCorrosiveBileMissile +713,HydraliskImpaleMissile +714,CycloneMissile +715,ThorAALance +716,OracleWeapon +717,TempestWeaponGround +718,RavagerWeaponMissile +719,ScoutMPAirWeaponLeft +720,ScoutMPAirWeaponRight +721,ArbiterMPWeaponMissile +722,GuardianMPWeapon +723,DevourerMPWeaponMissile +724,QueenMPEnsnareMissile +725,QueenMPSpawnBroodlingsMissile +726,LightningBombWeapon +727,HERCPlacement +728,GrappleWeapon +731,CausticSprayMissile +732,ParasiticBombMissile +733,ParasiticBombDummy +734,AdeptWeapon +735,AdeptUpgradeWeapon +736,LiberatorMissile +737,LiberatorDamageMissile +738,LiberatorAGMissile +739,KD8Charge +740,KD8ChargeWeapon +742,XelNagaDestructibleRampBlocker +743,HERC +744,SeekerMissile +746,FlyoverUnit +747,ScoutMP +748,ScourgeMP +749,QueenMP +750,XelNagaDestructibleRampBlocker6S +751,XelNagaDestructibleRampBlocker6SE +752,XelNagaDestructibleRampBlocker6E +753,XelNagaDestructibleRampBlocker6NE +754,XelNagaDestructibleRampBlocker6N +755,XelNagaDestructibleRampBlocker6NW +756,XelNagaDestructibleRampBlocker6W +757,XelNagaDestructibleRampBlocker6SW +758,XelNagaDestructibleRampBlocker8S +759,XelNagaDestructibleRampBlocker8SE +760,XelNagaDestructibleRampBlocker8E +761,XelNagaDestructibleRampBlocker8NE +762,XelNagaDestructibleRampBlocker8N +763,XelNagaDestructibleRampBlocker8NW +764,XelNagaDestructibleRampBlocker8W +765,XelNagaDestructibleRampBlocker8SW +766,MineralField750 +767,RichMineralField750 +768,LabMineralField750 +769,TransportOverlordCocoon +770,OverlordTransport +771,BypassArmorDrone +772,CorrosiveParasiteWeapon diff --git a/sc2reader/data/ability_lookup.csv b/sc2reader/data/ability_lookup.csv index 20d1c59e..bec777b2 100755 --- a/sc2reader/data/ability_lookup.csv +++ b/sc2reader/data/ability_lookup.csv @@ -396,4 +396,128 @@ OracleWeapon,OracleWeapon,OracleWeaponOff,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, PulsarBeam,PulsarBeam,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, PulsarCannon,PulsarCannon,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, VoidRaySwarmDamageBoost,PrismaticAlignment,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -SeekerDummyChannel,SeekerDummyChannel,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, \ No newline at end of file +SeekerDummyChannel,SeekerDummyChannel,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +XelNaga_Caverns_DoorDefaultOpen,XelNaga_Caverns_DoorDefaultOpen +XelNaga_Caverns_DoorDefaultClose,XelNaga_Caverns_DoorDefaultClose +XelNaga_Caverns_DoorE,XelNaga_Caverns_DoorE +XelNaga_Caverns_DoorEOpened,XelNaga_Caverns_DoorEOpened +XelNaga_Caverns_DoorN,XelNaga_Caverns_DoorN +XelNaga_Caverns_DoorNE,XelNaga_Caverns_DoorNE +XelNaga_Caverns_DoorNEOpened,XelNaga_Caverns_DoorNEOpened +XelNaga_Caverns_DoorNOpened,XelNaga_Caverns_DoorNOpened +XelNaga_Caverns_DoorNW,XelNaga_Caverns_DoorNW +XelNaga_Caverns_DoorNWOpened,XelNaga_Caverns_DoorNWOpened +XelNaga_Caverns_DoorS,XelNaga_Caverns_DoorS +XelNaga_Caverns_DoorSE,XelNaga_Caverns_DoorSE +XelNaga_Caverns_DoorSEOpened,XelNaga_Caverns_DoorSEOpened +XelNaga_Caverns_DoorSOpened,XelNaga_Caverns_DoorSOpened +XelNaga_Caverns_DoorSW,XelNaga_Caverns_DoorSW +XelNaga_Caverns_DoorSWOpened,XelNaga_Caverns_DoorSWOpened +XelNaga_Caverns_DoorW,XelNaga_Caverns_DoorW +XelNaga_Caverns_DoorWOpened,XelNaga_Caverns_DoorWOpened +XelNaga_Caverns_Floating_BridgeNE8Out,XelNaga_Caverns_Floating_BridgeNE8Out +XelNaga_Caverns_Floating_BridgeNE8,XelNaga_Caverns_Floating_BridgeNE8 +XelNaga_Caverns_Floating_BridgeNW8Out,XelNaga_Caverns_Floating_BridgeNW8Out +XelNaga_Caverns_Floating_BridgeNW8,XelNaga_Caverns_Floating_BridgeNW8 +XelNaga_Caverns_Floating_BridgeNE10Out,XelNaga_Caverns_Floating_BridgeNE10Out +XelNaga_Caverns_Floating_BridgeNE10,XelNaga_Caverns_Floating_BridgeNE10 +XelNaga_Caverns_Floating_BridgeNW10Out,XelNaga_Caverns_Floating_BridgeNW10Out +XelNaga_Caverns_Floating_BridgeNW10,XelNaga_Caverns_Floating_BridgeNW10 +XelNaga_Caverns_Floating_BridgeNE12Out,XelNaga_Caverns_Floating_BridgeNE12Out +XelNaga_Caverns_Floating_BridgeNE12,XelNaga_Caverns_Floating_BridgeNE12 +XelNaga_Caverns_Floating_BridgeNW12Out,XelNaga_Caverns_Floating_BridgeNW12Out +XelNaga_Caverns_Floating_BridgeNW12,XelNaga_Caverns_Floating_BridgeNW12 +XelNaga_Caverns_Floating_BridgeH8Out,XelNaga_Caverns_Floating_BridgeH8Out +XelNaga_Caverns_Floating_BridgeH8,XelNaga_Caverns_Floating_BridgeH8 +XelNaga_Caverns_Floating_BridgeV8Out,XelNaga_Caverns_Floating_BridgeV8Out +XelNaga_Caverns_Floating_BridgeV8,XelNaga_Caverns_Floating_BridgeV8 +XelNaga_Caverns_Floating_BridgeH10Out,XelNaga_Caverns_Floating_BridgeH10Out +XelNaga_Caverns_Floating_BridgeH10,XelNaga_Caverns_Floating_BridgeH10 +XelNaga_Caverns_Floating_BridgeV10Out,XelNaga_Caverns_Floating_BridgeV10Out +XelNaga_Caverns_Floating_BridgeV10,XelNaga_Caverns_Floating_BridgeV10 +XelNaga_Caverns_Floating_BridgeH12Out,XelNaga_Caverns_Floating_BridgeH12Out +XelNaga_Caverns_Floating_BridgeH12,XelNaga_Caverns_Floating_BridgeH12 +XelNaga_Caverns_Floating_BridgeV12Out,XelNaga_Caverns_Floating_BridgeV12Out +XelNaga_Caverns_Floating_BridgeV12,XelNaga_Caverns_Floating_BridgeV12 +CausticSpray,CausticSpray +OracleCloakingFieldTargeted,OracleCloakingFieldTargeted +ImmortalOverload,ImmortalOverload +MorphToRavager,MorphToRavager +MorphToLurker,MorphToLurker +OraclePhaseShift,OraclePhaseShift +ReleaseInterceptors,ReleaseInterceptors +RavagerCorrosiveBile,RavagerCorrosiveBile +BurrowRavagerDown,BurrowRavagerDown +BurrowRavagerUp,BurrowRavagerUp +PurificationNova,PurificationNova +Impale,Impale +LockOn,LockOn +LockOnCancel,LockOnCancel +CorruptionBomb,CorruptionBomb +Hyperjump,Hyperjump +Overcharge,Overcharge +ThorAPMode,ThorAPMode +ThorNormalMode,ThorNormalMode +NydusWormTransport,NydusWormTransport +VoidSwarmHostSpawnLocust,VoidSwarmHostSpawnLocust +LocustMPFlyingMorphToGround,LocustMPFlyingMorphToGround +LocustMPMorphToAir,LocustMPMorphToAir +LocustMPFlyingSwoop,LocustMPFlyingSwoop +HallucinationDisruptor,HallucinationDisruptor +HallucinationAdept,HallucinationAdept +AiurTempleBridgeNE8Out,AiurTempleBridgeNE8Out +AiurTempleBridgeNE8,AiurTempleBridgeNE8 +AiurTempleBridgeNE10Out,AiurTempleBridgeNE10Out +AiurTempleBridgeNE10,AiurTempleBridgeNE10 +AiurTempleBridgeNE12Out,AiurTempleBridgeNE12Out +AiurTempleBridgeNE12,AiurTempleBridgeNE12 +AiurTempleBridgeNW8Out,AiurTempleBridgeNW8Out +AiurTempleBridgeNW8,AiurTempleBridgeNW8 +AiurTempleBridgeNW10Out,AiurTempleBridgeNW10Out +AiurTempleBridgeNW10,AiurTempleBridgeNW10 +AiurTempleBridgeNW12Out,AiurTempleBridgeNW12Out +AiurTempleBridgeNW12,AiurTempleBridgeNW12 +VoidMPImmortalReviveRebuild,VoidMPImmortalReviveRebuild +VoidMPImmortalReviveDeath,VoidMPImmortalReviveDeath +ArbiterMPStasisField,ArbiterMPStasisField +ArbiterMPRecall,ArbiterMPRecall +CorsairMPDisruptionWeb,CorsairMPDisruptionWeb +MorphToGuardianMP,MorphToGuardianMP +MorphToDevourerMP,MorphToDevourerMP +DefilerMPConsume,DefilerMPConsume +DefilerMPDarkSwarm,DefilerMPDarkSwarm +DefilerMPPlague,DefilerMPPlague +DefilerMPBurrow,DefilerMPBurrow +DefilerMPUnburrow,DefilerMPUnburrow +QueenMPEnsnare,QueenMPEnsnare +QueenMPSpawnBroodlings,QueenMPSpawnBroodlings +QueenMPInfestCommandCenter,QueenMPInfestCommandCenter +LightningBomb,LightningBomb +Grapple,Grapple +OracleStasisTrap,OracleStasisTrap +OracleStasisTrapBuild,OracleStasisTrapBuild +OracleStasisTrapActivate,OracleStasisTrapActivate +SelfRepair,SelfRepair +ParasiticBomb,ParasiticBomb +AdeptPhaseShift,AdeptPhaseShift +PurificationNovaMorph,PurificationNovaMorph +PurificationNovaMorphBack,PurificationNovaMorphBack +LurkerHoldFire,LurkerHoldFire +LurkerRemoveHoldFire,LurkerRemoveHoldFire +LiberatorMorphtoAG,LiberatorMorphtoAG +LiberatorMorphtoAA,LiberatorMorphtoAA +LiberatorAGTarget,LiberatorAGTarget +LiberatorAATarget,LiberatorAATarget +TimeStop,TimeStop +KD8Charge,KD8Charge +AdeptPhaseShiftCancel,AdeptPhaseShiftCancel +AdeptShadePhaseShiftCancel,AdeptShadePhaseShiftCancel +LaunchInterceptors,LaunchInterceptors +SpawnLocustsTargeted,SpawnLocustsTargeted +LocustMPFlyingSwoopAttack,LocustMPFlyingSwoopAttack +MorphToTransportOverlord,MorphToTransportOverlord +BypassArmor,BypassArmor +BypassArmorDroneCU,BypassArmorDroneCU +ChannelSnipe,ChannelSnipe +LockOnAir,LockOnAir +PurificationNovaTargetted,PurificationNovaTargetted diff --git a/sc2reader/data/attributes.json b/sc2reader/data/attributes.json index eee36f6c..8265f61b 100644 --- a/sc2reader/data/attributes.json +++ b/sc2reader/data/attributes.json @@ -1,1281 +1,1562 @@ { "attributes": { "0500": [ - "Controller", + "Controller", { - "Clsd": "Closed", - "Comp": "Computer", - "Humn": "User", + "Clsd": "Closed", + "Comp": "Computer", + "Humn": "User", "Open": "Open" } - ], + ], "1000": [ - "Rules", + "Rules", { "Dflt": "Default" } - ], + ], "1001": [ - "Premade Game", + "Premade Game", { - "no": "No", + "no": "No", "yes": "Yes" } - ], + ], "2000": [ - "Teams", - { - "Cust": "Custom Teams", - "FFA": "Free For All", - "FFAT": "Free For All Teams", - "t1": "1 Team", - "t10": "10 Teams", - "t11": "11 Teams", - "t2": "2 Teams", - "t3": "3 Teams", - "t4": "4 Teams", - "t5": "5 Teams", - "t6": "6 Teams", - "t7": "7 Teams", - "t8": "8 Teams", + "Teams", + { + "CuTa": "Custom Teams Archon", + "Cust": "Custom Teams", + "FFA": "Free For All", + "FFAT": "Free For All Archon", + "t1": "1 Team", + "t10": "10 Teams", + "t11": "11 Teams", + "t2": "2 Teams", + "t3": "3 Teams", + "t4": "4 Teams", + "t5": "5 Teams", + "t6": "6 Teams", + "t7": "7 Teams", + "t8": "8 Teams", "t9": "9 Teams" } - ], + ], "2001": [ - "Teams", - { - "1v1": "1v1", - "2v2": "2v2", - "3v3": "3v3", - "4v4": "4v4", - "5v5": "5v5", - "6v6": "6v6", + "Teams", + { + "1v1": "1v1", + "2v2": "2v2", + "3v3": "3v3", + "4v4": "4v4", + "5v5": "5v5", + "6v6": "6v6", "FFA": "FFA" } - ], + ], "2002": [ - "Teams1v1", + "Teams1v1", { - "T1": "Team 1", + "T1": "Team 1", "T2": "Team 2" } - ], + ], "2003": [ - "Teams2v2", + "Teams2v2", { - "T1": "Team 1", + "T1": "Team 1", "T2": "Team 2" } - ], + ], "2004": [ - "Teams3v3", + "Teams3v3", { - "T1": "Team 1", + "T1": "Team 1", "T2": "Team 2" } - ], + ], "2005": [ - "Teams4v4", + "Teams4v4", { - "T1": "Team 1", + "T1": "Team 1", "T2": "Team 2" } - ], + ], "2006": [ - "TeamsFFA", - { - "T1": "Team 1", - "T10": "Team 10", - "T11": "Team 11", - "T12": "Team 12", - "T13": "Team 13", - "T14": "Team 14", - "T15": "Team 15", - "T2": "Team 2", - "T3": "Team 3", - "T4": "Team 4", - "T5": "Team 5", - "T6": "Team 6", - "T7": "Team 7", - "T8": "Team 8", + "TeamsFFA", + { + "T1": "Team 1", + "T10": "Team 10", + "T11": "Team 11", + "T12": "Team 12", + "T13": "Team 13", + "T14": "Team 14", + "T15": "Team 15", + "T2": "Team 2", + "T3": "Team 3", + "T4": "Team 4", + "T5": "Team 5", + "T6": "Team 6", + "T7": "Team 7", + "T8": "Team 8", "T9": "Team 9" } - ], + ], "2007": [ - "Teams5v5", + "Teams5v5", { - "T1": "Team 1", + "T1": "Team 1", "T2": "Team 2" } - ], + ], "2008": [ - "Teams6v6", + "Teams6v6", { - "T1": "Team 1", + "T1": "Team 1", "T2": "Team 2" } - ], + ], "2010": [ - "Team", + "Team", { "T1": "Team 1" } - ], + ], "2011": [ - "Teams7v7", + "Teams7v7", { - "T1": "Team 1", + "T1": "Team 1", "T2": "Team 2" } - ], + ], "2012": [ - "Team", + "Team", { - "T1": "Team 1", - "T2": "Team 2", + "T1": "Team 1", + "T2": "Team 2", "T3": "Team 3" } - ], + ], "2013": [ - "Team", + "Team", { - "T1": "Team 1", - "T2": "Team 2", - "T3": "Team 3", + "T1": "Team 1", + "T2": "Team 2", + "T3": "Team 3", "T4": "Team 4" } - ], + ], "2014": [ - "Team", + "Team", { - "T1": "Team 1", - "T2": "Team 2", - "T3": "Team 3", - "T4": "Team 4", + "T1": "Team 1", + "T2": "Team 2", + "T3": "Team 3", + "T4": "Team 4", "T5": "Team 5" } - ], + ], "2015": [ - "Team", + "Team", { - "T1": "Team 1", - "T2": "Team 2", - "T3": "Team 3", - "T4": "Team 4", - "T5": "Team 5", + "T1": "Team 1", + "T2": "Team 2", + "T3": "Team 3", + "T4": "Team 4", + "T5": "Team 5", "T6": "Team 6" } - ], + ], "2016": [ - "Team", - { - "T1": "Team 1", - "T2": "Team 2", - "T3": "Team 3", - "T4": "Team 4", - "T5": "Team 5", - "T6": "Team 6", + "Team", + { + "T1": "Team 1", + "T2": "Team 2", + "T3": "Team 3", + "T4": "Team 4", + "T5": "Team 5", + "T6": "Team 6", "T7": "Team 7" } - ], + ], "2017": [ - "Team", - { - "T1": "Team 1", - "T10": "Team 10", - "T11": "Team 11", - "T12": "Team 12", - "T13": "Team 13", - "T14": "Team 14", - "T15": "Team 15", - "T2": "Team 2", - "T3": "Team 3", - "T4": "Team 4", - "T5": "Team 5", - "T6": "Team 6", - "T7": "Team 7", - "T8": "Team 8", + "Team", + { + "T1": "Team 1", + "T10": "Team 10", + "T11": "Team 11", + "T12": "Team 12", + "T13": "Team 13", + "T14": "Team 14", + "T15": "Team 15", + "T2": "Team 2", + "T3": "Team 3", + "T4": "Team 4", + "T5": "Team 5", + "T6": "Team 6", + "T7": "Team 7", + "T8": "Team 8", "T9": "Team 9" } - ], + ], "2018": [ - "Team", - { - "T1": "Team 1", - "T10": "Team 10", - "T11": "Team 11", - "T12": "Team 12", - "T13": "Team 13", - "T14": "Team 14", - "T15": "Team 15", - "T2": "Team 2", - "T3": "Team 3", - "T4": "Team 4", - "T5": "Team 5", - "T6": "Team 6", - "T7": "Team 7", - "T8": "Team 8", + "Team", + { + "T1": "Team 1", + "T10": "Team 10", + "T11": "Team 11", + "T12": "Team 12", + "T13": "Team 13", + "T14": "Team 14", + "T15": "Team 15", + "T2": "Team 2", + "T3": "Team 3", + "T4": "Team 4", + "T5": "Team 5", + "T6": "Team 6", + "T7": "Team 7", + "T8": "Team 8", "T9": "Team 9" } - ], + ], "2019": [ - "Team", - { - "T1": "Team 1", - "T2": "Team 2", - "T3": "Team 3", - "T4": "Team 4", - "T5": "Team 5", - "T6": "Team 6", - "T7": "Team 7", + "Team", + { + "T1": "Team 1", + "T2": "Team 2", + "T3": "Team 3", + "T4": "Team 4", + "T5": "Team 5", + "T6": "Team 6", + "T7": "Team 7", "T8": "Team 8" } - ], + ], "2020": [ - "Team", - { - "T1": "Team 1", - "T2": "Team 2", - "T3": "Team 3", - "T4": "Team 4", - "T5": "Team 5", - "T6": "Team 6", - "T7": "Team 7", - "T8": "Team 8", + "Team", + { + "T1": "Team 1", + "T2": "Team 2", + "T3": "Team 3", + "T4": "Team 4", + "T5": "Team 5", + "T6": "Team 6", + "T7": "Team 7", + "T8": "Team 8", "T9": "Team 9" } - ], + ], "2021": [ - "Team", - { - "T1": "Team 1", - "T10": "Team 10", - "T2": "Team 2", - "T3": "Team 3", - "T4": "Team 4", - "T5": "Team 5", - "T6": "Team 6", - "T7": "Team 7", - "T8": "Team 8", + "Team", + { + "T1": "Team 1", + "T10": "Team 10", + "T2": "Team 2", + "T3": "Team 3", + "T4": "Team 4", + "T5": "Team 5", + "T6": "Team 6", + "T7": "Team 7", + "T8": "Team 8", "T9": "Team 9" } - ], + ], "2022": [ - "Team", - { - "T1": "Team 1", - "T10": "Team 10", - "T11": "Team 11", - "T2": "Team 2", - "T3": "Team 3", - "T4": "Team 4", - "T5": "Team 5", - "T6": "Team 6", - "T7": "Team 7", - "T8": "Team 8", + "Team", + { + "T1": "Team 1", + "T10": "Team 10", + "T11": "Team 11", + "T2": "Team 2", + "T3": "Team 3", + "T4": "Team 4", + "T5": "Team 5", + "T6": "Team 6", + "T7": "Team 7", + "T8": "Team 8", "T9": "Team 9" } - ], + ], + "2023": [ + "Team", + { + "T1": "Team 1", + "T2": "Team 2", + "T3": "Team 3", + "T4": "Team 4", + "T5": "Team 5", + "T6": "Team 6" + } + ], + "2024": [ + "Team", + { + "T1": "Team 1", + "T2": "Team 2", + "T3": "Team 3", + "T4": "Team 4", + "T5": "Team 5", + "T6": "Team 6", + "T7": "Team 7", + "T8": "Team 8" + } + ], "3000": [ - "Game Speed", + "Game Speed", { - "Fasr": "Faster", - "Fast": "Fast", - "Norm": "Normal", - "Slor": "Slower", + "Fasr": "Faster", + "Fast": "Fast", + "Norm": "Normal", + "Slor": "Slower", "Slow": "Slow" } - ], + ], "3001": [ - "Race", + "Race", { - "Prot": "Protoss", - "RAND": "Random", - "Terr": "Terran", + "Prot": "Protoss", + "RAND": "Random", + "Terr": "Terran", "Zerg": "Zerg" } - ], + ], "3002": [ - "Color", - { - "tc01": "Red", - "tc02": "Blue", - "tc03": "Teal", - "tc04": "Purple", - "tc05": "Yellow", - "tc06": "Orange", - "tc07": "Green", - "tc08": "Light Pink", - "tc09": "Violet", - "tc10": "Light Grey", - "tc11": "Dark Green", - "tc12": "Brown", - "tc13": "Light Green", - "tc14": "Dark Grey", - "tc15": "Pink", + "Color", + { + "tc01": "Red", + "tc02": "Blue", + "tc03": "Teal", + "tc04": "Purple", + "tc05": "Yellow", + "tc06": "Orange", + "tc07": "Green", + "tc08": "Light Pink", + "tc09": "Violet", + "tc10": "Light Grey", + "tc11": "Dark Green", + "tc12": "Brown", + "tc13": "Light Green", + "tc14": "Dark Grey", + "tc15": "Pink", "tc16": "??" } - ], + ], "3003": [ - "Handicap", + "Handicap", { - "100": "100%", - "50": "50%", - "60": "60%", - "70": "70%", - "80": "80%", + "100": "100%", + "50": "50%", + "60": "60%", + "70": "70%", + "80": "80%", "90": "90%" } - ], + ], "3004": [ - "Difficulty", - { - "ChRe": "Cheater 2 (Resources)", - "ChVi": "Cheater 1 (Vision)", - "Easy": "Easy", - "Hard": "Harder", - "HdVH": "Very Hard", - "Insa": "Insane", - "MdHd": "Hard", - "Medi": "Medium", - "VyEy": "Very Easy", + "Difficulty", + { + "ChRe": "Cheater 2 (Resources)", + "ChVi": "Cheater 1 (Vision)", + "Easy": "Easy", + "Hard": "Harder", + "HdVH": "Very Hard", + "Insa": "Insane", + "MdHd": "Hard", + "Medi": "Medium", + "VyEy": "Very Easy", "VyHd": "Elite" } - ], + ], "3006": [ - "Lobby Delay", - { - "10": "10", - "15": "15", - "20": "20", - "25": "25", - "3": "3", - "30": "30", - "5": "5", + "Lobby Delay", + { + "10": "10", + "15": "15", + "20": "20", + "25": "25", + "3": "3", + "30": "30", + "5": "5", "7": "7" } - ], + ], "3007": [ - "Participant Role", + "Participant Role", { - "Part": "Participant", + "Part": "Participant", "Watc": "Observer" } - ], + ], "3008": [ - "Observer Type", + "Observer Type", { - "Obs": "Spectator", + "Obs": "Spectator", "Ref": "Referee" } - ], + ], "3009": [ - "Game Mode", + "Game Mode", { - "": "Single Player", - "Amm": "Ladder", - "Priv": "Private", + "": "Single Player", + "Amm": "Ladder", + "Priv": "Private", "Pub": "Public" } - ], + ], "3010": [ - "Locked Alliances", + "Locked Alliances", { - "no": "No", + "no": "No", "yes": "Yes" } - ], + ], "3011": [ - "Player Logo Index", - { - "0": "0", - "1": "1", - "10": "10", - "100": "100", - "101": "101", - "102": "102", - "103": "103", - "104": "104", - "105": "105", - "106": "106", - "107": "107", - "108": "108", - "109": "109", - "11": "11", - "110": "110", - "111": "111", - "112": "112", - "113": "113", - "114": "114", - "115": "115", - "116": "116", - "117": "117", - "118": "118", - "119": "119", - "12": "12", - "120": "120", - "121": "121", - "122": "122", - "123": "123", - "124": "124", - "125": "125", - "126": "126", - "127": "127", - "128": "128", - "129": "129", - "13": "13", - "130": "130", - "131": "131", - "132": "132", - "133": "133", - "134": "134", - "135": "135", - "136": "136", - "137": "137", - "138": "138", - "139": "139", - "14": "14", - "140": "140", - "141": "141", - "142": "142", - "143": "143", - "144": "144", - "145": "145", - "146": "146", - "147": "147", - "148": "148", - "149": "149", - "15": "15", - "150": "150", - "151": "151", - "152": "152", - "153": "153", - "154": "154", - "155": "155", - "156": "156", - "157": "157", - "158": "158", - "159": "159", - "16": "16", - "160": "160", - "161": "161", - "162": "162", - "163": "163", - "164": "164", - "165": "165", - "166": "166", - "167": "167", - "168": "168", - "169": "169", - "17": "17", - "170": "170", - "171": "171", - "172": "172", - "173": "173", - "174": "174", - "175": "175", - "176": "176", - "177": "177", - "178": "178", - "179": "179", - "18": "18", - "180": "180", - "181": "181", - "182": "182", - "183": "183", - "184": "184", - "185": "185", - "186": "186", - "187": "187", - "188": "188", - "189": "189", - "19": "19", - "190": "190", - "191": "191", - "192": "192", - "193": "193", - "194": "194", - "195": "195", - "196": "196", - "197": "197", - "198": "198", - "199": "199", - "2": "2", - "20": "20", - "200": "200", - "201": "201", - "202": "202", - "203": "203", - "204": "204", - "205": "205", - "206": "206", - "207": "207", - "208": "208", - "209": "209", - "21": "21", - "210": "210", - "211": "211", - "212": "212", - "213": "213", - "214": "214", - "215": "215", - "216": "216", - "217": "217", - "218": "218", - "219": "219", - "22": "22", - "220": "220", - "221": "221", - "222": "222", - "223": "223", - "224": "224", - "225": "225", - "226": "226", - "227": "227", - "228": "228", - "229": "229", - "23": "23", - "230": "230", - "231": "231", - "232": "232", - "233": "233", - "234": "234", - "235": "235", - "236": "236", - "237": "237", - "238": "238", - "239": "239", - "24": "24", - "240": "240", - "241": "241", - "242": "242", - "243": "243", - "244": "244", - "245": "245", - "246": "246", - "247": "247", - "248": "248", - "249": "249", - "25": "25", - "250": "250", - "251": "251", - "252": "252", - "253": "253", - "254": "254", - "255": "255", - "26": "26", - "27": "27", - "28": "28", - "29": "29", - "3": "3", - "30": "30", - "31": "31", - "32": "32", - "33": "33", - "34": "34", - "35": "35", - "36": "36", - "37": "37", - "38": "38", - "39": "39", - "4": "4", - "40": "40", - "41": "41", - "42": "42", - "43": "43", - "44": "44", - "45": "45", - "46": "46", - "47": "47", - "48": "48", - "49": "49", - "5": "5", - "50": "50", - "51": "51", - "52": "52", - "53": "53", - "54": "54", - "55": "55", - "56": "56", - "57": "57", - "58": "58", - "59": "59", - "6": "6", - "60": "60", - "61": "61", - "62": "62", - "63": "63", - "64": "64", - "65": "65", - "66": "66", - "67": "67", - "68": "68", - "69": "69", - "7": "7", - "70": "70", - "71": "71", - "72": "72", - "73": "73", - "74": "74", - "75": "75", - "76": "76", - "77": "77", - "78": "78", - "79": "79", - "8": "8", - "80": "80", - "81": "81", - "82": "82", - "83": "83", - "84": "84", - "85": "85", - "86": "86", - "87": "87", - "88": "88", - "89": "89", - "9": "9", - "90": "90", - "91": "91", - "92": "92", - "93": "93", - "94": "94", - "95": "95", - "96": "96", - "97": "97", - "98": "98", + "Player Logo Index", + { + "0": "0", + "1": "1", + "10": "10", + "100": "100", + "101": "101", + "102": "102", + "103": "103", + "104": "104", + "105": "105", + "106": "106", + "107": "107", + "108": "108", + "109": "109", + "11": "11", + "110": "110", + "111": "111", + "112": "112", + "113": "113", + "114": "114", + "115": "115", + "116": "116", + "117": "117", + "118": "118", + "119": "119", + "12": "12", + "120": "120", + "121": "121", + "122": "122", + "123": "123", + "124": "124", + "125": "125", + "126": "126", + "127": "127", + "128": "128", + "129": "129", + "13": "13", + "130": "130", + "131": "131", + "132": "132", + "133": "133", + "134": "134", + "135": "135", + "136": "136", + "137": "137", + "138": "138", + "139": "139", + "14": "14", + "140": "140", + "141": "141", + "142": "142", + "143": "143", + "144": "144", + "145": "145", + "146": "146", + "147": "147", + "148": "148", + "149": "149", + "15": "15", + "150": "150", + "151": "151", + "152": "152", + "153": "153", + "154": "154", + "155": "155", + "156": "156", + "157": "157", + "158": "158", + "159": "159", + "16": "16", + "160": "160", + "161": "161", + "162": "162", + "163": "163", + "164": "164", + "165": "165", + "166": "166", + "167": "167", + "168": "168", + "169": "169", + "17": "17", + "170": "170", + "171": "171", + "172": "172", + "173": "173", + "174": "174", + "175": "175", + "176": "176", + "177": "177", + "178": "178", + "179": "179", + "18": "18", + "180": "180", + "181": "181", + "182": "182", + "183": "183", + "184": "184", + "185": "185", + "186": "186", + "187": "187", + "188": "188", + "189": "189", + "19": "19", + "190": "190", + "191": "191", + "192": "192", + "193": "193", + "194": "194", + "195": "195", + "196": "196", + "197": "197", + "198": "198", + "199": "199", + "2": "2", + "20": "20", + "200": "200", + "201": "201", + "202": "202", + "203": "203", + "204": "204", + "205": "205", + "206": "206", + "207": "207", + "208": "208", + "209": "209", + "21": "21", + "210": "210", + "211": "211", + "212": "212", + "213": "213", + "214": "214", + "215": "215", + "216": "216", + "217": "217", + "218": "218", + "219": "219", + "22": "22", + "220": "220", + "221": "221", + "222": "222", + "223": "223", + "224": "224", + "225": "225", + "226": "226", + "227": "227", + "228": "228", + "229": "229", + "23": "23", + "230": "230", + "231": "231", + "232": "232", + "233": "233", + "234": "234", + "235": "235", + "236": "236", + "237": "237", + "238": "238", + "239": "239", + "24": "24", + "240": "240", + "241": "241", + "242": "242", + "243": "243", + "244": "244", + "245": "245", + "246": "246", + "247": "247", + "248": "248", + "249": "249", + "25": "25", + "250": "250", + "251": "251", + "252": "252", + "253": "253", + "254": "254", + "255": "255", + "26": "26", + "27": "27", + "28": "28", + "29": "29", + "3": "3", + "30": "30", + "31": "31", + "32": "32", + "33": "33", + "34": "34", + "35": "35", + "36": "36", + "37": "37", + "38": "38", + "39": "39", + "4": "4", + "40": "40", + "41": "41", + "42": "42", + "43": "43", + "44": "44", + "45": "45", + "46": "46", + "47": "47", + "48": "48", + "49": "49", + "5": "5", + "50": "50", + "51": "51", + "52": "52", + "53": "53", + "54": "54", + "55": "55", + "56": "56", + "57": "57", + "58": "58", + "59": "59", + "6": "6", + "60": "60", + "61": "61", + "62": "62", + "63": "63", + "64": "64", + "65": "65", + "66": "66", + "67": "67", + "68": "68", + "69": "69", + "7": "7", + "70": "70", + "71": "71", + "72": "72", + "73": "73", + "74": "74", + "75": "75", + "76": "76", + "77": "77", + "78": "78", + "79": "79", + "8": "8", + "80": "80", + "81": "81", + "82": "82", + "83": "83", + "84": "84", + "85": "85", + "86": "86", + "87": "87", + "88": "88", + "89": "89", + "9": "9", + "90": "90", + "91": "91", + "92": "92", + "93": "93", + "94": "94", + "95": "95", + "96": "96", + "97": "97", + "98": "98", "99": "99" } - ], + ], + "3012": [ + "Tandem Leader Slot", + { + "0": "0", + "1": "1", + "10": "10", + "11": "11", + "12": "12", + "13": "13", + "14": "14", + "15": "15", + "2": "2", + "22": "None", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9" + } + ], + "3013": [ + "Commander", + { + "": "Pick Commander", + "Arta": "Artanis", + "Kara": "Karax", + "Kerr": "Kerrigan", + "Rayn": "Raynor", + "Swan": "Swann", + "Vora": "Vorazun", + "Zaga": "Zagara" + } + ], + "3014": [ + "Commander Level", + { + "1": "1", + "10": "10", + "11": "11", + "12": "12", + "13": "13", + "14": "14", + "15": "15", + "16": "16", + "17": "17", + "18": "18", + "19": "19", + "2": "2", + "20": "20", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9" + } + ], + "3015": [ + "Game Duration", + { + "0": "Infinite", + "120": "120 Minutes", + "15": "15 Minutes", + "25": "25 Minutes", + "30": "30 Minutes", + "45": "45 Minutes", + "5": "5 Minutes", + "60": "60 Minutes", + "90": "90 Minutes" + } + ], "3102": [ - "AI Build", + "AI Build", { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", "AB06": "Straight to Air" } - ], + ], "3103": [ - "AI Build", + "AI Build", { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", "AB06": "Straight to Air" } - ], + ], "3104": [ - "AI Build", + "AI Build", { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", "AB06": "Straight to Air" } - ], + ], "3105": [ - "AI Build", + "AI Build", { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", "AB06": "Straight to Air" } - ], + ], "3106": [ - "AI Build", + "AI Build", { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", "AB06": "Straight to Air" } - ], + ], "3107": [ - "AI Build", + "AI Build", { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", "AB06": "Straight to Air" } - ], + ], "3108": [ - "AI Build", + "AI Build", { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", "AB06": "Straight to Air" } - ], + ], "3109": [ - "AI Build", + "AI Build", { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", "AB06": "Straight to Air" } - ], + ], "3110": [ - "AI Build", + "AI Build", { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", "AB06": "Straight to Air" } - ], + ], "3111": [ - "AI Build", + "AI Build", { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", "AB06": "Straight to Air" } - ], + ], "3134": [ - "AI Build", + "AI Build", { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", "AB06": "Straight to Air" } - ], + ], "3135": [ - "AI Build", + "AI Build", { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", "AB06": "Straight to Air" } - ], + ], "3136": [ - "AI Build", + "AI Build", { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", "AB06": "Straight to Air" } - ], + ], "3137": [ - "AI Build", + "AI Build", { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", "AB06": "Straight to Air" } - ], + ], "3138": [ - "AI Build", + "AI Build", { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", "AB06": "Straight to Air" } - ], + ], "3139": [ - "AI Build (Terran)", - { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", - "AB06": "Straight to Air", - "AB43": "MarineStim (Timing)", - "AB44": "MarauderHellion (Timing)", - "AB45": "MarineSiege (Timing)", - "AB46": "CloakBanshee (Timing)", - "AB48": "MMM (Aggressive)", - "AB49": "MarineSiege (Aggressive)", - "AB50": "SiegeBanshee (Aggressive)", - "AB51": "HellionSiege (Aggressive)", - "AB52": "SiegeThor (Aggressive)", - "AB54": "BioMMM (Economic)", - "AB55": "Mech (Economic)", - "AB56": "ThorBC (Economic)" - } - ], + "AI Build (Terran)", + { + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", + "AB06": "Straight to Air", + "AB43": "MarineStim (Timing)", + "AB44": "MarauderHellion (Timing)", + "AB45": "MarineSiege (Timing)", + "AB46": "CloakBanshee (Timing)", + "AB48": "MMM (Aggressive)", + "AB49": "MarineSiege (Aggressive)", + "AB50": "SiegeBanshee (Aggressive)", + "AB51": "HellionSiege (Aggressive)", + "AB52": "SiegeThor (Aggressive)", + "AB54": "BioMMM (Economic)", + "AB55": "Mech (Economic)", + "AB56": "ThorBC (Economic)", + "T070": "MarineStim (Timing)", + "T071": "MarauderHellion (Timing)", + "T072": "MarineSiege (Timing)", + "T073": "CloakBanshee (Timing)", + "T080": "MMM (Aggressive)", + "T081": "MarineSiege (Aggressive)", + "T082": "SiegeBanshee (Aggressive)", + "T083": "HellionSiege (Aggressive)", + "T084": "SiegeThor (Aggressive)", + "T090": "BioMMM (Economic)", + "T091": "Mech (Economic)", + "T092": "ThorBC (Economic)" + } + ], "3140": [ - "AI Build (Terran)", - { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", - "AB06": "Straight to Air", - "AB43": "MarineStim (Timing)", - "AB44": "MarauderHellion (Timing)", - "AB45": "MarineSiege (Timing)", - "AB46": "CloakBanshee (Timing)", - "AB48": "MMM (Aggressive)", - "AB49": "MarineSiege (Aggressive)", - "AB50": "SiegeBanshee (Aggressive)", - "AB51": "HellionSiege (Aggressive)", - "AB52": "SiegeThor (Aggressive)", - "AB54": "BioMMM (Economic)", - "AB55": "Mech (Economic)", - "AB56": "ThorBC (Economic)" - } - ], + "AI Build (Terran)", + { + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", + "AB06": "Straight to Air", + "AB43": "MarineStim (Timing)", + "AB44": "MarauderHellion (Timing)", + "AB45": "MarineSiege (Timing)", + "AB46": "CloakBanshee (Timing)", + "AB48": "MMM (Aggressive)", + "AB49": "MarineSiege (Aggressive)", + "AB50": "SiegeBanshee (Aggressive)", + "AB51": "HellionSiege (Aggressive)", + "AB52": "SiegeThor (Aggressive)", + "AB54": "BioMMM (Economic)", + "AB55": "Mech (Economic)", + "AB56": "ThorBC (Economic)", + "T070": "MarineStim (Timing)", + "T071": "MarauderHellion (Timing)", + "T072": "MarineSiege (Timing)", + "T073": "CloakBanshee (Timing)", + "T080": "MMM (Aggressive)", + "T081": "MarineSiege (Aggressive)", + "T082": "SiegeBanshee (Aggressive)", + "T083": "HellionSiege (Aggressive)", + "T084": "SiegeThor (Aggressive)", + "T090": "BioMMM (Economic)", + "T091": "Mech (Economic)", + "T092": "ThorBC (Economic)" + } + ], "3141": [ - "AI Build (Terran)", - { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", - "AB06": "Straight to Air", - "AB43": "MarineStim (Timing)", - "AB44": "MarauderHellion (Timing)", - "AB45": "MarineSiege (Timing)", - "AB46": "CloakBanshee (Timing)", - "AB48": "MMM (Aggressive)", - "AB49": "MarineSiege (Aggressive)", - "AB50": "SiegeBanshee (Aggressive)", - "AB51": "HellionSiege (Aggressive)", - "AB52": "SiegeThor (Aggressive)", - "AB54": "BioMMM (Economic)", - "AB55": "Mech (Economic)", - "AB56": "ThorBC (Economic)" - } - ], + "AI Build (Terran)", + { + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", + "AB06": "Straight to Air", + "AB43": "MarineStim (Timing)", + "AB44": "MarauderHellion (Timing)", + "AB45": "MarineSiege (Timing)", + "AB46": "CloakBanshee (Timing)", + "AB48": "MMM (Aggressive)", + "AB49": "MarineSiege (Aggressive)", + "AB50": "SiegeBanshee (Aggressive)", + "AB51": "HellionSiege (Aggressive)", + "AB52": "SiegeThor (Aggressive)", + "AB54": "BioMMM (Economic)", + "AB55": "Mech (Economic)", + "AB56": "ThorBC (Economic)", + "T070": "MarineStim (Timing)", + "T071": "MarauderHellion (Timing)", + "T072": "MarineSiege (Timing)", + "T073": "CloakBanshee (Timing)", + "T080": "MMM (Aggressive)", + "T081": "MarineSiege (Aggressive)", + "T082": "SiegeBanshee (Aggressive)", + "T083": "HellionSiege (Aggressive)", + "T084": "SiegeThor (Aggressive)", + "T090": "BioMMM (Economic)", + "T091": "Mech (Economic)", + "T092": "ThorBC (Economic)" + } + ], "3142": [ - "AI Build (Terran)", - { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", - "AB06": "Straight to Air", - "AB43": "MarineStim (Timing)", - "AB44": "MarauderHellion (Timing)", - "AB45": "MarineSiege (Timing)", - "AB46": "CloakBanshee (Timing)", - "AB48": "MMM (Aggressive)", - "AB49": "MarineSiege (Aggressive)", - "AB50": "SiegeBanshee (Aggressive)", - "AB51": "HellionSiege (Aggressive)", - "AB52": "SiegeThor (Aggressive)", - "AB54": "BioMMM (Economic)", - "AB55": "Mech (Economic)", - "AB56": "ThorBC (Economic)" - } - ], + "AI Build (Terran)", + { + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", + "AB06": "Straight to Air", + "AB43": "MarineStim (Timing)", + "AB44": "MarauderHellion (Timing)", + "AB45": "MarineSiege (Timing)", + "AB46": "CloakBanshee (Timing)", + "AB48": "MMM (Aggressive)", + "AB49": "MarineSiege (Aggressive)", + "AB50": "SiegeBanshee (Aggressive)", + "AB51": "HellionSiege (Aggressive)", + "AB52": "SiegeThor (Aggressive)", + "AB54": "BioMMM (Economic)", + "AB55": "Mech (Economic)", + "AB56": "ThorBC (Economic)", + "T070": "MarineStim (Timing)", + "T071": "MarauderHellion (Timing)", + "T072": "MarineSiege (Timing)", + "T073": "CloakBanshee (Timing)", + "T080": "MMM (Aggressive)", + "T081": "MarineSiege (Aggressive)", + "T082": "SiegeBanshee (Aggressive)", + "T083": "HellionSiege (Aggressive)", + "T084": "SiegeThor (Aggressive)", + "T090": "BioMMM (Economic)", + "T091": "Mech (Economic)", + "T092": "ThorBC (Economic)" + } + ], "3143": [ - "AI Build (Terran)", - { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", - "AB06": "Straight to Air", - "AB43": "MarineStim (Timing)", - "AB44": "MarauderHellion (Timing)", - "AB45": "MarineSiege (Timing)", - "AB46": "CloakBanshee (Timing)", - "AB48": "MMM (Aggressive)", - "AB49": "MarineSiege (Aggressive)", - "AB50": "SiegeBanshee (Aggressive)", - "AB51": "HellionSiege (Aggressive)", - "AB52": "SiegeThor (Aggressive)", - "AB54": "BioMMM (Economic)", - "AB55": "Mech (Economic)", - "AB56": "ThorBC (Economic)" - } - ], + "AI Build (Terran)", + { + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", + "AB06": "Straight to Air", + "AB43": "MarineStim (Timing)", + "AB44": "MarauderHellion (Timing)", + "AB45": "MarineSiege (Timing)", + "AB46": "CloakBanshee (Timing)", + "AB48": "MMM (Aggressive)", + "AB49": "MarineSiege (Aggressive)", + "AB50": "SiegeBanshee (Aggressive)", + "AB51": "HellionSiege (Aggressive)", + "AB52": "SiegeThor (Aggressive)", + "AB54": "BioMMM (Economic)", + "AB55": "Mech (Economic)", + "AB56": "ThorBC (Economic)", + "T070": "MarineStim (Timing)", + "T071": "MarauderHellion (Timing)", + "T072": "MarineSiege (Timing)", + "T073": "CloakBanshee (Timing)", + "T080": "MMM (Aggressive)", + "T081": "MarineSiege (Aggressive)", + "T082": "SiegeBanshee (Aggressive)", + "T083": "HellionSiege (Aggressive)", + "T084": "SiegeThor (Aggressive)", + "T090": "BioMMM (Economic)", + "T091": "Mech (Economic)", + "T092": "ThorBC (Economic)" + } + ], "3166": [ - "AI Build", + "AI Build", { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", "AB06": "Straight to Air" } - ], + ], "3167": [ - "AI Build", + "AI Build", { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", "AB06": "Straight to Air" } - ], + ], "3168": [ - "AI Build", + "AI Build", { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", "AB06": "Straight to Air" } - ], + ], "3169": [ - "AI Build", + "AI Build", { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", "AB06": "Straight to Air" } - ], + ], "3170": [ - "AI Build", + "AI Build", { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", "AB06": "Straight to Air" } - ], + ], "3171": [ - "AI Build (Protoss)", - { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", - "AB06": "Straight to Air", - "AB64": "WarpGate (Timing)", - "AB65": "StalkerRobo (Timing)", - "AB66": "Blink Stalker (Timing)", - "AB67": "Dark Templar Rush (Timing)", - "AB69": "SevenGate (Aggressive)", - "AB70": "GateImmortal (Aggressive)", - "AB71": "Colossi (Aggressive)", - "AB72": "GatewayAir (Aggressive)", - "AB73": "VoidPhoenix (Aggressive)", - "AB75": "GateImmortal (Economic)", - "AB76": "Colossi (Economic)", - "AB77": "GatewayAir (Economic)" - } - ], + "AI Build (Protoss)", + { + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", + "AB06": "Straight to Air", + "AB64": "FourGate (Timing)", + "AB65": "StalkerRobo (Timing)", + "AB66": "Blink Stalker (Timing)", + "AB67": "Dark Templar Rush (Timing)", + "AB69": "SevenGate (Aggressive)", + "AB70": "ArchonImmortal (Aggressive)", + "AB71": "Colossi (Aggressive)", + "AB72": "GatewayAir (Aggressive)", + "AB73": "VoidPhoenix (Aggressive)", + "AB75": "GateImmortal (Economic)", + "AB76": "Colossi (Economic)", + "AB77": "GatewayAir (Economic)", + "P110": "WarpGate (Timing)", + "P112": "StalkerRobo (Timing)", + "P113": "Blink Stalker (Timing)", + "P114": "Dark Templar Rush (Timing)", + "P120": "SevenGate (Aggressive)", + "P121": "GateImmortal (Aggressive)", + "P122": "Colossi (Aggressive)", + "P123": "GatewayAir (Aggressive)", + "P124": "VoidPhoenix (Aggressive)", + "P130": "GateImmortal (Economic)", + "P131": "Colossi (Economic)", + "P132": "GatewayAir (Economic)" + } + ], "3172": [ - "AI Build (Protoss)", - { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", - "AB06": "Straight to Air", - "AB64": "WarpGate (Timing)", - "AB65": "StalkerRobo (Timing)", - "AB66": "Blink Stalker (Timing)", - "AB67": "Dark Templar Rush (Timing)", - "AB69": "SevenGate (Aggressive)", - "AB70": "GateImmortal (Aggressive)", - "AB71": "Colossi (Aggressive)", - "AB72": "GatewayAir (Aggressive)", - "AB73": "VoidPhoenix (Aggressive)", - "AB75": "GateImmortal (Economic)", - "AB76": "Colossi (Economic)", - "AB77": "GatewayAir (Economic)" - } - ], + "AI Build (Protoss)", + { + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", + "AB06": "Straight to Air", + "AB64": "FourGate (Timing)", + "AB65": "StalkerRobo (Timing)", + "AB66": "Blink Stalker (Timing)", + "AB67": "Dark Templar Rush (Timing)", + "AB69": "SevenGate (Aggressive)", + "AB70": "ArchonImmortal (Aggressive)", + "AB71": "Colossi (Aggressive)", + "AB72": "GatewayAir (Aggressive)", + "AB73": "VoidPhoenix (Aggressive)", + "AB75": "GateImmortal (Economic)", + "AB76": "Colossi (Economic)", + "AB77": "GatewayAir (Economic)", + "P110": "WarpGate (Timing)", + "P112": "StalkerRobo (Timing)", + "P113": "Blink Stalker (Timing)", + "P114": "Dark Templar Rush (Timing)", + "P120": "SevenGate (Aggressive)", + "P121": "GateImmortal (Aggressive)", + "P122": "Colossi (Aggressive)", + "P123": "GatewayAir (Aggressive)", + "P124": "VoidPhoenix (Aggressive)", + "P130": "GateImmortal (Economic)", + "P131": "Colossi (Economic)", + "P132": "GatewayAir (Economic)" + } + ], "3173": [ - "AI Build (Protoss)", - { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", - "AB06": "Straight to Air", - "AB64": "WarpGate (Timing)", - "AB65": "StalkerRobo (Timing)", - "AB66": "Blink Stalker (Timing)", - "AB67": "Dark Templar Rush (Timing)", - "AB69": "SevenGate (Aggressive)", - "AB70": "GateImmortal (Aggressive)", - "AB71": "Colossi (Aggressive)", - "AB72": "GatewayAir (Aggressive)", - "AB73": "VoidPhoenix (Aggressive)", - "AB75": "GateImmortal (Economic)", - "AB76": "Colossi (Economic)", - "AB77": "GatewayAir (Economic)" - } - ], + "AI Build (Protoss)", + { + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", + "AB06": "Straight to Air", + "AB64": "FourGate (Timing)", + "AB65": "StalkerRobo (Timing)", + "AB66": "Blink Stalker (Timing)", + "AB67": "Dark Templar Rush (Timing)", + "AB69": "SevenGate (Aggressive)", + "AB70": "ArchonImmortal (Aggressive)", + "AB71": "Colossi (Aggressive)", + "AB72": "GatewayAir (Aggressive)", + "AB73": "VoidPhoenix (Aggressive)", + "AB75": "GateImmortal (Economic)", + "AB76": "Colossi (Economic)", + "AB77": "GatewayAir (Economic)", + "P110": "WarpGate (Timing)", + "P112": "StalkerRobo (Timing)", + "P113": "Blink Stalker (Timing)", + "P114": "Dark Templar Rush (Timing)", + "P120": "SevenGate (Aggressive)", + "P121": "GateImmortal (Aggressive)", + "P122": "Colossi (Aggressive)", + "P123": "GatewayAir (Aggressive)", + "P124": "VoidPhoenix (Aggressive)", + "P130": "GateImmortal (Economic)", + "P131": "Colossi (Economic)", + "P132": "GatewayAir (Economic)" + } + ], "3174": [ - "AI Build (Protoss)", - { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", - "AB06": "Straight to Air", - "AB64": "WarpGate (Timing)", - "AB65": "StalkerRobo (Timing)", - "AB66": "Blink Stalker (Timing)", - "AB67": "Dark Templar Rush (Timing)", - "AB69": "SevenGate (Aggressive)", - "AB70": "GateImmortal (Aggressive)", - "AB71": "Colossi (Aggressive)", - "AB72": "GatewayAir (Aggressive)", - "AB73": "VoidPhoenix (Aggressive)", - "AB75": "GateImmortal (Economic)", - "AB76": "Colossi (Economic)", - "AB77": "GatewayAir (Economic)" - } - ], + "AI Build (Protoss)", + { + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", + "AB06": "Straight to Air", + "AB64": "FourGate (Timing)", + "AB65": "StalkerRobo (Timing)", + "AB66": "Blink Stalker (Timing)", + "AB67": "Dark Templar Rush (Timing)", + "AB69": "SevenGate (Aggressive)", + "AB70": "ArchonImmortal (Aggressive)", + "AB71": "Colossi (Aggressive)", + "AB72": "GatewayAir (Aggressive)", + "AB73": "VoidPhoenix (Aggressive)", + "AB75": "GateImmortal (Economic)", + "AB76": "Colossi (Economic)", + "AB77": "GatewayAir (Economic)", + "P110": "WarpGate (Timing)", + "P112": "StalkerRobo (Timing)", + "P113": "Blink Stalker (Timing)", + "P114": "Dark Templar Rush (Timing)", + "P120": "SevenGate (Aggressive)", + "P121": "GateImmortal (Aggressive)", + "P122": "Colossi (Aggressive)", + "P123": "GatewayAir (Aggressive)", + "P124": "VoidPhoenix (Aggressive)", + "P130": "GateImmortal (Economic)", + "P131": "Colossi (Economic)", + "P132": "GatewayAir (Economic)" + } + ], "3175": [ - "AI Build (Protoss)", - { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", - "AB06": "Straight to Air", - "AB64": "WarpGate (Timing)", - "AB65": "StalkerRobo (Timing)", - "AB66": "Blink Stalker (Timing)", - "AB67": "Dark Templar Rush (Timing)", - "AB69": "SevenGate (Aggressive)", - "AB70": "GateImmortal (Aggressive)", - "AB71": "Colossi (Aggressive)", - "AB72": "GatewayAir (Aggressive)", - "AB73": "VoidPhoenix (Aggressive)", - "AB75": "GateImmortal (Economic)", - "AB76": "Colossi (Economic)", - "AB77": "GatewayAir (Economic)" - } - ], + "AI Build (Protoss)", + { + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", + "AB06": "Straight to Air", + "AB64": "FourGate (Timing)", + "AB65": "StalkerRobo (Timing)", + "AB66": "Blink Stalker (Timing)", + "AB67": "Dark Templar Rush (Timing)", + "AB69": "SevenGate (Aggressive)", + "AB70": "ArchonImmortal (Aggressive)", + "AB71": "Colossi (Aggressive)", + "AB72": "GatewayAir (Aggressive)", + "AB73": "VoidPhoenix (Aggressive)", + "AB75": "GateImmortal (Economic)", + "AB76": "Colossi (Economic)", + "AB77": "GatewayAir (Economic)", + "P110": "WarpGate (Timing)", + "P112": "StalkerRobo (Timing)", + "P113": "Blink Stalker (Timing)", + "P114": "Dark Templar Rush (Timing)", + "P120": "SevenGate (Aggressive)", + "P121": "GateImmortal (Aggressive)", + "P122": "Colossi (Aggressive)", + "P123": "GatewayAir (Aggressive)", + "P124": "VoidPhoenix (Aggressive)", + "P130": "GateImmortal (Economic)", + "P131": "Colossi (Economic)", + "P132": "GatewayAir (Economic)" + } + ], "3198": [ - "AI Build", + "AI Build", { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", "AB06": "Straight to Air" } - ], + ], "3199": [ - "AI Build", + "AI Build", { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", "AB06": "Straight to Air" } - ], + ], "3200": [ - "AI Build", + "AI Build", { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", "AB06": "Straight to Air" } - ], + ], "3201": [ - "AI Build", + "AI Build", { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", "AB06": "Straight to Air" } - ], + ], "3202": [ - "AI Build", + "AI Build", { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", "AB06": "Straight to Air" } - ], + ], "3203": [ - "AI Build (Zerg)", - { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", - "AB06": "Straight to Air", - "AB23": "BaneLing Bust (Timing)", - "AB24": "Roach Rush (Timing)", - "AB25": "LingRoach (Timing)", - "AB27": "Mutalisk (Aggressive)", - "AB28": "MutaLing (Aggressive)", - "AB29": "RoachAttack (Aggressive)", - "AB30": "RoachInfestor (Aggressive)", - "AB31": "RoachHydra (Aggressive)", - "AB34": "Infestor (Economic)", - "AB35": "Ultralisk (Economic)", - "AB36": "Brood Lord (Economic)" - } - ], + "AI Build (Zerg)", + { + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", + "AB06": "Straight to Air", + "AB23": "BaneLing Bust (Timing)", + "AB24": "Roach Rush (Timing)", + "AB25": "LingRoach (Timing)", + "AB27": "Pure Mutalisk (Aggressive)", + "AB28": "MutaLing (Aggressive)", + "AB29": "RoachAttack (Aggressive)", + "AB30": "RoachInfestor (Aggressive)", + "AB31": "RoachHydra (Aggressive)", + "AB34": "Infestor (Economic)", + "AB35": "Ultralisk (Economic)", + "AB36": "Brood Lord (Economic)", + "Z030": "BaneLing Bust (Timing)", + "Z031": "Roach Rush (Timing)", + "Z032": "LingRoach (Timing)", + "Z040": "Mutalisk (Aggressive)", + "Z041": "MutaLing (Aggressive)", + "Z042": "RoachAttack (Aggressive)", + "Z043": "RoachInfestor (Aggressive)", + "Z044": "RoachHydra (Aggressive)", + "Z050": "Infestor (Economic)", + "Z052": "Ultralisk (Economic)", + "Z053": "Brood Lord (Economic)" + } + ], "3204": [ - "AI Build (Zerg)", - { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", - "AB06": "Straight to Air", - "AB23": "BaneLing Bust (Timing)", - "AB24": "Roach Rush (Timing)", - "AB25": "LingRoach (Timing)", - "AB27": "Mutalisk (Aggressive)", - "AB28": "MutaLing (Aggressive)", - "AB29": "RoachAttack (Aggressive)", - "AB30": "RoachInfestor (Aggressive)", - "AB31": "RoachHydra (Aggressive)", - "AB34": "Infestor (Economic)", - "AB35": "Ultralisk (Economic)", - "AB36": "Brood Lord (Economic)" - } - ], + "AI Build (Zerg)", + { + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", + "AB06": "Straight to Air", + "AB23": "BaneLing Bust (Timing)", + "AB24": "Roach Rush (Timing)", + "AB25": "LingRoach (Timing)", + "AB27": "Pure Mutalisk (Aggressive)", + "AB28": "MutaLing (Aggressive)", + "AB29": "RoachAttack (Aggressive)", + "AB30": "RoachInfestor (Aggressive)", + "AB31": "RoachHydra (Aggressive)", + "AB34": "Infestor (Economic)", + "AB35": "Ultralisk (Economic)", + "AB36": "Brood Lord (Economic)", + "Z030": "BaneLing Bust (Timing)", + "Z031": "Roach Rush (Timing)", + "Z032": "LingRoach (Timing)", + "Z040": "Mutalisk (Aggressive)", + "Z041": "MutaLing (Aggressive)", + "Z042": "RoachAttack (Aggressive)", + "Z043": "RoachInfestor (Aggressive)", + "Z044": "RoachHydra (Aggressive)", + "Z050": "Infestor (Economic)", + "Z052": "Ultralisk (Economic)", + "Z053": "Brood Lord (Economic)" + } + ], "3205": [ - "AI Build (Zerg)", - { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", - "AB06": "Straight to Air", - "AB23": "BaneLing Bust (Timing)", - "AB24": "Roach Rush (Timing)", - "AB25": "LingRoach (Timing)", - "AB27": "Mutalisk (Aggressive)", - "AB28": "MutaLing (Aggressive)", - "AB29": "RoachAttack (Aggressive)", - "AB30": "RoachInfestor (Aggressive)", - "AB31": "RoachHydra (Aggressive)", - "AB34": "Infestor (Economic)", - "AB35": "Ultralisk (Economic)", - "AB36": "Brood Lord (Economic)" - } - ], + "AI Build (Zerg)", + { + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", + "AB06": "Straight to Air", + "AB23": "BaneLing Bust (Timing)", + "AB24": "Roach Rush (Timing)", + "AB25": "LingRoach (Timing)", + "AB27": "Pure Mutalisk (Aggressive)", + "AB28": "MutaLing (Aggressive)", + "AB29": "RoachAttack (Aggressive)", + "AB30": "RoachInfestor (Aggressive)", + "AB31": "RoachHydra (Aggressive)", + "AB34": "Infestor (Economic)", + "AB35": "Ultralisk (Economic)", + "AB36": "Brood Lord (Economic)", + "Z030": "BaneLing Bust (Timing)", + "Z031": "Roach Rush (Timing)", + "Z032": "LingRoach (Timing)", + "Z040": "Mutalisk (Aggressive)", + "Z041": "MutaLing (Aggressive)", + "Z042": "RoachAttack (Aggressive)", + "Z043": "RoachInfestor (Aggressive)", + "Z044": "RoachHydra (Aggressive)", + "Z050": "Infestor (Economic)", + "Z052": "Ultralisk (Economic)", + "Z053": "Brood Lord (Economic)" + } + ], "3206": [ - "AI Build (Zerg)", - { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", - "AB06": "Straight to Air", - "AB23": "BaneLing Bust (Timing)", - "AB24": "Roach Rush (Timing)", - "AB25": "LingRoach (Timing)", - "AB27": "Mutalisk (Aggressive)", - "AB28": "MutaLing (Aggressive)", - "AB29": "RoachAttack (Aggressive)", - "AB30": "RoachInfestor (Aggressive)", - "AB31": "RoachHydra (Aggressive)", - "AB34": "Infestor (Economic)", - "AB35": "Ultralisk (Economic)", - "AB36": "Brood Lord (Economic)" - } - ], + "AI Build (Zerg)", + { + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", + "AB06": "Straight to Air", + "AB23": "BaneLing Bust (Timing)", + "AB24": "Roach Rush (Timing)", + "AB25": "LingRoach (Timing)", + "AB27": "Pure Mutalisk (Aggressive)", + "AB28": "MutaLing (Aggressive)", + "AB29": "RoachAttack (Aggressive)", + "AB30": "RoachInfestor (Aggressive)", + "AB31": "RoachHydra (Aggressive)", + "AB34": "Infestor (Economic)", + "AB35": "Ultralisk (Economic)", + "AB36": "Brood Lord (Economic)", + "Z030": "BaneLing Bust (Timing)", + "Z031": "Roach Rush (Timing)", + "Z032": "LingRoach (Timing)", + "Z040": "Mutalisk (Aggressive)", + "Z041": "MutaLing (Aggressive)", + "Z042": "RoachAttack (Aggressive)", + "Z043": "RoachInfestor (Aggressive)", + "Z044": "RoachHydra (Aggressive)", + "Z050": "Infestor (Economic)", + "Z052": "Ultralisk (Economic)", + "Z053": "Brood Lord (Economic)" + } + ], "3207": [ - "AI Build (Zerg)", - { - "AB00": "Any Build", - "AB02": "Full Rush", - "AB03": "Timing Attack", - "AB04": "Aggressive Push", - "AB05": "Economic Focus", - "AB06": "Straight to Air", - "AB23": "BaneLing Bust (Timing)", - "AB24": "Roach Rush (Timing)", - "AB25": "LingRoach (Timing)", - "AB27": "Mutalisk (Aggressive)", - "AB28": "MutaLing (Aggressive)", - "AB29": "RoachAttack (Aggressive)", - "AB30": "RoachInfestor (Aggressive)", - "AB31": "RoachHydra (Aggressive)", - "AB34": "Infestor (Economic)", - "AB35": "Ultralisk (Economic)", - "AB36": "Brood Lord (Economic)" - } - ], + "AI Build (Zerg)", + { + "AB00": "Any Build", + "AB02": "Full Rush", + "AB03": "Timing Attack", + "AB04": "Aggressive Push", + "AB05": "Economic Focus", + "AB06": "Straight to Air", + "AB23": "BaneLing Bust (Timing)", + "AB24": "Roach Rush (Timing)", + "AB25": "LingRoach (Timing)", + "AB27": "Pure Mutalisk (Aggressive)", + "AB28": "MutaLing (Aggressive)", + "AB29": "RoachAttack (Aggressive)", + "AB30": "RoachInfestor (Aggressive)", + "AB31": "RoachHydra (Aggressive)", + "AB34": "Infestor (Economic)", + "AB35": "Ultralisk (Economic)", + "AB36": "Brood Lord (Economic)", + "Z030": "BaneLing Bust (Timing)", + "Z031": "Roach Rush (Timing)", + "Z032": "LingRoach (Timing)", + "Z040": "Mutalisk (Aggressive)", + "Z041": "MutaLing (Aggressive)", + "Z042": "RoachAttack (Aggressive)", + "Z043": "RoachInfestor (Aggressive)", + "Z044": "RoachHydra (Aggressive)", + "Z050": "Infestor (Economic)", + "Z052": "Ultralisk (Economic)", + "Z053": "Brood Lord (Economic)" + } + ], "4000": [ - "Game Privacy", + "Game Privacy", { - "NoBO": "No Build Order", - "NoMH": "No Match History", + "NoBO": "No Build Order", + "NoMH": "No Match History", "Norm": "Normal" } - ], + ], "4001": [ - "Using Custom Observer UI", + "Using Custom Observer UI", { - "no": "Not Using Custom Observer UI", + "no": "Not Using Custom Observer UI", "yes": "Using Custom Observer UI" } + ], + "4005": [ + "Ready", + { + "no": "Not Ready", + "yes": "Ready" + } ] - }, - "decisions": "(dp0\nc__builtin__\nfrozenset\np1\n((lp2\nS'Mutalisk (Aggressive)'\np3\na(I3206\nVAB27\np4\ntp5\naVPure Mutalisk (Aggressive)\np6\natp7\nRp8\ng3\nsg1\n((lp9\nS'Hard'\np10\naVHarder\np11\na(I3004\nS'Hard'\np12\ntp13\natp14\nRp15\ng11\nsg1\n((lp16\n(I2001\nS'1v1'\np17\ntp18\naS'1 v 1'\np19\naV1v1\np20\natp21\nRp22\ng20\nsg1\n((lp23\n(I3104\nS'AB04'\np24\ntp25\naS'Agressive Push'\np26\naVAggressive Push\np27\natp28\nRp29\ng27\nsg1\n((lp30\nS'Agressive Push'\np31\naVAggressive Push\np32\na(I3199\nS'AB04'\np33\ntp34\natp35\nRp36\ng32\nsg1\n((lp37\nV6v6\np38\naS'6 v 6'\np39\na(I2001\nS'6v6'\np40\ntp41\natp42\nRp43\ng38\nsg1\n((lp44\nS'Agressive Push'\np45\na(I3102\nS'AB04'\np46\ntp47\naVAggressive Push\np48\natp49\nRp50\ng48\nsg1\n((lp51\nS'Mutalisk (Aggressive)'\np52\na(I3207\nVAB27\np53\ntp54\naVPure Mutalisk (Aggressive)\np55\natp56\nRp57\ng52\nsg1\n((lp58\nVArchonImmortal (Aggressive)\np59\naS'GateImmortal (Aggressive)'\np60\na(I3172\nVAB70\np61\ntp62\natp63\nRp64\ng60\nsg1\n((lp65\nI2003\naVTeams2v2\np66\naS'Team'\np67\natp68\nRp69\ng66\nsg1\n((lp70\nVLadder\np71\naS'Automated Match Making'\np72\na(I3009\nS'Amm'\np73\ntp74\natp75\nRp76\ng71\nsg1\n((lp77\n(I2001\nS'5v5'\np78\ntp79\naS'5 v 5'\np80\naV5v5\np81\natp82\nRp83\ng81\nsg1\n((lp84\nS'WarpGate (Timing)'\np85\na(I3174\nVAB64\np86\ntp87\naVFourGate (Timing)\np88\natp89\nRp90\ng85\nsg1\n((lp91\nS'Mutalisk (Aggressive)'\np92\naVPure Mutalisk (Aggressive)\np93\na(I3205\nVAB27\np94\ntp95\natp96\nRp97\ng92\nsg1\n((lp98\n(I3203\nVAB27\np99\ntp100\naS'Mutalisk (Aggressive)'\np101\naVPure Mutalisk (Aggressive)\np102\natp103\nRp104\ng101\nsg1\n((lp105\nI3141\naVAI Build (Terran)\np106\naS'AI Build'\np107\natp108\nRp109\ng106\nsg1\n((lp110\nVArchonImmortal (Aggressive)\np111\naS'GateImmortal (Aggressive)'\np112\na(I3173\nVAB70\np113\ntp114\natp115\nRp116\ng112\nsg1\n((lp117\n(I2001\nS'3v3'\np118\ntp119\naS'3 v 3'\np120\naV3v3\np121\natp122\nRp123\ng121\nsg1\n((lp124\n(I3168\nS'AB04'\np125\ntp126\naS'Agressive Push'\np127\naVAggressive Push\np128\natp129\nRp130\ng128\nsg1\n((lp131\n(I3200\nS'AB04'\np132\ntp133\naS'Agressive Push'\np134\naVAggressive Push\np135\natp136\nRp137\ng135\nsg1\n((lp138\nVAI Build (Protoss)\np139\naI3174\naS'AI Build'\np140\natp141\nRp142\ng139\nsg1\n((lp143\nS'Very Hard'\np144\naVElite\np145\na(I3004\nS'VyHd'\np146\ntp147\natp148\nRp149\ng145\nsg1\n((lp150\nS'Agressive Push'\np151\naVAggressive Push\np152\na(I3167\nS'AB04'\np153\ntp154\natp155\nRp156\ng152\nsg1\n((lp157\nI3204\naS'AI Build'\np158\naVAI Build (Zerg)\np159\natp160\nRp161\ng159\nsg1\n((lp162\nVInsane\np163\naS'Cheater 3 (Insane)'\np164\na(I3004\nS'Insa'\np165\ntp166\natp167\nRp168\ng163\nsg1\n((lp169\nS'Mutalisk (Aggressive)'\np170\naVPure Mutalisk (Aggressive)\np171\na(I3204\nVAB27\np172\ntp173\natp174\nRp175\ng170\nsg1\n((lp176\n(I3007\nS'Watc'\np177\ntp178\naS'Observer'\np179\naS'Watcher'\np180\natp181\nRp182\ng179\nsg1\n((lp183\nI3205\naVAI Build (Zerg)\np184\naS'AI Build'\np185\natp186\nRp187\ng184\nsg1\n((lp188\n(I3171\nVAB64\np189\ntp190\naS'WarpGate (Timing)'\np191\naVFourGate (Timing)\np192\natp193\nRp194\ng191\nsg1\n((lp195\nVTeams5v5\np196\naS'Team'\np197\naI2007\natp198\nRp199\ng196\nsg1\n((lp200\nI3171\naVAI Build (Protoss)\np201\naS'AI Build'\np202\natp203\nRp204\ng201\nsg1\n((lp205\nS'Unknown'\np206\naI2012\naS'Team'\np207\natp208\nRp209\ng207\nsg1\n((lp210\n(I3172\nVAB64\np211\ntp212\naS'WarpGate (Timing)'\np213\naVFourGate (Timing)\np214\natp215\nRp216\ng213\nsg1\n((lp217\nI3173\naS'AI Build'\np218\naVAI Build (Protoss)\np219\natp220\nRp221\ng219\nsg1\n((lp222\nVAI Build (Terran)\np223\naI3142\naS'AI Build'\np224\natp225\nRp226\ng223\nsg1\n((lp227\nI3172\naVAI Build (Protoss)\np228\naS'AI Build'\np229\natp230\nRp231\ng228\nsg1\n((lp232\nS'Level 1 (Very Easy)'\np233\na(I3004\nS'VyEy'\np234\ntp235\naVVery Easy\np236\natp237\nRp238\ng236\nsg1\n((lp239\nS'Agressive Push'\np240\naVAggressive Push\np241\na(I3135\nS'AB04'\np242\ntp243\natp244\nRp245\ng241\nsg1\n((lp246\nV2v2\np247\naS'2 v 2'\np248\na(I2001\nS'2v2'\np249\ntp250\natp251\nRp252\ng247\nsg1\n((lp253\nS'Agressive Push'\np254\na(I3166\nS'AB04'\np255\ntp256\naVAggressive Push\np257\natp258\nRp259\ng257\nsg1\n((lp260\nVArchonImmortal (Aggressive)\np261\na(I3175\nVAB70\np262\ntp263\naS'GateImmortal (Aggressive)'\np264\natp265\nRp266\ng264\nsg1\n((lp267\nVTeamsFFA\np268\naI2006\naS'Team'\np269\natp270\nRp271\ng268\nsg1\n((lp272\nS'AI Build'\np273\naVAI Build (Terran)\np274\naI3143\natp275\nRp276\ng274\nsg1\n((lp277\n(I3171\nVAB70\np278\ntp279\naVArchonImmortal (Aggressive)\np280\naS'GateImmortal (Aggressive)'\np281\natp282\nRp283\ng281\nsg1\n((lp284\nVTeams7v7\np285\naI2011\naS'Team'\np286\natp287\nRp288\ng285\nsg1\n((lp289\nS'WarpGate (Timing)'\np290\na(I3175\nVAB64\np291\ntp292\naVFourGate (Timing)\np293\natp294\nRp295\ng290\nsg1\n((lp296\nS'WarpGate (Timing)'\np297\na(I3173\nVAB64\np298\ntp299\naVFourGate (Timing)\np300\natp301\nRp302\ng297\nsg1\n((lp303\nVMedium\np304\naS'Level 3 (Medium)'\np305\na(I3004\nS'Medi'\np306\ntp307\natp308\nRp309\ng304\nsg1\n((lp310\nI3140\naS'AI Build'\np311\naVAI Build (Terran)\np312\natp313\nRp314\ng312\nsg1\n((lp315\nVTeams4v4\np316\naI2005\naS'Team'\np317\natp318\nRp319\ng316\nsg1\n((lp320\nS'Agressive Push'\np321\na(I3198\nS'AB04'\np322\ntp323\naVAggressive Push\np324\natp325\nRp326\ng324\nsg1\n((lp327\nVArchonImmortal (Aggressive)\np328\na(I3174\nVAB70\np329\ntp330\naS'GateImmortal (Aggressive)'\np331\natp332\nRp333\ng331\nsg1\n((lp334\n(I3136\nS'AB04'\np335\ntp336\naS'Agressive Push'\np337\naVAggressive Push\np338\natp339\nRp340\ng338\nsg1\n((lp341\nI2008\naVTeams6v6\np342\naS'Team'\np343\natp344\nRp345\ng342\nsg1\n((lp346\nS'Agressive Push'\np347\naVAggressive Push\np348\na(I3103\nS'AB04'\np349\ntp350\natp351\nRp352\ng348\nsg1\n((lp353\nV4v4\np354\naS'4 v 4'\np355\na(I2001\nS'4v4'\np356\ntp357\natp358\nRp359\ng354\nsg1\n((lp360\nS'Agressive Push'\np361\na(I3134\nS'AB04'\np362\ntp363\naVAggressive Push\np364\natp365\nRp366\ng364\nsg1\n((lp367\nVTeams1v1\np368\naI2002\naS'Team'\np369\natp370\nRp371\ng368\nsg1\n((lp372\nI3139\naS'AI Build'\np373\naVAI Build (Terran)\np374\natp375\nRp376\ng374\nsg1\n((lp377\nS'AI Build'\np378\naVAI Build (Zerg)\np379\naI3207\natp380\nRp381\ng379\nsg1\n((lp382\n(I2001\nS'FFA'\np383\ntp384\naS'Free For All'\np385\naVFFA\np386\natp387\nRp388\ng386\nsg1\n((lp389\nVAI Build (Zerg)\np390\naI3206\naS'AI Build'\np391\natp392\nRp393\ng390\nsg1\n((lp394\nVTeams3v3\np395\naI2004\naS'Team'\np396\natp397\nRp398\ng395\nsg1\n((lp399\nVAI Build (Protoss)\np400\naS'AI Build'\np401\naI3175\natp402\nRp403\ng400\nsg1\n((lp404\nS'Level 2 (Easy)'\np405\na(I3004\nS'Easy'\np406\ntp407\naVEasy\np408\natp409\nRp410\ng408\nsg1\n((lp411\nI3203\naS'AI Build'\np412\naVAI Build (Zerg)\np413\natp414\nRp415\ng413\ns." -} + }, + "decisions": "(dp0\nc__builtin__\nfrozenset\np1\n((lp2\nS'Hard'\np3\naVHarder\np4\na(I3004\nS'Hard'\np5\ntp6\natp7\nRp8\ng4\nsg1\n((lp9\n(I2001\nS'1v1'\np10\ntp11\naS'1 v 1'\np12\naV1v1\np13\natp14\nRp15\ng13\nsg1\n((lp16\n(I3104\nS'AB04'\np17\ntp18\naS'Agressive Push'\np19\naVAggressive Push\np20\natp21\nRp22\ng20\nsg1\n((lp23\nS'Agressive Push'\np24\naVAggressive Push\np25\na(I3199\nS'AB04'\np26\ntp27\natp28\nRp29\ng25\nsg1\n((lp30\nV6v6\np31\naS'6 v 6'\np32\na(I2001\nS'6v6'\np33\ntp34\natp35\nRp36\ng31\nsg1\n((lp37\nS'Agressive Push'\np38\na(I3102\nS'AB04'\np39\ntp40\naVAggressive Push\np41\natp42\nRp43\ng41\nsg1\n((lp44\nI2003\naVTeams2v2\np45\naS'Team'\np46\natp47\nRp48\ng45\nsg1\n((lp49\nVLadder\np50\naS'Automated Match Making'\np51\na(I3009\nS'Amm'\np52\ntp53\natp54\nRp55\ng50\nsg1\n((lp56\n(I2001\nS'5v5'\np57\ntp58\naS'5 v 5'\np59\naV5v5\np60\natp61\nRp62\ng60\nsg1\n((lp63\nVFree For All Teams\np64\naS'Free For All Archon'\np65\na(I2000\nVFFAT\np66\ntp67\natp68\nRp69\ng65\nsg1\n((lp70\nI3141\naVAI Build (Terran)\np71\naS'AI Build'\np72\natp73\nRp74\ng71\nsg1\n((lp75\n(I2001\nS'3v3'\np76\ntp77\naS'3 v 3'\np78\naV3v3\np79\natp80\nRp81\ng79\nsg1\n((lp82\n(I3168\nS'AB04'\np83\ntp84\naS'Agressive Push'\np85\naVAggressive Push\np86\natp87\nRp88\ng86\nsg1\n((lp89\n(I3200\nS'AB04'\np90\ntp91\naS'Agressive Push'\np92\naVAggressive Push\np93\natp94\nRp95\ng93\nsg1\n((lp96\nVAI Build (Protoss)\np97\naI3174\naS'AI Build'\np98\natp99\nRp100\ng97\nsg1\n((lp101\nS'Very Hard'\np102\naVElite\np103\na(I3004\nS'VyHd'\np104\ntp105\natp106\nRp107\ng103\nsg1\n((lp108\nS'Agressive Push'\np109\naVAggressive Push\np110\na(I3167\nS'AB04'\np111\ntp112\natp113\nRp114\ng110\nsg1\n((lp115\nI3204\naS'AI Build'\np116\naVAI Build (Zerg)\np117\natp118\nRp119\ng117\nsg1\n((lp120\nVInsane\np121\naS'Cheater 3 (Insane)'\np122\na(I3004\nS'Insa'\np123\ntp124\natp125\nRp126\ng121\nsg1\n((lp127\n(I3007\nS'Watc'\np128\ntp129\naS'Observer'\np130\naS'Watcher'\np131\natp132\nRp133\ng130\nsg1\n((lp134\nI3205\naVAI Build (Zerg)\np135\naS'AI Build'\np136\natp137\nRp138\ng135\nsg1\n((lp139\nVTeams5v5\np140\naS'Team'\np141\naI2007\natp142\nRp143\ng140\nsg1\n((lp144\nI3171\naVAI Build (Protoss)\np145\naS'AI Build'\np146\natp147\nRp148\ng145\nsg1\n((lp149\nS'Unknown'\np150\naI2012\naS'Team'\np151\natp152\nRp153\ng151\nsg1\n((lp154\nI3173\naS'AI Build'\np155\naVAI Build (Protoss)\np156\natp157\nRp158\ng156\nsg1\n((lp159\nVAI Build (Terran)\np160\naI3142\naS'AI Build'\np161\natp162\nRp163\ng160\nsg1\n((lp164\nI3172\naVAI Build (Protoss)\np165\naS'AI Build'\np166\natp167\nRp168\ng165\nsg1\n((lp169\nS'Level 1 (Very Easy)'\np170\na(I3004\nS'VyEy'\np171\ntp172\naVVery Easy\np173\natp174\nRp175\ng173\nsg1\n((lp176\nS'Agressive Push'\np177\naVAggressive Push\np178\na(I3135\nS'AB04'\np179\ntp180\natp181\nRp182\ng178\nsg1\n((lp183\nV2v2\np184\naS'2 v 2'\np185\na(I2001\nS'2v2'\np186\ntp187\natp188\nRp189\ng184\nsg1\n((lp190\nS'Agressive Push'\np191\na(I3166\nS'AB04'\np192\ntp193\naVAggressive Push\np194\natp195\nRp196\ng194\nsg1\n((lp197\nVTeamsFFA\np198\naI2006\naS'Team'\np199\natp200\nRp201\ng198\nsg1\n((lp202\nS'AI Build'\np203\naVAI Build (Terran)\np204\naI3143\natp205\nRp206\ng204\nsg1\n((lp207\nVTeams7v7\np208\naI2011\naS'Team'\np209\natp210\nRp211\ng208\nsg1\n((lp212\nVMedium\np213\naS'Level 3 (Medium)'\np214\na(I3004\nS'Medi'\np215\ntp216\natp217\nRp218\ng213\nsg1\n((lp219\nI3140\naS'AI Build'\np220\naVAI Build (Terran)\np221\natp222\nRp223\ng221\nsg1\n((lp224\nVTeams4v4\np225\naI2005\naS'Team'\np226\natp227\nRp228\ng225\nsg1\n((lp229\nS'Agressive Push'\np230\na(I3198\nS'AB04'\np231\ntp232\naVAggressive Push\np233\natp234\nRp235\ng233\nsg1\n((lp236\n(I3136\nS'AB04'\np237\ntp238\naS'Agressive Push'\np239\naVAggressive Push\np240\natp241\nRp242\ng240\nsg1\n((lp243\nI2008\naVTeams6v6\np244\naS'Team'\np245\natp246\nRp247\ng244\nsg1\n((lp248\nS'Agressive Push'\np249\naVAggressive Push\np250\na(I3103\nS'AB04'\np251\ntp252\natp253\nRp254\ng250\nsg1\n((lp255\nV4v4\np256\naS'4 v 4'\np257\na(I2001\nS'4v4'\np258\ntp259\natp260\nRp261\ng256\nsg1\n((lp262\nS'Agressive Push'\np263\na(I3134\nS'AB04'\np264\ntp265\naVAggressive Push\np266\natp267\nRp268\ng266\nsg1\n((lp269\nVTeams1v1\np270\naI2002\naS'Team'\np271\natp272\nRp273\ng270\nsg1\n((lp274\nI3139\naS'AI Build'\np275\naVAI Build (Terran)\np276\natp277\nRp278\ng276\nsg1\n((lp279\nS'AI Build'\np280\naVAI Build (Zerg)\np281\naI3207\natp282\nRp283\ng281\nsg1\n((lp284\n(I2001\nS'FFA'\np285\ntp286\naS'Free For All'\np287\naVFFA\np288\natp289\nRp290\ng288\nsg1\n((lp291\nVAI Build (Zerg)\np292\naI3206\naS'AI Build'\np293\natp294\nRp295\ng292\nsg1\n((lp296\nVTeams3v3\np297\naI2004\naS'Team'\np298\natp299\nRp300\ng297\nsg1\n((lp301\nVAI Build (Protoss)\np302\naS'AI Build'\np303\naI3175\natp304\nRp305\ng302\nsg1\n((lp306\nS'Level 2 (Easy)'\np307\na(I3004\nS'Easy'\np308\ntp309\naVEasy\np310\natp311\nRp312\ng310\nsg1\n((lp313\nI3203\naS'AI Build'\np314\naVAI Build (Zerg)\np315\natp316\nRp317\ng315\ns." +} \ No newline at end of file diff --git a/sc2reader/data/unit_lookup.csv b/sc2reader/data/unit_lookup.csv index b7ecf82f..aa662358 100755 --- a/sc2reader/data/unit_lookup.csv +++ b/sc2reader/data/unit_lookup.csv @@ -521,4 +521,137 @@ ThorAALance,ThorAALance OracleWeapon,OracleWeapon TempestWeaponGround,TempestWeaponGround SeekerMissile,SeekerMissile -ProtossVespeneGeyser,ProtossVespeneGeyser \ No newline at end of file +ProtossVespeneGeyser,ProtossVespeneGeyser +Cyclone,Cyclone +Rocks2x2NonConjoined,Rocks2x2NonConjoined +OverlordGenerateCreepKeybind,OverlordGenerateCreepKeybind +Debris2x2NonConjoined,Debris2x2NonConjoined +EnemyPathingBlocker1x1,EnemyPathingBlocker1x1 +EnemyPathingBlocker2x2,EnemyPathingBlocker2x2 +EnemyPathingBlocker4x4,EnemyPathingBlocker4x4 +EnemyPathingBlocker8x8,EnemyPathingBlocker8x8 +EnemyPathingBlocker16x16,EnemyPathingBlocker16x16 +ScopeTest,ScopeTest +XelNaga_Caverns_DoorE,XelNaga_Caverns_DoorE +XelNaga_Caverns_DoorEOpened,XelNaga_Caverns_DoorEOpened +XelNaga_Caverns_DoorN,XelNaga_Caverns_DoorN +XelNaga_Caverns_DoorNE,XelNaga_Caverns_DoorNE +XelNaga_Caverns_DoorNEOpened,XelNaga_Caverns_DoorNEOpened +XelNaga_Caverns_DoorNOpened,XelNaga_Caverns_DoorNOpened +XelNaga_Caverns_DoorNW,XelNaga_Caverns_DoorNW +XelNaga_Caverns_DoorNWOpened,XelNaga_Caverns_DoorNWOpened +XelNaga_Caverns_DoorS,XelNaga_Caverns_DoorS +XelNaga_Caverns_DoorSE,XelNaga_Caverns_DoorSE +XelNaga_Caverns_DoorSEOpened,XelNaga_Caverns_DoorSEOpened +XelNaga_Caverns_DoorSOpened,XelNaga_Caverns_DoorSOpened +XelNaga_Caverns_DoorSW,XelNaga_Caverns_DoorSW +XelNaga_Caverns_DoorSWOpened,XelNaga_Caverns_DoorSWOpened +XelNaga_Caverns_DoorW,XelNaga_Caverns_DoorW +XelNaga_Caverns_DoorWOpened,XelNaga_Caverns_DoorWOpened +XelNaga_Caverns_Floating_BridgeNE8Out,XelNaga_Caverns_Floating_BridgeNE8Out +XelNaga_Caverns_Floating_BridgeNE8,XelNaga_Caverns_Floating_BridgeNE8 +XelNaga_Caverns_Floating_BridgeNW8Out,XelNaga_Caverns_Floating_BridgeNW8Out +XelNaga_Caverns_Floating_BridgeNW8,XelNaga_Caverns_Floating_BridgeNW8 +XelNaga_Caverns_Floating_BridgeNE10Out,XelNaga_Caverns_Floating_BridgeNE10Out +XelNaga_Caverns_Floating_BridgeNE10,XelNaga_Caverns_Floating_BridgeNE10 +XelNaga_Caverns_Floating_BridgeNW10Out,XelNaga_Caverns_Floating_BridgeNW10Out +XelNaga_Caverns_Floating_BridgeNW10,XelNaga_Caverns_Floating_BridgeNW10 +XelNaga_Caverns_Floating_BridgeNE12Out,XelNaga_Caverns_Floating_BridgeNE12Out +XelNaga_Caverns_Floating_BridgeNE12,XelNaga_Caverns_Floating_BridgeNE12 +XelNaga_Caverns_Floating_BridgeNW12Out,XelNaga_Caverns_Floating_BridgeNW12Out +XelNaga_Caverns_Floating_BridgeNW12,XelNaga_Caverns_Floating_BridgeNW12 +XelNaga_Caverns_Floating_BridgeH8Out,XelNaga_Caverns_Floating_BridgeH8Out +XelNaga_Caverns_Floating_BridgeH8,XelNaga_Caverns_Floating_BridgeH8 +XelNaga_Caverns_Floating_BridgeV8Out,XelNaga_Caverns_Floating_BridgeV8Out +XelNaga_Caverns_Floating_BridgeV8,XelNaga_Caverns_Floating_BridgeV8 +XelNaga_Caverns_Floating_BridgeH10Out,XelNaga_Caverns_Floating_BridgeH10Out +XelNaga_Caverns_Floating_BridgeH10,XelNaga_Caverns_Floating_BridgeH10 +XelNaga_Caverns_Floating_BridgeV10Out,XelNaga_Caverns_Floating_BridgeV10Out +XelNaga_Caverns_Floating_BridgeV10,XelNaga_Caverns_Floating_BridgeV10 +XelNaga_Caverns_Floating_BridgeH12Out,XelNaga_Caverns_Floating_BridgeH12Out +XelNaga_Caverns_Floating_BridgeH12,XelNaga_Caverns_Floating_BridgeH12 +XelNaga_Caverns_Floating_BridgeV12Out,XelNaga_Caverns_Floating_BridgeV12Out +XelNaga_Caverns_Floating_BridgeV12,XelNaga_Caverns_Floating_BridgeV12 +YoinkSiegeTankMissile,YoinkSiegeTankMissile +XelNaga_Caverns_Door,XelNaga_Caverns_Door +Ice2x2NonConjoined,Ice2x2NonConjoined +RavagerCocoon,RavagerCocoon +Ravager,Ravager +RavagerBurrowed,RavagerBurrowed +ThorAP,ThorAP +LocustMPFlying,LocustMPFlying +Disruptor,Disruptor +Adept,Adept +AiurTempleBridgeNE8Out,AiurTempleBridgeNE8Out +AiurTempleBridgeNE10Out,AiurTempleBridgeNE10Out +AiurTempleBridgeNE12Out,AiurTempleBridgeNE12Out +AiurTempleBridgeNW8Out,AiurTempleBridgeNW8Out +AiurTempleBridgeNW10Out,AiurTempleBridgeNW10Out +AiurTempleBridgeNW12Out,AiurTempleBridgeNW12Out +VoidMPImmortalReviveCorpse,VoidMPImmortalReviveCorpse +GuardianCocoonMP,GuardianCocoonMP +GuardianMP,GuardianMP +DevourerCocoonMP,DevourerCocoonMP +DevourerMP,DevourerMP +DefilerMPBurrowed,DefilerMPBurrowed +DefilerMP,DefilerMP +OracleStasisTrap,OracleStasisTrap +DisruptorPhased,DisruptorPhased +LiberatorAG,LiberatorAG +Liberator,Liberator +LocustMPPrecursor,LocustMPPrecursor +ReleaseInterceptorsBeacon,ReleaseInterceptorsBeacon +AdeptPhaseShift,AdeptPhaseShift +RavagerCorrosiveBileMissile,RavagerCorrosiveBileMissile +HydraliskImpaleMissile,HydraliskImpaleMissile +CycloneMissile,CycloneMissile +RavagerWeaponMissile,RavagerWeaponMissile +ScoutMPAirWeaponLeft,ScoutMPAirWeaponLeft +ScoutMPAirWeaponRight,ScoutMPAirWeaponRight +ArbiterMPWeaponMissile,ArbiterMPWeaponMissile +GuardianMPWeapon,GuardianMPWeapon +DevourerMPWeaponMissile,DevourerMPWeaponMissile +QueenMPEnsnareMissile,QueenMPEnsnareMissile +QueenMPSpawnBroodlingsMissile,QueenMPSpawnBroodlingsMissile +LightningBombWeapon,LightningBombWeapon +HERCPlacement,HERCPlacement +GrappleWeapon,GrappleWeapon +CausticSprayMissile,CausticSprayMissile +ParasiticBombMissile,ParasiticBombMissile +ParasiticBombDummy,ParasiticBombDummy +AdeptWeapon,AdeptWeapon +AdeptUpgradeWeapon,AdeptUpgradeWeapon +LiberatorMissile,LiberatorMissile +LiberatorDamageMissile,LiberatorDamageMissile +LiberatorAGMissile,LiberatorAGMissile +KD8Charge,KD8Charge +KD8ChargeWeapon,KD8ChargeWeapon +XelNagaDestructibleRampBlocker,XelNagaDestructibleRampBlocker +HERC,HERC +FlyoverUnit,FlyoverUnit +ScoutMP,ScoutMP +ScourgeMP,ScourgeMP +QueenMP,QueenMP +XelNagaDestructibleRampBlocker6S,XelNagaDestructibleRampBlocker6S +XelNagaDestructibleRampBlocker6SE,XelNagaDestructibleRampBlocker6SE +XelNagaDestructibleRampBlocker6E,XelNagaDestructibleRampBlocker6E +XelNagaDestructibleRampBlocker6NE,XelNagaDestructibleRampBlocker6NE +XelNagaDestructibleRampBlocker6N,XelNagaDestructibleRampBlocker6N +XelNagaDestructibleRampBlocker6NW,XelNagaDestructibleRampBlocker6NW +XelNagaDestructibleRampBlocker6W,XelNagaDestructibleRampBlocker6W +XelNagaDestructibleRampBlocker6SW,XelNagaDestructibleRampBlocker6SW +XelNagaDestructibleRampBlocker8S,XelNagaDestructibleRampBlocker8S +XelNagaDestructibleRampBlocker8SE,XelNagaDestructibleRampBlocker8SE +XelNagaDestructibleRampBlocker8E,XelNagaDestructibleRampBlocker8E +XelNagaDestructibleRampBlocker8NE,XelNagaDestructibleRampBlocker8NE +XelNagaDestructibleRampBlocker8N,XelNagaDestructibleRampBlocker8N +XelNagaDestructibleRampBlocker8NW,XelNagaDestructibleRampBlocker8NW +XelNagaDestructibleRampBlocker8W,XelNagaDestructibleRampBlocker8W +XelNagaDestructibleRampBlocker8SW,XelNagaDestructibleRampBlocker8SW +MineralField750,MineralField750 +RichMineralField750,RichMineralField750 +LabMineralField750,LabMineralField750 +TransportOverlordCocoon,TransportOverlordCocoon +OverlordTransport,OverlordTransport +BypassArmorDrone,BypassArmorDrone +CorrosiveParasiteWeapon,CorrosiveParasiteWeapon diff --git a/sc2reader/events/game.py b/sc2reader/events/game.py index 03d69bba..d2378b97 100644 --- a/sc2reader/events/game.py +++ b/sc2reader/events/game.py @@ -93,7 +93,7 @@ def __init__(self, frame, pid, data): self.use_ai_beacons = data['use_ai_beacons'] #: Are workers sent to auto-mine on game start - self.starting_rally = data['starting_rally'] + self.starting_rally = data.get('starting_rally', 1) # missing around build 38749. Assume true #: self.debug_pause_enabled = data['debug_pause_enabled'] @@ -410,7 +410,10 @@ def create_control_group_event(frame, pid, data): elif update_type == 2: return GetControlGroupEvent(frame, pid, data) elif update_type == 3: - # TODO: What could this be?!? + return ControlGroupEvent(frame, pid, data) + else: + # No idea what this is but we're seeing update_types of 4 and 5 in 3.0 + # diverging from ggtracker/sc2reader because I do not have this type return ControlGroupEvent(frame, pid, data) diff --git a/sc2reader/objects.py b/sc2reader/objects.py index c3e9bdf7..e60b45fb 100644 --- a/sc2reader/objects.py +++ b/sc2reader/objects.py @@ -144,7 +144,7 @@ def __init__(self, sid, slot_data): self.toon_id = int(parts[3]) #: A index to the user that is the leader of the archon team - self.achon_leader_id = slot_data['tandem_leader_user_id'] + self.archon_leader_id = slot_data['tandem_leader_user_id'] #: A list of :class:`Event` objects representing all the game events #: generated by the person over the course of the game diff --git a/sc2reader/readers.py b/sc2reader/readers.py index 1c369378..a3962a87 100644 --- a/sc2reader/readers.py +++ b/sc2reader/readers.py @@ -77,12 +77,13 @@ def __call__(self, data, replay): allowedDifficulty=data.read_bits(data.read_bits(6)), allowedControls=data.read_bits(data.read_uint8()), allowed_observe_types=data.read_bits(data.read_bits(2)), - allowed_ai_builds=data.read_bits(data.read_bits(7)) if replay.base_build >= 23925 else None, + allowed_ai_builds=data.read_bits(data.read_bits(8 if replay.base_build >= 38749 else 7)) if replay.base_build >= 23925 else None, ) for i in range(data.read_bits(5))], default_difficulty=data.read_bits(6), - default_ai_build=data.read_bits(7) if replay.base_build >= 23925 else None, + default_ai_build=data.read_bits(8 if replay.base_build >= 38749 else 7) if replay.base_build >= 23925 else None, cache_handles=[DepotFile(data.read_aligned_bytes(40)) for i in range(data.read_bits(6 if replay.base_build >= 21955 else 4))], has_extension_mod=data.read_bool() if replay.base_build >= 27950 else None, + has_non_blizzard_extension_mod=data.read_bool() if replay.base_build >= 42932 else None, is_blizzardMap=data.read_bool(), is_premade_ffa=data.read_bool(), is_coop_mode=data.read_bool() if replay.base_build >= 23925 else None, @@ -99,7 +100,7 @@ def __call__(self, data, replay): colorPref=data.read_bits(5) if data.read_bool() else None, race_pref=data.read_uint8() if data.read_bool() else None, difficulty=data.read_bits(6), - ai_build=data.read_bits(7) if replay.base_build >= 23925 else None, + ai_build=data.read_bits(8 if replay.base_build >= 38749 else 7) if replay.base_build >= 23925 else None, handicap=data.read_bits(7), observe=data.read_bits(2), logo_index=data.read_uint32() if replay.base_build >= 32283 else None, @@ -115,13 +116,20 @@ def __call__(self, data, replay): licenses=[data.read_uint32() for i in range(data.read_bits(9))] if replay.base_build >= 19132 else [], tandem_leader_user_id=data.read_bits(4) if replay.base_build >= 34784 and data.read_bool() else None, commander=data.read_aligned_bytes(data.read_bits(9)) if replay.base_build >= 34784 else None, + commander_level=data.read_uint32() if replay.base_build >= 36442 else None, + has_silence_penalty=data.read_bool() if replay.base_build >= 38215 else None, + tandem_id=data.read_bits(4) if replay.base_build >= 39576 and data.read_bool() else None, + commander_mastery_level=data.read_uint32() if replay.base_build >= 42932 else None, + commander_mastery_talents=[data.read_uint32() for i in range(data.read_bits(3))] if replay.base_build >= 42932 else [], + reward_overrides=[data.read_unit32() for i in range(data.read_bits(17))] if replay.base_build >= 47185 else None, ) for i in range(data.read_bits(5))], random_seed=data.read_uint32(), host_user_id=data.read_bits(4) if data.read_bool() else None, is_single_player=data.read_bool(), + picked_map_tag=data.read_uint8() if replay.base_build >= 36442 else None, game_duration=data.read_uint32(), default_difficulty=data.read_bits(6), - default_ai_build=data.read_bits(7) if replay.base_build >= 24764 else None, + default_ai_build=data.read_bits(8 if replay.base_build >= 38749 else 7) if replay.base_build >= 24764 else None, ), ) if not data.done(): @@ -1707,6 +1715,134 @@ def game_user_leave_event(self, data): ) +class GameEventsReader_36442(GameEventsReader_34784): + + def control_group_update_event(self, data): + return dict( + control_group_index=data.read_bits(4), + control_group_update=data.read_bits(3), + remove_mask={ # Choice + 0: lambda: ('None', None), + 1: lambda: ('Mask', self.read_selection_bitmask(data, data.read_bits(9))), + 2: lambda: ('OneIndices', [data.read_bits(9) for i in range(data.read_bits(9))]), + 3: lambda: ('ZeroIndices', [data.read_bits(9) for i in range(data.read_bits(9))]), + }[data.read_bits(2)](), + ) + +class GameEventsReader_38215(GameEventsReader_36442): + + def command_event(self, data): + # this function is exactly the same as command_event() from GameEventsReader_36442 + # with the only change being that flags now has 25 bits instead of 23. + return dict( + flags=data.read_bits(25), + ability=dict( + ability_link=data.read_uint16(), + ability_command_index=data.read_bits(5), + ability_command_data=data.read_uint8() if data.read_bool() else None, + ) if data.read_bool() else None, + data={ # Choice + 0: lambda: ('None', None), + 1: lambda: ('TargetPoint', dict( + point=dict( + x=data.read_bits(20), + y=data.read_bits(20), + z=data.read_uint32() - 2147483648, + ) + )), + 2: lambda: ('TargetUnit', dict( + flags=data.read_uint16(), + timer=data.read_uint8(), + unit_tag=data.read_uint32(), + unit_link=data.read_uint16(), + control_player_id=data.read_bits(4) if data.read_bool() else None, + upkeep_player_id=data.read_bits(4) if data.read_bool() else None, + point=dict( + x=data.read_bits(20), + y=data.read_bits(20), + z=data.read_uint32() - 2147483648, + ), + )), + 3: lambda: ('Data', dict( + data=data.read_uint32() + )), + }[data.read_bits(2)](), + sequence=data.read_uint32() + 1, + other_unit_tag=data.read_uint32() if data.read_bool() else None, + unit_group=data.read_uint32() if data.read_bool() else None, + ) + + def user_options_event(self, data): + # only change: removes starting_rally + return dict( + game_fully_downloaded=data.read_bool(), + development_cheats_enabled=data.read_bool(), + test_cheats_enabled=data.read_bool(), + multiplayer_cheats_enabled=data.read_bool(), + sync_checksumming_enabled=data.read_bool(), + is_map_to_map_transition=data.read_bool(), + debug_pause_enabled=data.read_bool(), + use_galaxy_asserts=data.read_bool(), + platform_mac=data.read_bool(), + camera_follow=data.read_bool(), + base_build_num=data.read_uint32(), + build_num=data.read_uint32(), + version_flags=data.read_uint32(), + hotkey_profile=data.read_aligned_string(data.read_bits(9)), + use_ai_beacons=None, + ) + +class GameEventsReader_38749(GameEventsReader_38215): + + def trigger_ping_event(self, data): + return dict( + point=dict( + x=data.read_uint32() - 2147483648, + y=data.read_uint32() - 2147483648, + ), + unit_tag=data.read_uint32(), + unit_link=data.read_uint16(), + unit_control_player_id=(data.read_bits(4) if data.read_bool() else None), + unit_upkeep_player_id=(data.read_bits(4) if data.read_bool() else None), + unit_position=dict( + x=data.read_bits(20), + y=data.read_bits(20), + z=data.read_bits(32) - 2147483648, + ), + pinged_minimap=data.read_bool(), + option=data.read_uint32() - 2147483648, + ) + +class GameEventsReader_38996(GameEventsReader_38749): + + def trigger_ping_event(self, data): + return dict( + point=dict( + x=data.read_uint32() - 2147483648, + y=data.read_uint32() - 2147483648, + ), + unit_tag=data.read_uint32(), + unit_link=data.read_uint16(), + unit_control_player_id=(data.read_bits(4) if data.read_bool() else None), + unit_upkeep_player_id=(data.read_bits(4) if data.read_bool() else None), + unit_position=dict( + x=data.read_bits(20), + y=data.read_bits(20), + z=data.read_bits(32) - 2147483648, + ), + unit_is_under_construction=data.read_bool(), + pinged_minimap=data.read_bool(), + option=data.read_uint32() - 2147483648, + ) + + +class GameEventsReader_41743(GameEventsReader_38996): + def decrement_game_time_remaining_event(self, data): + return dict( + decrement_ms=data.read_bits(32) + ) + + class TrackerEventsReader(object): def __init__(self): diff --git a/sc2reader/resources.py b/sc2reader/resources.py index c3b42bc6..31f3a892 100644 --- a/sc2reader/resources.py +++ b/sc2reader/resources.py @@ -506,6 +506,7 @@ def load_game_events(self): return self.game_events = self.raw_data['replay.game.events'] + self.game_events = [event for event in self.game_events if event is not None] self.events = sorted(self.events+self.game_events, key=lambda e: e.frame) # hideous hack for HotS 2.0.0.23925, see https://github.com/GraylinKim/sc2reader/issues/87 @@ -578,7 +579,12 @@ def register_default_readers(self): self.register_reader('replay.game.events', readers.GameEventsReader_24247(), lambda r: 24247 <= r.base_build < 26490) self.register_reader('replay.game.events', readers.GameEventsReader_26490(), lambda r: 26490 <= r.base_build < 27950) self.register_reader('replay.game.events', readers.GameEventsReader_27950(), lambda r: 27950 <= r.base_build < 34784) - self.register_reader('replay.game.events', readers.GameEventsReader_34784(), lambda r: 34784 <= r.base_build) + self.register_reader('replay.game.events', readers.GameEventsReader_34784(), lambda r: 34784 <= r.base_build < 36442) + self.register_reader('replay.game.events', readers.GameEventsReader_36442(), lambda r: 36442 <= r.base_build < 38215) + self.register_reader('replay.game.events', readers.GameEventsReader_38215(), lambda r: 38215 <= r.base_build < 38749) + self.register_reader('replay.game.events', readers.GameEventsReader_38749(), lambda r: 38749 <= r.base_build < 38996) + self.register_reader('replay.game.events', readers.GameEventsReader_38996(), lambda r: 38996 <= r.base_build < 41743) + self.register_reader('replay.game.events', readers.GameEventsReader_41743(), lambda r: 41743 <= r.base_build) self.register_reader('replay.game.events', readers.GameEventsReader_HotSBeta(), lambda r: r.versions[1] == 2 and r.build < 24247) def register_default_datapacks(self): diff --git a/test_replays/3.0.0.38215/first.SC2Replay b/test_replays/3.0.0.38215/first.SC2Replay new file mode 100644 index 00000000..373abc28 Binary files /dev/null and b/test_replays/3.0.0.38215/first.SC2Replay differ diff --git a/test_replays/3.0.0.38996/1.SC2Replay b/test_replays/3.0.0.38996/1.SC2Replay new file mode 100644 index 00000000..8dd68049 Binary files /dev/null and b/test_replays/3.0.0.38996/1.SC2Replay differ diff --git a/test_replays/3.0.0.38996/2.SC2Replay b/test_replays/3.0.0.38996/2.SC2Replay new file mode 100644 index 00000000..29528a07 Binary files /dev/null and b/test_replays/3.0.0.38996/2.SC2Replay differ diff --git a/test_replays/3.1.0/1.SC2Replay b/test_replays/3.1.0/1.SC2Replay new file mode 100644 index 00000000..6f7f6092 Binary files /dev/null and b/test_replays/3.1.0/1.SC2Replay differ diff --git a/test_replays/3.1.0/2.SC2Replay b/test_replays/3.1.0/2.SC2Replay new file mode 100644 index 00000000..8b9bd074 Binary files /dev/null and b/test_replays/3.1.0/2.SC2Replay differ diff --git a/test_replays/3.1.0/3.SC2Replay b/test_replays/3.1.0/3.SC2Replay new file mode 100644 index 00000000..badbe7e9 Binary files /dev/null and b/test_replays/3.1.0/3.SC2Replay differ diff --git a/test_replays/3.1.0/4.SC2Replay b/test_replays/3.1.0/4.SC2Replay new file mode 100644 index 00000000..2c7c0853 Binary files /dev/null and b/test_replays/3.1.0/4.SC2Replay differ diff --git a/test_replays/lotv/lotv1.SC2Replay b/test_replays/lotv/lotv1.SC2Replay new file mode 100644 index 00000000..ff667dcb Binary files /dev/null and b/test_replays/lotv/lotv1.SC2Replay differ diff --git a/test_replays/lotv/lotv2.SC2Replay b/test_replays/lotv/lotv2.SC2Replay new file mode 100644 index 00000000..2dd35820 Binary files /dev/null and b/test_replays/lotv/lotv2.SC2Replay differ diff --git a/test_replays/test_all.py b/test_replays/test_all.py index 2b3b28f1..11d66bec 100644 --- a/test_replays/test_all.py +++ b/test_replays/test_all.py @@ -372,7 +372,34 @@ def test_reloaded(self): def test_214(self): replay = sc2reader.load_replay("test_replays/2.1.4/Catallena LE.SC2Replay", load_level=4) - + + def test_lotv1(self): + # This test currently passes, but there are a lot of warning messages about missing abilities and unit types; presumably this is because the datapack for LotV is missing lots of stuff + replay = sc2reader.load_replay("test_replays/lotv/lotv1.SC2Replay") + self.assertEqual(replay.expansion, "LotV") + + def test_lotv_map(self): + # This test currently fails in decoders.py with 'TypeError: ord() expected a character, but string of length 0 found' + for replayfilename in [ + "test_replays/lotv/lotv1.SC2Replay", + ]: + factory = sc2reader.factories.SC2Factory() + replay =factory.load_replay(replayfilename,load_level=1,load_map= True) + + def test_30(self): + replay = sc2reader.load_replay("test_replays/3.0.0.38215/first.SC2Replay") + + def test_31(self): + for i in range(1,5): + print "DOING {}".format(i) + replay = sc2reader.load_replay("test_replays/3.1.0/{}.SC2Replay".format(i)) + + def test_38996(self): + replay = sc2reader.load_replay("test_replays/3.0.0.38996/1.SC2Replay") + self.assertEqual(replay.expansion, 'LotV') + replay = sc2reader.load_replay("test_replays/3.0.0.38996/2.SC2Replay") + self.assertEqual(replay.expansion, 'LotV') + class TestGameEngine(unittest.TestCase): class TestEvent(object):