├── .circleci └── config.yml ├── .gitignore ├── CHANGELOG.rst ├── CONTRIBUTING.md ├── CONTRIBUTORS.txt ├── LICENSE.txt ├── MANIFEST.in ├── README.rst ├── STYLE_GUIDE.rst ├── docs ├── Makefile ├── make.bat └── source │ ├── _static │ └── deleteme │ ├── articles │ ├── addingnewdatapacks.rst │ ├── conceptsinsc2reader.rst │ ├── creatingagameengineplugin.rst │ ├── gettingstarted.rst │ └── whatsinareplay.rst │ ├── conf.py │ ├── dataobjects.rst │ ├── decoders.rst │ ├── events │ ├── game.rst │ ├── index.rst │ ├── message.rst │ └── tracker.rst │ ├── factories.rst │ ├── faq.rst │ ├── index.rst │ ├── mainobjects.rst │ ├── plugins.rst │ ├── sc2reader.rst │ ├── supportobjects.rst │ ├── tutorials │ └── prettyprinter.rst │ └── utilities.rst ├── examples ├── sc2autosave.py └── sc2store.py ├── generate_build_data.py ├── new_units.py ├── pyproject.toml ├── requirements.txt ├── sc2dump.cpp ├── sc2reader ├── __init__.py ├── constants.py ├── data │ ├── HOWTO.md │ ├── HotS │ │ ├── 23925_abilities.csv │ │ ├── 23925_units.csv │ │ ├── 24247_abilities.csv │ │ ├── 24247_units.csv │ │ ├── 24764_abilities.csv │ │ ├── 24764_units.csv │ │ ├── base_abilities.csv │ │ └── base_units.csv │ ├── LotV │ │ ├── 44401_abilities.csv │ │ ├── 44401_units.csv │ │ ├── 47185_abilities.csv │ │ ├── 47185_units.csv │ │ ├── 48258_abilities.csv │ │ ├── 48258_units.csv │ │ ├── 53644_abilities.csv │ │ ├── 53644_units.csv │ │ ├── 54724_abilities.csv │ │ ├── 54724_units.csv │ │ ├── 59587_abilities.csv │ │ ├── 59587_units.csv │ │ ├── 70154_abilities.csv │ │ ├── 70154_units.csv │ │ ├── 76114_abilities.csv │ │ ├── 76114_units.csv │ │ ├── 77379_abilities.csv │ │ ├── 77379_units.csv │ │ ├── 80949_abilities.csv │ │ ├── 80949_units.csv │ │ ├── 89720_abilities.csv │ │ ├── 89720_units.csv │ │ ├── base_abilities.csv │ │ └── base_units.csv │ ├── WoL │ │ ├── 16117_abilities.csv │ │ ├── 16117_units.csv │ │ ├── 17326_abilities.csv │ │ ├── 17326_units.csv │ │ ├── 18092_abilities.csv │ │ ├── 18092_units.csv │ │ ├── 19458_abilities.csv │ │ ├── 19458_units.csv │ │ ├── 22612_abilities.csv │ │ ├── 22612_units.csv │ │ ├── 24944_abilities.csv │ │ └── 24944_units.csv │ ├── __init__.py │ ├── ability_lookup.csv │ ├── attributes.json │ ├── command_lookup.csv │ ├── create_lookup.py │ ├── train_commands.json │ ├── unit_info.json │ └── unit_lookup.csv ├── decoders.py ├── engine │ ├── __init__.py │ ├── engine.py │ ├── events.py │ ├── plugins │ │ ├── __init__.py │ │ ├── apm.py │ │ ├── context.py │ │ ├── creeptracker.py │ │ ├── gameheart.py │ │ ├── selection.py │ │ └── supply.py │ └── utils.py ├── events │ ├── __init__.py │ ├── base.py │ ├── game.py │ ├── message.py │ └── tracker.py ├── exceptions.py ├── factories │ ├── __init__.py │ ├── plugins │ │ ├── __init__.py │ │ ├── replay.py │ │ └── utils.py │ └── sc2factory.py ├── log_utils.py ├── objects.py ├── readers.py ├── resources.py ├── scripts │ ├── __init__.py │ ├── sc2attributes.py │ ├── sc2json.py │ ├── sc2parse.py │ ├── sc2printer.py │ └── sc2replayer.py └── utils.py ├── test_replays ├── 1.0.0.16117 │ └── 1.SC2Replay ├── 1.0.1.16195 │ ├── Arctic_vs_Froadac_5766.SC2Replay │ ├── Froadac_vs_Bunnies_5770.SC2Replay │ ├── Froadac_vs_Tetramaster_6031.SC2Replay │ ├── PredatorPR_vs_Froadac_5702.SC2Replay │ └── Taandey_vs_Froadac_5564.SC2Replay ├── 1.0.2.16223 │ ├── Froadac_vs_Jim_6063.SC2Replay │ ├── Froadac_vs_Pubu_5850.SC2Replay │ ├── Pete_vs_Froadac_6016.SC2Replay │ ├── Pseudo_vs_Froadac_5694.SC2Replay │ ├── Technqiue_vs_Froadac_5782.SC2Replay │ └── TvT_Epic-_Tanks_Thors_Banshees.SC2Replay ├── 1.0.3.16291 │ ├── 1v1_Scrap Station_1903.SC2Replay │ ├── Froadac_vs_Calin_5555.SC2Replay │ ├── Froadac_vs_Nissassa_5611.SC2Replay │ ├── Froadac_vs_Oppo_6033.SC2Replay │ ├── Froadac_vs_Zizzer_5984.SC2Replay │ └── RookJackson_vs_Froadac_5821.SC2Replay ├── 1.1.0.16561 │ ├── 1v1_Blistering Sands_1894.SC2Replay │ ├── 1v1_Lost Temple_1893.SC2Replay │ ├── 21087.SC2Replay │ ├── 2v2_Discord IV_18612.SC2Replay │ ├── 2v2_High Orbit_18613.SC2Replay │ ├── 2v2_High Orbit_18614.SC2Replay │ ├── 2v2_Scorched Haven_18616.SC2Replay │ ├── 2v2_Scorched Haven_18617.SC2Replay │ ├── 2v2_Tarsonis Assault_18994.SC2Replay │ ├── 2v2_Twilight Fortress_18620.SC2Replay │ ├── 3v3_Dig Site_11014.SC2Replay │ ├── Froadac_vs_Coontastik_5955.SC2Replay │ ├── Froadac_vs_Gileril_5958.SC2Replay │ ├── Froadac_vs_Shields_5952.SC2Replay │ ├── Ike_vs_Froadac_5957.SC2Replay │ ├── Triiptych_vs_EnS_9384.SC2Replay │ ├── UnknownEvent_0400.SC2Replay │ ├── WeirdInitializationEvent.SC2Replay │ ├── giMpygiMpy_vs_Kim_6731.SC2Replay │ └── test.SC2Replay ├── 1.1.1.16605 │ ├── 1v1_Delta Quadrant_316.SC2Replay │ ├── 1v1_Metalopolis_2039.SC2Replay │ ├── 1v1_Scrap Station_1939.SC2Replay │ ├── 1v1_Shakuras Plateau_1948.SC2Replay │ ├── 1v1_Shakuras Plateau_2881.SC2Replay │ ├── 1v1_Steppes of War_1959.SC2Replay │ ├── 1v1_iCCup Match Point_2037.SC2Replay │ ├── 2v2_Scorched Haven_1935.SC2Replay │ ├── Froadac_vs_Final_5948.SC2Replay │ ├── Protoss_vs_Froadac_5974.SC2Replay │ └── giMpygiMpy_vs_budsTOashes_6733.SC2Replay ├── 1.1.2.16755 │ ├── 1v1_Blistering Sands_341.SC2Replay │ ├── 1v1_Frontier_3005.SC2Replay │ ├── 1v1_Lost Temple_2032.SC2Replay │ ├── 1v1_Lost Temple_2059.SC2Replay │ ├── 1v1_Lost Temple_2060.SC2Replay │ ├── 1v1_Metalopolis_2061.SC2Replay │ ├── 1v1_Metalopolis_342.SC2Replay │ ├── 1v1_Xel'Naga Caverns_2031.SC2Replay │ ├── 1v1_iCCup Fighting Spirit_2058.SC2Replay │ └── Pro_vs_nubington_8448.SC2Replay ├── 1.1.3.16939 │ ├── 11.SC2Replay │ ├── 1v1_Blistering Sands_2747.SC2Replay │ ├── 1v1_Lost Temple_2347.SC2Replay │ ├── 1v1_Metalopolis_2019.SC2Replay │ ├── 23.SC2Replay │ ├── 2v2_Monlyth Ridge_3048.SC2Replay │ ├── 2v2_Monlyth Ridge_5906.SC2Replay │ ├── Froadac_vs_Tamgerine_6065.SC2Replay │ ├── IceNine_vs_nubington_8573.SC2Replay │ ├── Navedy_vs_Froadac_6018.SC2Replay │ ├── compLeX_vs_nubington_8515.SC2Replay │ ├── nubington_vs_BowmanSX_8570.SC2Replay │ └── nubington_vs_BowmanSX_8582.SC2Replay ├── 1.2.0.17326 │ ├── 1v1 with Referee.SC2Replay │ ├── 1v1_Shakuras Plateau_13.SC2Replay │ ├── 1v1_Shakuras Plateau_47.SC2Replay │ ├── 1v1_Steppes of War_200.SC2Replay │ ├── 9.SC2Replay │ ├── Antiochus_vs_nubington_8576.SC2Replay │ ├── Azure_vs_BillyMays_10803.SC2Replay │ ├── Finale_vs_nubington_8606.SC2Replay │ ├── KEVNITO_vs_sscciownU_10046.SC2Replay │ ├── UnknownEvent_041C.SC2Replay │ ├── UnknownEvent_043C.SC2Replay │ └── test1-2.SC2Replay ├── 1.2.1.17682 │ ├── 1v1_Lost Temple_3969.SC2Replay │ ├── 2v2_Scorched Haven_6473.SC2Replay │ ├── BowmanSX_vs_nubington_8614.SC2Replay │ ├── Deadiam_vs_McSwagger_6474.SC2Replay │ ├── Froadac_vs_BattleOtter_6040.SC2Replay │ ├── Laegoose_vs_nitrousx_4626.SC2Replay │ ├── Sharky_vs_trolli_4792.SC2Replay │ └── VTPokebunny_vs_LuckyFool_5768.SC2Replay ├── 1.2.2.17811 │ ├── 1.SC2Replay │ ├── 10.SC2Replay │ ├── 13.SC2Replay │ ├── 14.SC2Replay │ ├── 2.SC2Replay │ ├── 3.SC2Replay │ ├── 3v3_Colony 426_10434.SC2Replay │ ├── 4.SC2Replay │ ├── 5.SC2Replay │ ├── 6.SC2Replay │ ├── 7.SC2Replay │ ├── 8.SC2Replay │ ├── IbuFlaIVIZ_vs_Nilsson_10162.SC2Replay │ └── Nilsson_vs_Omyns_10164.SC2Replay ├── 1.3.0.18092 │ ├── 1v1_The Shattered Temple_2196.SC2Replay │ ├── 1v1_Typhon Peaks_2160.SC2Replay │ ├── 3v3_Ulaan Deeps_2216.SC2Replay │ ├── IPA_vs_EnsignLee_8178.SC2Replay │ ├── Tixx_vs_Nilsson_10167.SC2Replay │ ├── nubington_vs_sMiHorst_8641.SC2Replay │ ├── qxc_vs_PredY_9852.SC2Replay │ └── sMiHorst_vs_albertZERG_10345.SC2Replay ├── 1.3.1.18221 │ ├── 1v1_Metalopolis_2898.SC2Replay │ ├── 1v1_Shakuras Plateau_2877.SC2Replay │ ├── 1v1_Shakuras Plateau_2896.SC2Replay │ ├── 1v1_Tal'darim Altar LE_2875.SC2Replay │ ├── 1v1_The Shattered Temple_2870.SC2Replay │ ├── 1v1_Xel'Naga Caverns_2874.SC2Replay │ ├── Effergy_vs_naeblis_10404.SC2Replay │ ├── iLLUSiONFTW_vs_Nilsson_10170.SC2Replay │ ├── seawake_vs_Xzer_10761.SC2Replay │ └── tehsYs_vs_Nilsson_10175.SC2Replay ├── 1.3.2.18317 │ ├── 4v4_Outpost_10788.SC2Replay │ ├── Azure_vs_BillyMays_10805.SC2Replay │ ├── BadFurDay_vs_TheJester_5450.SC2Replay │ ├── Broom_vs_oTLTRO_5384.SC2Replay │ ├── DerDrahtige_vs_ThArGos_5452.SC2Replay │ ├── Ritsar_vs_Xzer_10778.SC2Replay │ ├── Viiper_vs_Auto_5386.SC2Replay │ ├── Zanti_vs_Metalreflux_5451.SC2Replay │ └── howdini_vs_cKio_5388.SC2Replay ├── 1.3.3.18574 │ ├── Gutterhulk.SC2Replay │ ├── HighOrbit.SC2Replay │ ├── Metalopolis (11).SC2Replay │ ├── Monlyth Ridge (6).SC2Replay │ ├── MonlythRidge.SC2Replay │ ├── Sand Canyon (6).SC2Replay │ ├── Shakuras Plateau (4).SC2Replay │ ├── Slag Pits.SC2Replay │ ├── Tempest.SC2Replay │ └── The Shattered Temple (4).SC2Replay ├── 1.3.4.18701 │ ├── 24415.SC2Replay │ ├── 24420.SC2Replay │ ├── 24422.SC2Replay │ ├── 24425.SC2Replay │ ├── 24427.SC2Replay │ ├── 24557.SC2Replay │ ├── 24558.SC2Replay │ ├── 24652.SC2Replay │ ├── 24758.SC2Replay │ └── 24761.SC2Replay ├── 1.3.5.19132 │ ├── 23815.SC2Replay │ ├── 24360.SC2Replay │ ├── 24363.SC2Replay │ ├── 24367.SC2Replay │ ├── 24369.SC2Replay │ ├── 24371.SC2Replay │ ├── 24648.SC2Replay │ ├── 24708.SC2Replay │ ├── 24805.SC2Replay │ ├── AmandilGMMA_vs_SCDZingy_20328.SC2Replay │ ├── iPStylin_vs_SCDTaCo_20332.SC2Replay │ └── tGKorlith_vs_iPStylin_20333.SC2Replay ├── 1.3.6.19269 │ ├── 24767.SC2Replay │ ├── 24768.SC2Replay │ ├── 24771.SC2Replay │ ├── 24775.SC2Replay │ ├── 24781.SC2Replay │ ├── 24782.SC2Replay │ ├── 24783.SC2Replay │ ├── 24785.SC2Replay │ ├── 24799.SC2Replay │ ├── 24803.SC2Replay │ ├── 24804.SC2Replay │ ├── 24807.SC2Replay │ └── 24808.SC2Replay ├── 1.4.0.19679 │ ├── 36465.SC2Replay │ ├── 36467.SC2Replay │ ├── 36469.SC2Replay │ ├── 36477.SC2Replay │ ├── 36480.SC2Replay │ ├── 36498.SC2Replay │ ├── 36501.SC2Replay │ ├── 36502.SC2Replay │ ├── 36503.SC2Replay │ ├── 36504.SC2Replay │ ├── 36508.SC2Replay │ ├── 36509.SC2Replay │ ├── 36512.SC2Replay │ ├── 36519.SC2Replay │ ├── 36520.SC2Replay │ ├── 36521.SC2Replay │ ├── 36523.SC2Replay │ ├── 36526.SC2Replay │ ├── 36527.SC2Replay │ ├── 36528.SC2Replay │ ├── 36529.SC2Replay │ ├── 36530.SC2Replay │ ├── 36531.SC2Replay │ ├── 36532.SC2Replay │ ├── 36534.SC2Replay │ ├── 36535.SC2Replay │ ├── 36536.SC2Replay │ ├── 36538.SC2Replay │ ├── 36539.SC2Replay │ ├── 36540.SC2Replay │ ├── 36541.SC2Replay │ ├── 36542.SC2Replay │ ├── 36654.SC2Replay │ ├── 36656.SC2Replay │ ├── 36657.SC2Replay │ ├── 36658.SC2Replay │ ├── 36659.SC2Replay │ ├── 36661.SC2Replay │ ├── 36662.SC2Replay │ ├── 36663.SC2Replay │ ├── Backwater+Gulch.SC2Replay │ ├── Discord IV (10).SC2Replay │ ├── Discord IV (11).SC2Replay │ ├── High Orbit (11).SC2Replay │ ├── Plunder+Isle.SC2Replay │ ├── Scorched Haven (23).SC2Replay │ ├── Shakuras Plateau (36).SC2Replay │ ├── Tal'darim Altar LE (24).SC2Replay │ ├── Tempest (6).SC2Replay │ ├── Tempest (7).SC2Replay │ ├── The Boneyard (10).SC2Replay │ ├── The Boneyard (11).SC2Replay │ ├── The Boneyard (9).SC2Replay │ ├── The Shattered Temple (26).SC2Replay │ ├── Typhon Peaks (18).SC2Replay │ └── Xel'Naga Caverns (56).SC2Replay ├── 1.4.3.21029 │ └── ggtracker_398754.SC2Replay ├── 1.5.3.23260 │ ├── Deadlock Ridge (110).SC2Replay │ ├── District 10 (68).SC2Replay │ └── ggtracker_109233.SC2Replay ├── 1.5.4.24540 │ ├── Deadlock Ridge (115).SC2Replay │ └── ggtracker_1471849.SC2Replay ├── 2.0.0.23260 │ └── test2v2.SC2Replay ├── 2.0.0.23925 │ ├── Akilon Wastes (2).SC2Replay │ ├── Akilon Wastes.SC2Replay │ ├── Antiga Shipyard.SC2Replay │ ├── Cloud Kingdom LE (2).SC2Replay │ ├── Cloud Kingdom LE.SC2Replay │ └── jakatak_lunar.SC2Replay ├── 2.0.0.24247 │ ├── Cloud Kingdom LE (13).SC2Replay │ ├── Hunting Ground (2).SC2Replay │ ├── Korhal City (19).SC2Replay │ ├── Newkirk City (7).SC2Replay │ ├── PeepMode.SC2Replay │ └── molten.SC2Replay ├── 2.0.0.24540 │ └── message.SC2Replay ├── 2.0.10.26490 │ ├── replay26490.SC2Replay │ └── replay26490_friendlyfire.SC2Replay ├── 2.0.11.26825 │ ├── DaedalusPoint.SC2Replay │ └── bad_unit_ids_1.SC2Replay ├── 2.0.3.24764 │ ├── 1.SC2Replay │ ├── Akilon Wastes (10).SC2Replay │ ├── Akilon Wastes (2).SC2Replay │ ├── Akilon Wastes (3).SC2Replay │ ├── Akilon Wastes.SC2Replay │ ├── Antiga Shipyard (2).SC2Replay │ ├── Antiga Shipyard (3).SC2Replay │ ├── Antiga Shipyard.SC2Replay │ ├── Newkirk City.SC2Replay │ ├── Star Station (2).SC2Replay │ ├── Star Station (3).SC2Replay │ ├── Star Station (4).SC2Replay │ ├── Star Station (5).SC2Replay │ ├── Star Station.SC2Replay │ ├── Swarm Training Stage 3.SC2Replay │ ├── The Bio Lab.SC2Replay │ ├── ggtracker_1571740.SC2Replay │ ├── new_hots.SC2Replay │ ├── new_units.SC2Replay │ ├── resume_from_replay.SC2Replay │ └── wraithan_korhal.SC2Replay ├── 2.0.4.24944 │ ├── Backwater Complex (15).SC2Replay │ ├── Lunar Colony V.SC2Replay │ └── ggtracker_1789768.SC2Replay ├── 2.0.5.25092 │ └── cn1.SC2Replay ├── 2.0.7.25293 │ └── ggtracker_2868002.SC2Replay ├── 2.0.8.25446 │ ├── ggtracker_3024127.SC2Replay │ ├── ggtracker_3024216.SC2Replay │ ├── ggtracker_3117069.SC2Replay │ ├── ggtracker_3167674.SC2Replay │ ├── ggtracker_3167851.SC2Replay │ └── ggtracker_3230037.SC2Replay ├── 2.0.8.25604 │ ├── issue131_arid_wastes.SC2Replay │ ├── issue135.SC2Replay │ ├── issue136.SC2Replay │ └── mlg1.SC2Replay ├── 2.0.8.25605 │ ├── ggtracker_3621322.SC2Replay │ ├── ggtracker_3621402.SC2Replay │ ├── ggtracker_3663861.SC2Replay │ └── ggtracker_3695400.SC2Replay ├── 2.0.9.26147 │ └── bad_unit_ids_2.SC2Replay ├── 2.1.3.28667 │ └── Habitation Station LE (54).SC2Replay ├── 2.1.4 │ └── Catallena LE.SC2Replay ├── 3.0.0.38215 │ ├── first.SC2Replay │ ├── fourth.SC2Replay │ ├── second.SC2Replay │ └── third.SC2Replay ├── 3.0.0.38749 │ ├── 1.SC2Replay │ └── 2.SC2Replay ├── 3.0.0.38996 │ ├── 1.SC2Replay │ └── 2.SC2Replay ├── 3.1.0 │ ├── 1.SC2Replay │ ├── 2.SC2Replay │ ├── 3.SC2Replay │ ├── 4.SC2Replay │ ├── centralprotocol.SC2Replay │ └── dusktowers.SC2Replay ├── 3.1.2 │ └── 6494799.SC2Replay ├── 3.12 │ └── Honorgrounds.SC2Replay ├── 3.14.0.54518 │ ├── 1.SC2Replay │ ├── 2.SC2Replay │ └── 3.SC2Replay ├── 3.16 │ └── AbyssalReef.SC2Replay ├── 3.2.0 │ └── 1.SC2Replay ├── 3.3.0 │ ├── 1.SC2Replay │ ├── 2.SC2Replay │ ├── 3.SC2Replay │ ├── 4.SC2Replay │ ├── ggissue48.SC2Replay │ └── ggissue49.SC2Replay ├── 3.4.0 │ └── issueYY.SC2Replay ├── 3.7.0 │ ├── 1.SC2Replay │ └── 2.SC2Replay ├── 4.0.0.59587 │ └── 1.SC2Replay ├── 4.1.2.60604 │ └── 1.SC2Replay ├── 4.10.0.75689 │ └── trophy_id_13.SC2Replay ├── 4.11.0.77379 │ └── Oblivion Express.SC2Replay ├── 4.3.0.64469 │ └── 1.SC2Replay ├── 4.4.0.65895 │ └── 1.SC2Replay ├── 4.7.0.70154 │ └── 1.SC2Replay ├── 5.0.0.80949 │ └── 2020-07-28 - (T)Ocrucius VS (Z)Rairden.SC2Replay ├── coop │ └── CoA.SC2Replay ├── event_order.SC2Replay ├── gameheart │ ├── gameheart.SC2Replay │ └── gh_sameteam.SC2Replay ├── lotv │ ├── lotv1.SC2Replay │ └── lotv2.SC2Replay └── test_replays.py └── test_s2gs ├── hots1.s2gs ├── hots2.s2gs ├── lotv.s2gs ├── s2gs1.s2gs ├── summary.s2gs └── test_all.py /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2.0 2 | 3 | build_and_test: &build_and_test_steps 4 | - checkout 5 | # Do not use `sudo pip` 6 | # pipx is already installed but `pipx list` is empty 7 | - run: python --version ; pip --version ; pipx --version ; pwd ; ls -l 8 | - run: pip install pytest -r requirements.txt 9 | - run: pip install --editable . 10 | - run: pytest 11 | 12 | 13 | jobs: 14 | StyleCheck: 15 | docker: 16 | - image: cimg/python:3.11 17 | steps: 18 | - checkout 19 | - run: python --version ; pip --version ; pwd ; ls -l 20 | - run: pip install black codespell ruff 21 | - run: codespell -L queenland,uint,assertin 22 | - run: ruff check 23 | - run: black . --check 24 | 25 | 26 | Python3: 27 | docker: 28 | - image: cimg/python:3.11 29 | steps: *build_and_test_steps 30 | 31 | 32 | workflows: 33 | version: 2 34 | build: 35 | jobs: 36 | - StyleCheck 37 | - Python3 38 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | *.pyc 3 | *.ipynb 4 | *-checkpoint* 5 | dist 6 | build 7 | sc2reader.egg-info 8 | replay_profile 9 | PKG-INFO.txt 10 | sc2reader/bin 11 | sc2reader/include 12 | sc2reader/lib 13 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | Support 2 | ========= 3 | 4 | As of Sept 2023, the best way to get support on sc2reader is on the GitHub project page. Preferably, it would be a new discussion https://github.com/ggtracker/sc2reader/discussions but can also be submitted as n issue 5 | 6 | Issues 7 | ========= 8 | 9 | Please include links to replays I can use to replicate. If an exception is being thrown while loading the replay please run the replay through the sc2parse script and post the output along with your issue. If it is a data quality issue please include a script of your own that can demonstrate the issue and the expected values. 10 | 11 | If you can't share your code/replays publicly try to replicate with a smaller script or a replay you can share. If you can't even do that, say so in your issue and we can arrange to have materials sent privately. 12 | 13 | 14 | Patches 15 | ========= 16 | 17 | Please submit patches by pull request where possible. Patches should add a test to confirm their fix and should not break previously working tests. Circle CI automatically runs tests on each pull request so please check https://circleci.com/gh/ggtracker/sc2reader to see the results of those tests. 18 | 19 | If you are having trouble running/add/fixing tests for your patch let me know and I'll see if I can help. 20 | 21 | 22 | Coding Style 23 | ============== 24 | 25 | We would like our code to follow [Ruff](https://docs.astral.sh/ruff/) coding style in this project. 26 | We use [python/black](https://github.com/python/black) in order to make our lives easier. 27 | We propose you do the same within this project, otherwise you might be asked to 28 | reformat your pull requests. 29 | 30 | It's really simple just: 31 | 32 | pip install black 33 | black . 34 | 35 | And [there are plugins for many editors](https://black.readthedocs.io/en/stable/editor_integration.html). 36 | -------------------------------------------------------------------------------- /CONTRIBUTORS.txt: -------------------------------------------------------------------------------- 1 | Maintainer: 2 | David Joerg - @dsjoerg on github 3 | 4 | Author: 5 | Graylin Kim - graylinkim @ github 6 | 7 | Contributors: 8 | Alexander Hanhikoski - @alexhanh on github 9 | Bas Peschier (fizzgig) - @bpeschier on github 10 | Jason Dana - @sheutka on github 11 | Cameron Zemek (grom) - @grom358 on github 12 | Fabien Reboia (srounet) - @srounet on github 13 | Kevin Leung - @StoicLoofah on github 14 | Daniele Zannotti (Durrza) 15 | Mike Anderson 16 | Christian Clauss - @cclauss on github 17 | 18 | Special thanks to ggtracker, inc (ggtracker.com) for sponsoring sc2reader's continued development. 19 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License, http://www.opensource.org/licenses/mit-license.php 2 | 3 | Copyright (c) 2011-2013 Graylin Kim 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include LICENSE.txt 2 | include CONTRIBUTORS.txt 3 | include CONTRIBUTING.md 4 | include STYLE_GUIDE.rst 5 | include README.rst 6 | include CHANGELOG.rst 7 | recursive-include sc2reader *.csv *.json 8 | -------------------------------------------------------------------------------- /STYLE_GUIDE.rst: -------------------------------------------------------------------------------- 1 | STYLE GUIDE 2 | ============== 3 | 4 | As a rough style guide, please lint your code with black, codespell, and ruff:: 5 | 6 | pip install black codespell ruff 7 | codespell -L queenland,uint 8 | ruff . 9 | black . --check 10 | 11 | More up-to-date checks may be detailed in `.circleci/config.yml`. 12 | 13 | All files should start with the following:: 14 | 15 | # -*- coding: utf-8 -*- 16 | # 17 | # Optional Documentation on the module 18 | # 19 | from __future__ import absolute_import, print_function, unicode_literals, division 20 | 21 | All imports should be absolute. 22 | 23 | All string formatting should be done with f-strings. See https://docs.python.org/3/reference/lexical_analysis.html#f-strings 24 | -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | # Makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line. 5 | SPHINXOPTS = 6 | SPHINXBUILD = sphinx-build 7 | PAPER = 8 | BUILDDIR = build 9 | 10 | # Internal variables. 11 | PAPEROPT_a4 = -D latex_paper_size=a4 12 | PAPEROPT_letter = -D latex_paper_size=letter 13 | ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source 14 | 15 | .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest 16 | 17 | help: 18 | @echo "Please use \`make ' where is one of" 19 | @echo " html to make standalone HTML files" 20 | @echo " dirhtml to make HTML files named index.html in directories" 21 | @echo " singlehtml to make a single large HTML file" 22 | @echo " pickle to make pickle files" 23 | @echo " json to make JSON files" 24 | @echo " htmlhelp to make HTML files and a HTML help project" 25 | @echo " qthelp to make HTML files and a qthelp project" 26 | @echo " devhelp to make HTML files and a Devhelp project" 27 | @echo " epub to make an epub" 28 | @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" 29 | @echo " latexpdf to make LaTeX files and run them through pdflatex" 30 | @echo " text to make text files" 31 | @echo " man to make manual pages" 32 | @echo " changes to make an overview of all changed/added/deprecated items" 33 | @echo " linkcheck to check all external links for integrity" 34 | @echo " doctest to run all doctests embedded in the documentation (if enabled)" 35 | 36 | clean: 37 | -rm -rf $(BUILDDIR)/* 38 | 39 | html: 40 | $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html 41 | @echo 42 | @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." 43 | 44 | dirhtml: 45 | $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml 46 | @echo 47 | @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." 48 | 49 | singlehtml: 50 | $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml 51 | @echo 52 | @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." 53 | 54 | pickle: 55 | $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle 56 | @echo 57 | @echo "Build finished; now you can process the pickle files." 58 | 59 | json: 60 | $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json 61 | @echo 62 | @echo "Build finished; now you can process the JSON files." 63 | 64 | htmlhelp: 65 | $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp 66 | @echo 67 | @echo "Build finished; now you can run HTML Help Workshop with the" \ 68 | ".hhp project file in $(BUILDDIR)/htmlhelp." 69 | 70 | qthelp: 71 | $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp 72 | @echo 73 | @echo "Build finished; now you can run "qcollectiongenerator" with the" \ 74 | ".qhcp project file in $(BUILDDIR)/qthelp, like this:" 75 | @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/sc2reader.qhcp" 76 | @echo "To view the help file:" 77 | @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/sc2reader.qhc" 78 | 79 | devhelp: 80 | $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp 81 | @echo 82 | @echo "Build finished." 83 | @echo "To view the help file:" 84 | @echo "# mkdir -p $$HOME/.local/share/devhelp/sc2reader" 85 | @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/sc2reader" 86 | @echo "# devhelp" 87 | 88 | epub: 89 | $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub 90 | @echo 91 | @echo "Build finished. The epub file is in $(BUILDDIR)/epub." 92 | 93 | latex: 94 | $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex 95 | @echo 96 | @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." 97 | @echo "Run \`make' in that directory to run these through (pdf)latex" \ 98 | "(use \`make latexpdf' here to do that automatically)." 99 | 100 | latexpdf: 101 | $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex 102 | @echo "Running LaTeX files through pdflatex..." 103 | make -C $(BUILDDIR)/latex all-pdf 104 | @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." 105 | 106 | text: 107 | $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text 108 | @echo 109 | @echo "Build finished. The text files are in $(BUILDDIR)/text." 110 | 111 | man: 112 | $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man 113 | @echo 114 | @echo "Build finished. The manual pages are in $(BUILDDIR)/man." 115 | 116 | changes: 117 | $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes 118 | @echo 119 | @echo "The overview file is in $(BUILDDIR)/changes." 120 | 121 | linkcheck: 122 | $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck 123 | @echo 124 | @echo "Link check complete; look for any errors in the above output " \ 125 | "or in $(BUILDDIR)/linkcheck/output.txt." 126 | 127 | doctest: 128 | $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest 129 | @echo "Testing of doctests in the sources finished, look at the " \ 130 | "results in $(BUILDDIR)/doctest/output.txt." 131 | -------------------------------------------------------------------------------- /docs/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | REM Command file for Sphinx documentation 4 | 5 | if "%SPHINXBUILD%" == "" ( 6 | set SPHINXBUILD=sphinx-build 7 | ) 8 | set BUILDDIR=build 9 | set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source 10 | if NOT "%PAPER%" == "" ( 11 | set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% 12 | ) 13 | 14 | if "%1" == "" goto help 15 | 16 | if "%1" == "help" ( 17 | :help 18 | echo.Please use `make ^` where ^ is one of 19 | echo. html to make standalone HTML files 20 | echo. dirhtml to make HTML files named index.html in directories 21 | echo. singlehtml to make a single large HTML file 22 | echo. pickle to make pickle files 23 | echo. json to make JSON files 24 | echo. htmlhelp to make HTML files and a HTML help project 25 | echo. qthelp to make HTML files and a qthelp project 26 | echo. devhelp to make HTML files and a Devhelp project 27 | echo. epub to make an epub 28 | echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter 29 | echo. text to make text files 30 | echo. man to make manual pages 31 | echo. changes to make an overview over all changed/added/deprecated items 32 | echo. linkcheck to check all external links for integrity 33 | echo. doctest to run all doctests embedded in the documentation if enabled 34 | goto end 35 | ) 36 | 37 | if "%1" == "clean" ( 38 | for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i 39 | del /q /s %BUILDDIR%\* 40 | goto end 41 | ) 42 | 43 | if "%1" == "html" ( 44 | %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html 45 | if errorlevel 1 exit /b 1 46 | echo. 47 | echo.Build finished. The HTML pages are in %BUILDDIR%/html. 48 | goto end 49 | ) 50 | 51 | if "%1" == "dirhtml" ( 52 | %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml 53 | if errorlevel 1 exit /b 1 54 | echo. 55 | echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. 56 | goto end 57 | ) 58 | 59 | if "%1" == "singlehtml" ( 60 | %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml 61 | if errorlevel 1 exit /b 1 62 | echo. 63 | echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. 64 | goto end 65 | ) 66 | 67 | if "%1" == "pickle" ( 68 | %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle 69 | if errorlevel 1 exit /b 1 70 | echo. 71 | echo.Build finished; now you can process the pickle files. 72 | goto end 73 | ) 74 | 75 | if "%1" == "json" ( 76 | %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json 77 | if errorlevel 1 exit /b 1 78 | echo. 79 | echo.Build finished; now you can process the JSON files. 80 | goto end 81 | ) 82 | 83 | if "%1" == "htmlhelp" ( 84 | %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp 85 | if errorlevel 1 exit /b 1 86 | echo. 87 | echo.Build finished; now you can run HTML Help Workshop with the ^ 88 | .hhp project file in %BUILDDIR%/htmlhelp. 89 | goto end 90 | ) 91 | 92 | if "%1" == "qthelp" ( 93 | %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp 94 | if errorlevel 1 exit /b 1 95 | echo. 96 | echo.Build finished; now you can run "qcollectiongenerator" with the ^ 97 | .qhcp project file in %BUILDDIR%/qthelp, like this: 98 | echo.^> qcollectiongenerator %BUILDDIR%\qthelp\sc2reader.qhcp 99 | echo.To view the help file: 100 | echo.^> assistant -collectionFile %BUILDDIR%\qthelp\sc2reader.ghc 101 | goto end 102 | ) 103 | 104 | if "%1" == "devhelp" ( 105 | %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp 106 | if errorlevel 1 exit /b 1 107 | echo. 108 | echo.Build finished. 109 | goto end 110 | ) 111 | 112 | if "%1" == "epub" ( 113 | %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub 114 | if errorlevel 1 exit /b 1 115 | echo. 116 | echo.Build finished. The epub file is in %BUILDDIR%/epub. 117 | goto end 118 | ) 119 | 120 | if "%1" == "latex" ( 121 | %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex 122 | if errorlevel 1 exit /b 1 123 | echo. 124 | echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. 125 | goto end 126 | ) 127 | 128 | if "%1" == "text" ( 129 | %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text 130 | if errorlevel 1 exit /b 1 131 | echo. 132 | echo.Build finished. The text files are in %BUILDDIR%/text. 133 | goto end 134 | ) 135 | 136 | if "%1" == "man" ( 137 | %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man 138 | if errorlevel 1 exit /b 1 139 | echo. 140 | echo.Build finished. The manual pages are in %BUILDDIR%/man. 141 | goto end 142 | ) 143 | 144 | if "%1" == "changes" ( 145 | %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes 146 | if errorlevel 1 exit /b 1 147 | echo. 148 | echo.The overview file is in %BUILDDIR%/changes. 149 | goto end 150 | ) 151 | 152 | if "%1" == "linkcheck" ( 153 | %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck 154 | if errorlevel 1 exit /b 1 155 | echo. 156 | echo.Link check complete; look for any errors in the above output ^ 157 | or in %BUILDDIR%/linkcheck/output.txt. 158 | goto end 159 | ) 160 | 161 | if "%1" == "doctest" ( 162 | %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest 163 | if errorlevel 1 exit /b 1 164 | echo. 165 | echo.Testing of doctests in the sources finished, look at the ^ 166 | results in %BUILDDIR%/doctest/output.txt. 167 | goto end 168 | ) 169 | 170 | :end 171 | -------------------------------------------------------------------------------- /docs/source/_static/deleteme: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/docs/source/_static/deleteme -------------------------------------------------------------------------------- /docs/source/articles/addingnewdatapacks.rst: -------------------------------------------------------------------------------- 1 | 2 | Adding new Datapacks 3 | ======================= 4 | 5 | TODO -------------------------------------------------------------------------------- /docs/source/articles/conceptsinsc2reader.rst: -------------------------------------------------------------------------------- 1 | Concepts in sc2reader 2 | ======================= 3 | 4 | Some of the important concepts in sc2reader in no particular order. 5 | 6 | 7 | Factories 8 | -------------- 9 | 10 | All resources are loaded through a factory. There are four kinds: 11 | 12 | * :class:`~sc2reader.factories.SC2Factory` - Basic factory. Loads resources. 13 | * :class:`~sc2reader.factories.DictCachedSC2Factory` - Caches remote resources in memory. When loading remote resources, the dict cache is checked first. 14 | * :class:`~sc2reader.factories.FileCachedSC2Factory` - Caches remote resources on the file system. When loading remote resources, the file system is checked first. 15 | * :class:`~sc2reader.factories.DoubleCachedSC2Factory` - Caches remote resource in memory and on the file system. 16 | 17 | A default factory is automatically configured and attached to the ``sc2reader`` module when the library is imported. Calling any factory method on the sc2reader module will use this default factory:: 18 | 19 | sc2reader.configure(debug=True) 20 | replay = sc2reader.load_replay('my_replay.SC2Replay') 21 | 22 | The default factory can be configured with the following environment variables: 23 | 24 | * SC2READER_CACHE_DIR - Enables caching to file at the specified directory. 25 | * SC2READER_CACHE_MAX_SIZE - Enables memory caching of resources with a maximum number of entries; not based on memory imprint! 26 | 27 | 28 | Resources 29 | ---------------- 30 | 31 | A Starcraft II resource is any Starcraft II game file. This primarily refers to :class:`~sc2reader.resources.Replay` and :class:`~sc2reader.resources.Map` resources but also includes less common resources such as :class:`~sc2reader.resources.GameSummary`, :class:`~sc2reader.resources.Localization`, and SC2Mods. 32 | 33 | 34 | Player vs User 35 | ----------------- 36 | 37 | All entities in a replay fall into one of two overlapping buckets: 38 | 39 | * User: A human entity, only users have game and message events. 40 | * Player: A entity that actively plays in the game, only players have tracker events. 41 | 42 | As such the following statements are true: 43 | 44 | * A Participant is a Player **and** a User 45 | * An Observer is a User **and not** a Player 46 | * An Computer is a Player **and not** a User 47 | 48 | 49 | Game vs Real 50 | ---------------- 51 | 52 | Many attributes in sc2reader are prefixed with ``game_`` and ``real_``. Game refers to the value encoded in the replay. Real refers to the real life value, as best as we can tell. For instance, ``game_type`` might be 2v2 but by looking at the teams we know that ``real_type`` is 1v1. 53 | 54 | 55 | GameEngine 56 | ---------------- 57 | 58 | The game engine is used to process replay events and augment the replay with new statistics and game state. It implements a plugin system that allows developers 59 | to inject their own logic into the game loop. It also allows plugins to ``yield`` new 60 | events to the event stream. This allows for basic message passing between plugins. 61 | 62 | A default engine is automatically configured and attached to the ``sc2reader.engine`` module when the library is imported. Calling any game engine method on the engine module will use this default factory:: 63 | 64 | sc2reader.engine.register_plugin(MyPlugin()) 65 | sc2reader.engine.run(replay) 66 | 67 | 68 | Datapack 69 | ----------------- 70 | 71 | A datapack is a collection of :class:`~sc2reader.data.Unit` and :class:`~sc2reader.data.Ability` classes that represent the game meta data for a given replay. Because this information is not stored in a replay, sc2reader ships with a datapack for standard ladder games from each Starcraft patch. 72 | 73 | For non-standard maps, this datapack will be both wrong and incomplete and the Unit/Ability data should not be trusted. If you want to add a datapack for your map, see the article on :doc:`addingnewdatapacks`. 74 | -------------------------------------------------------------------------------- /docs/source/articles/creatingagameengineplugin.rst: -------------------------------------------------------------------------------- 1 | Creating a GameEngine Plugin 2 | ================================ 3 | 4 | Handling Events 5 | -------------------- 6 | 7 | Plugins can opt in to handle events with methods with the following naming convention:: 8 | 9 | def handleEventName(self, event, replay) 10 | 11 | In addition to handling specific event types, plugins can also handle events more generally by handling built-in parent classes from the list below: 12 | 13 | * handleEvent - called for every single event of all types 14 | * handleMessageEvent - called for events in replay.message.events 15 | * handleGameEvent - called for events in replay.game.events 16 | * handleTrackerEvent - called for events in replay.tracker.events 17 | * handlePlayerActionEvent - called for all game events indicating player actions 18 | * handleAbilityEvent - called for all types of ability events 19 | * handleHotkeyEvent - called for all player hotkey events 20 | 21 | For every event in a replay, the GameEngine will loop over all of its registered plugins looking for functions to handle that event. Matching handlers are called in order of plugin registration from most general to most specific. 22 | 23 | Given the following plugins:: 24 | 25 | class Plugin1(): 26 | def handleAbilityEvent(self, event, replay): 27 | pass 28 | 29 | class Plugin2(): 30 | def handleEvent(self, event, replay): 31 | pass 32 | 33 | def handleTargetAbilityEvent(self, event, replay): 34 | pass 35 | 36 | sc2reader.engine.register_plugin(Plugin1()) 37 | sc2reader.engine.register_plugin(Plugin2()) 38 | 39 | When the engine handles a ``TargetAbilityEvent`` it will call handlers in the following order:: 40 | 41 | Plugin1.handleAbilityEvent(event, replay) 42 | Plugin2.handleEvent(event, replay) 43 | Plugin2.handleTargetAbilityEvent(event, replay) 44 | 45 | Setup and Cleanup 46 | --------------------- 47 | 48 | Plugins may also handle special ``InitGame`` and ``EndGame`` events. These handlers for these events are called directly before and after the processing of the replay events: 49 | 50 | * handleInitGame - is called prior to processing a new replay to provide 51 | an opportunity for the plugin to clear internal state and set up any 52 | replay state necessary. 53 | 54 | * handleEndGame - is called after all events have been processed and 55 | can be used to perform post processing on aggregated data or clean up 56 | intermediate data caches. 57 | 58 | Message Passing 59 | -------------------- 60 | 61 | Event handlers can choose to ``yield`` additional events which will be injected into the event stream directly after the event currently being processed. This feature allows for message passing between plugins. An ExpansionTracker plugin could notify all other plugins of a new ExpansionEvent that they could opt to process:: 62 | 63 | def handleUnitDoneEvent(self, event, replay): 64 | if event.unit.name == 'Nexus': 65 | yield ExpansionEvent(event.frame, event.unit) 66 | ... 67 | 68 | Early Exits 69 | -------------------- 70 | 71 | If a plugin wishes to stop processing a replay it can yield a PluginExit event before returning:: 72 | 73 | def handleEvent(self, event, replay): 74 | if len(replay.tracker_events) == 0: 75 | yield PluginExit(self, code=0, details=dict(msg="tracker events required")) 76 | return 77 | ... 78 | 79 | def handleAbilityEvent(self, event, replay): 80 | try: 81 | possibly_throwing_error() 82 | catch Error as e: 83 | logger.error(e) 84 | yield PluginExit(self, code=0, details=dict(msg="Unexpected exception")) 85 | return 86 | 87 | The GameEngine will intercept this event and remove the plugin from the list of active plugins for this replay. The exit code and details will be available from the replay:: 88 | 89 | code, details = replay.plugins['MyPlugin'] 90 | 91 | Using Your Plugin 92 | ----------------- 93 | 94 | To use your plugin with sc2reader, just register it to the game engine: 95 | 96 | sc2reader.engine.register_plugin(MyPlugin()) 97 | 98 | Plugins will be called in order of registration for each event. If plugin B depends on plugin A make sure to register plugin A first! 99 | -------------------------------------------------------------------------------- /docs/source/articles/gettingstarted.rst: -------------------------------------------------------------------------------- 1 | Getting Started with SC2Reader 2 | ================================== 3 | 4 | Loading Replays 5 | ------------------- 6 | For many users, the most basic commands will handle all of their needs:: 7 | 8 | import sc2reader 9 | replay = sc2reader.load_replay('MyReplay', load_map=true) 10 | 11 | This will load all replay data and fix GameHeart games. In some cases, you don't need the full extent of the replay data. You can use the load level option to limit replay loading and improve load times:: 12 | 13 | # Release version and game length info. Nothing else 14 | sc2reader.load_replay('MyReplay.SC2Replay', load_level=0) 15 | 16 | # Also loads game details: map, speed, time played, etc 17 | sc2reader.load_replay('MyReplay.SC2Replay', load_level=1) 18 | 19 | # Also loads players and chat events: 20 | sc2reader.load_replay('MyReplay.SC2Replay', load_level=2) 21 | 22 | # Also loads tracker events: 23 | sc2reader.load_replay('MyReplay.SC2Replay', load_level=3) 24 | 25 | # Also loads game events: 26 | sc2reader.load_replay('MyReplay.SC2Replay', load_level=4) 27 | 28 | If you want to load a collection of replays, you can use the plural form. Loading resources in this way returns a replay generator:: 29 | 30 | replays = sc2reader.load_replays('path/to/replay/directory') 31 | 32 | 33 | Loading Maps 34 | ---------------- 35 | 36 | If you have a replay and want the map file as well, sc2reader can download the corresponding map file and load it in one of two ways:: 37 | 38 | replay = sc2reader.load_replay('MyReplay.SC2Replay', load_map=true) 39 | replay.load_map() 40 | 41 | If you are looking to only handle maps you can use the map specific load methods:: 42 | 43 | map = sc2reader.load_map('MyMap.SC2Map') 44 | map = sc2reader.load_maps('path/to/maps/directory') 45 | 46 | 47 | Using the Cache 48 | --------------------- 49 | 50 | If you are loading a lot of remote resources, you'll want to enable caching for sc2reader. Caching can be configured with the following environment variables: 51 | 52 | * SC2READER_CACHE_DIR - Enables caching to file at the specified directory. 53 | * SC2READER_CACHE_MAX_SIZE - Enables memory caching of resources with a maximum number of entries; not based on memory imprint! 54 | 55 | You can set these from inside your script with the following code **BEFORE** importing the sc2reader module:: 56 | 57 | os.environ['SC2READER_CACHE_DIR'] = "path/to/local/cache" 58 | os.environ['SC2READER_CACHE_MAX_SIZE'] = 100 59 | 60 | # if you have imported sc2reader anywhere already this won't work 61 | import sc2reader 62 | 63 | 64 | Using Plugins 65 | ------------------ 66 | 67 | There are a growing number of community generated plugins that you can take advantage of in your project. See the article on :doc:`creatingagameengineplugin` for details on creating your own. To use these plugins you need to customize the game engine:: 68 | 69 | from sc2reader.engine.plugins import SelectionTracker, APMTracker 70 | sc2reader.engine.register_plugin(SelectionTracker()) 71 | sc2reader.engine.register_plugin(APMTracker()) 72 | 73 | The :class:`~sc2reader.engine.plugins.ContextLoader` and :class:`~sc2reader.engine.plugins.GameHeartNormalizer` plugins are registered by default. 74 | -------------------------------------------------------------------------------- /docs/source/articles/whatsinareplay.rst: -------------------------------------------------------------------------------- 1 | 2 | What is in a Replay? 3 | ======================= 4 | 5 | A SC2Replay file is an archive, just like a like zip or tar file. Inside there are several files, each with a specific purpose. The important ones can be split into three categories. 6 | 7 | 8 | Initial State: 9 | ---------------- 10 | 11 | These first three files describe the initial state of the game before any events occur. 12 | 13 | * replay.initData - Records game client information and lobby slot data. 14 | * replay.details - Records basic player and game data. 15 | * replay.attributes.events - Records assorted player and game attributes from the lobby. 16 | 17 | The Starcraft II game client can be thought of as a deterministic state machine. Given an initial state and a list of events, the end state can be exactly replicated. 18 | 19 | 20 | Input Events: 21 | ---------------- 22 | 23 | The next two files provide a feed of player actions in the game. 24 | 25 | * replay.message.events - Records chat messages and pings. 26 | * replay.game.events - Records every action of every person in the game. 27 | 28 | When you watch a replay the game just reads from these feeds. When you take over from a replay, the game client cuts the feeds and switches over to live mouse/keyboard input. Because the AI is deterministic the replay never contains message/game events for them. 29 | 30 | 31 | Output Events: 32 | ---------------- 33 | 34 | The last file provides a record of important events from the game. 35 | 36 | * replay.tracker.events - Records important game events and game state updates. 37 | 38 | This file was introduced in 2.0.4 and is unnecessary for the Starcraft II to reproduce the game. Instead, it records interesting game events and game state for community developers to use when analyzing replays. 39 | 40 | 41 | What isn't in a replay? 42 | -------------------------- 43 | 44 | Replays are specifically designed to only include data essential to recreate the game. Game state is not recorded because the game engine can recreate it based off the other information. That means no player resource counts, collection rates, supply values, vision, unit positions, unit deaths, etc. Information that you are super interested in probably is not directly recorded. Fortunately since 2.0.4 tracker events now record some of this information; prior to that patch we had to run our own simulations to guess at most of the data. 45 | 46 | 47 | The other important aspect of this is that instead of completely describing all of the game data (unit data, ability data, map info, etc), replays maintain a list of dependencies. These dependencies might look like this: 48 | 49 | * Core.SC2Mod 50 | * Liberty (multi).SC2Mod 51 | * Swarm (multi).SC2Mod 52 | * Teams2.SC2Mod 53 | * Current Patch.SC2mod 54 | * GameHeart.SC2Mod 55 | * Map.SC2Map 56 | 57 | As part of the replay pre-load process, each of these dependencies is fetched and all of their associated data is loaded into memory. When Battle.net tells you it is "Fetching Files", it can often be referring to dependencies like this. 58 | 59 | sc2reader has attempted to mitigate this serious deficiency by packaging its own game data files. Basic cost, build time, and race information has been packaged. For many people this will be enough. Future versions of sc2reader will provide support for game data exports from the World Editor (introduced in patch 2.0.10). These exports should provide a much more robust dataset to work with. 60 | -------------------------------------------------------------------------------- /docs/source/dataobjects.rst: -------------------------------------------------------------------------------- 1 | .. currentmodule:: sc2reader.data 2 | 3 | Data Objects 4 | ===================== 5 | 6 | Objects representing in-game objects. 7 | 8 | 9 | Unit 10 | -------------------------- 11 | 12 | .. autoclass:: Unit 13 | :members: 14 | 15 | 16 | Ability 17 | -------------------------- 18 | 19 | .. autoclass:: Ability 20 | :members: 21 | 22 | 23 | 24 | Build 25 | -------------------------- 26 | 27 | .. autoclass:: Build 28 | :members: -------------------------------------------------------------------------------- /docs/source/decoders.rst: -------------------------------------------------------------------------------- 1 | .. currentmodule:: sc2reader.decoders 2 | 3 | Decoders 4 | =============== 5 | 6 | Used to decode the low level contents of files extracted from MPQFiles 7 | 8 | ByteDecoder 9 | -------------------------- 10 | 11 | .. autoclass:: ByteDecoder 12 | :members: 13 | 14 | BitPackedDecoder 15 | -------------------------- 16 | 17 | .. autoclass:: BitPackedDecoder 18 | :members: 19 | -------------------------------------------------------------------------------- /docs/source/events/game.rst: -------------------------------------------------------------------------------- 1 | .. currentmodule:: sc2reader.events.game 2 | 3 | Game Events 4 | ============= 5 | 6 | Game events are what the Starcraft II engine uses to reconstruct games for you to watch 7 | and take over in. Because the game is deterministic, only event data directly created by 8 | a player action is recorded. These player actions are then replayed automatically when 9 | watching a replay. Because the AI is 100% deterministic no events are ever recorded for a 10 | computer player. 11 | 12 | .. automodule:: sc2reader.events.game 13 | :members: 14 | -------------------------------------------------------------------------------- /docs/source/events/index.rst: -------------------------------------------------------------------------------- 1 | Events 2 | ============ 3 | 4 | All of the gamplay and state information contained in the replay is packed into events. 5 | 6 | * :doc:`game`: Human actions and certain triggered events 7 | * :doc:`message`: Message and Pings to other players. 8 | * :doc:`tracker`: Game state information 9 | 10 | .. toctree:: 11 | :hidden: 12 | 13 | game 14 | message 15 | tracker 16 | 17 | -------------------------------------------------------------------------------- /docs/source/events/message.rst: -------------------------------------------------------------------------------- 1 | .. currentmodule:: sc2reader.events.message 2 | 3 | Message Events 4 | =================== 5 | 6 | .. automodule:: sc2reader.events.message 7 | :members: 8 | -------------------------------------------------------------------------------- /docs/source/events/tracker.rst: -------------------------------------------------------------------------------- 1 | .. currentmodule:: sc2reader.events 2 | 3 | Tracker Events 4 | ===================== 5 | 6 | Tracker events are new in Starcraft patch 2.0.8. These events are generated by 7 | the game engine when important non-player events occur in the game. Some of them 8 | are also periodically recorded to snapshot aspects of the current game state. 9 | 10 | .. automodule:: sc2reader.events.tracker 11 | :members: 12 | -------------------------------------------------------------------------------- /docs/source/factories.rst: -------------------------------------------------------------------------------- 1 | .. currentmodule:: sc2reader.factories 2 | 3 | Factories 4 | ============== 5 | 6 | Factories are used to load SCII resources from file-like objects and paths to file-like objects. Objects must implement ``read()`` such that it retrieves all the file contents. 7 | 8 | 9 | SC2Factory 10 | -------------------------- 11 | 12 | .. autoclass:: SC2Factory 13 | :members: 14 | 15 | 16 | DictCachedSC2Factory 17 | -------------------------- 18 | 19 | .. autoclass:: DictCachedSC2Factory 20 | :members: 21 | 22 | FileCachedSC2Factory 23 | -------------------------- 24 | 25 | .. autoclass:: FileCachedSC2Factory 26 | :members: 27 | 28 | DoubleCachedSC2Factory 29 | -------------------------- 30 | 31 | .. autoclass:: DoubleCachedSC2Factory 32 | :members: -------------------------------------------------------------------------------- /docs/source/faq.rst: -------------------------------------------------------------------------------- 1 | Frequently Asked Questions 2 | ============================== 3 | 4 | 1. :ref:`faq1` 5 | 2. :ref:`faq2` 6 | 3. :ref:`faq3` 7 | 4. :ref:`faq4` 8 | 9 | .. _faq1: 10 | 11 | How do I get a list of game events (including messages)? 12 | ------------------------------------------------------------ 13 | 14 | Here is a minimal example:: 15 | 16 | replay = sc2reader.load_replay('path/to/replay.SC2Replay') 17 | for event in replay.events: 18 | print '{0} => {1}: {2}'.format(event.pid,event.name, event.time) 19 | 20 | Please see the `documentation`_ for a full listing of the information available. 21 | 22 | .. _documentation: http://sc2reader.rtfd.org 23 | 24 | .. _faq2: 25 | 26 | How to I get the game state at a specific time in the game. E.g. at 10:00 how many workers every player has. 27 | --------------------------------------------------------------------------------------------------------------- 28 | 29 | This is difficult. Events are only recorded for player initiated actions and you'll find that both successful and unsuccessful actions are included. That means several things complicates our lives: 30 | 31 | 1. There is no "unit created" event. Only a "player attempted to use train " events. 32 | 2. There is no "death" event. You can only tell a unit is alive when it is actively selected. 33 | 3. Game state information: player resources, available supply, etc are unavailable at all times. 34 | 35 | It may be possible to overcome these limitations and approximate game state with a series of very smart assumptions and cool algorithms. If you could accurately count workers though, you'd be the first I think. 36 | 37 | .. _faq3: 38 | 39 | How can I retrieve game summary files? 40 | ----------------------------------------- 41 | 42 | s2gs files hashes are not contained inside any other SC2 resources as far as anyone knows. 43 | 44 | Make sure you read the `s2gs thread`_ for details. 45 | 46 | Aside from manually causing s2gs files to download to your battle.net cache folder you might try set up the `S2GSExtractor`_ to scrape them from the process memory. I can't speak to its legality or effectiveness but it is somewhere to start if you want to automate things. 47 | 48 | .. _s2gs thread: http://www.teamliquid.net/forum/viewmessage.php?topic_id=330926 49 | .. _S2GSExtractor: https://github.com/gibybo/S2GS-Extractor 50 | 51 | .. _faq4: 52 | 53 | Script is broken. What is wrong? 54 | ----------------------------------------------- 55 | 56 | It is true that not all the scripts are very well maintained. They were originally intended as mini usage examples. It seems that people are trying to use them as a primary interface for sc2reader though. I'll have to make sure they don't break going forward. 57 | 58 | Patches to the scripts are always accepted, just issue a pull request or email me a patch file. 59 | -------------------------------------------------------------------------------- /docs/source/index.rst: -------------------------------------------------------------------------------- 1 | SC2Reader User Manual 2 | ========================= 3 | 4 | There is a pressing need in the SC2 community for better statistics, better 5 | analytics, better tools for organizing and searching replays. Better websites 6 | for sharing replays and hosting tournaments. These tools can't be created with 7 | out first being able to open up replay files and analyze the content within. 8 | That's why **sc2reader** was built, to provide a solid foundation on which the next 9 | generation of tools and websites can be built and benefit the community. 10 | 11 | So lets get you started right away! Through the linked tutorials and reference 12 | pages below we'll get you started building your own tools and systems in no 13 | time. Any questions, suggestions, or concerns should be posted to the sc2reader 14 | `mailing list`_. You can also pop on to our #sc2reader, our `IRC channel`_ on 15 | Freenode if you want to chat or need some live support. 16 | 17 | .. note:: 18 | 19 | Checkout our :doc:`faq`. If your question isn't covered there, let us know and we'll add it to the list. 20 | 21 | .. _mailing list: http://groups.google.com/group/sc2reader 22 | .. _IRC Channel: http://webchat.freenode.net/?channels=#sc2reader 23 | 24 | 25 | About sc2reader 26 | -------------------- 27 | 28 | **sc2reader** is an open source, MIT licensed, python library for extracting game play information from Starcraft II replay and map files. It is production ready, actively maintained, and hosted publicly on Github [`source`_]. 29 | 30 | Features: 31 | 32 | * Fully parses and extracts all available data from all replay files (arcade included) from every official release (plus the HotS Beta). 33 | * Automatically retrieves maps; extracts basic map data and images. Maps unit type and ability link ids to unit/ability game data. 34 | * Processes replay data into an interlinked set of Team, Player, and Unit objects for easy data manipulation 35 | 36 | Plugins: 37 | 38 | * Selection Tracking: See every player's current selection and hotkeys at every frame of the game. 39 | * APM Tracking: Provides basic APM information for each player by minute and as game averages. 40 | * GameHeartNormalizer: Fixes teams, races, times, and other oddities typical of GameHeart games. 41 | 42 | Scripts: 43 | 44 | * sc2printer: Print basic replay information to the terminal. 45 | * sc2json: Render basic replay information to json for use in other languages. 46 | * sc2replayer: Play back a replay one event at a time with detailed printouts. 47 | 48 | I am actively looking for community members to assist in documenting the replay data and in creating plugins that enhance functionality. `Contact me`_! 49 | 50 | .. _source: http://github.com/GraylinKim/sc2reader 51 | .. _Contact me: mailto://sc2reader@googlegroups.com 52 | 53 | Getting Started 54 | -------------------- 55 | 56 | I recommend the following steps when getting started: 57 | 58 | * Follow the `installation guide`_ 59 | * Read this article on replays: :doc:`articles/whatsinareplay` (5 minutes). 60 | * Read this article on sc2reader: :doc:`articles/conceptsinsc2reader` (5 minutes). 61 | * Short introduction to sc2reader: :doc:`articles/gettingstarted` (5 minutes) 62 | 63 | Now that you've been oriented, you can see sc2reader in action by working through a couple of the tutorials below. 64 | 65 | .. _installation guide: https://github.com/GraylinKim/sc2reader#installation 66 | 67 | 68 | Tutorials 69 | --------------- 70 | 71 | The best way to pick sc2reader up and get started is probably by example. With that in mind, we've written up a series of tutorials on getting various simple tasks done with sc2reader; hopefully they can serve as a quick on ramp for you. 72 | 73 | * :doc:`tutorials/prettyprinter` (10-15 minutes) 74 | 75 | 76 | Articles 77 | ---------------- 78 | 79 | A collection of short handwritten articles about aspects of working with replays and sc2reader. 80 | 81 | * :doc:`articles/whatsinareplay` (5 minutes). 82 | * :doc:`articles/gettingstarted` (5 minutes). 83 | * :doc:`articles/conceptsinsc2reader` (5 minutes). 84 | * :doc:`articles/creatingagameengineplugin` (10 minutes). 85 | 86 | 87 | Reference Pages 88 | ----------------------- 89 | 90 | Don't forget to check the :doc:`faq` if you can't find the answer you are looking for! 91 | 92 | .. toctree:: 93 | 94 | sc2reader 95 | mainobjects 96 | supportobjects 97 | dataobjects 98 | plugins 99 | factories 100 | decoders 101 | utilities 102 | events/index 103 | 104 | 105 | 106 | .. toctree:: 107 | :hidden: 108 | :maxdepth: 2 109 | :glob: 110 | 111 | faq 112 | sc2reader 113 | mainobjects 114 | supportobjects 115 | dataobjects 116 | plugins 117 | factories 118 | decoders 119 | utilities 120 | articles/* 121 | tutorials/* 122 | events/index 123 | -------------------------------------------------------------------------------- /docs/source/mainobjects.rst: -------------------------------------------------------------------------------- 1 | .. currentmodule:: sc2reader.resources 2 | 3 | Main Structures 4 | ====================== 5 | 6 | The outline of the key structures in the replay object. 7 | 8 | 9 | Replay 10 | -------------- 11 | 12 | .. autoclass:: Replay 13 | :members: 14 | 15 | Map 16 | ------------ 17 | 18 | .. autoclass:: Map 19 | :members: 20 | 21 | Game Summary 22 | --------------- 23 | 24 | .. autoclass:: GameSummary 25 | :members: 26 | 27 | -------------------------------------------------------------------------------- /docs/source/plugins.rst: -------------------------------------------------------------------------------- 1 | Plugins 2 | ============= 3 | 4 | sc2reader has a built in game engine that you can plug into to efficiently process replay events. You can add plugins to the engine by calling :meth:`~sc2reader.engine.engine.GameEngine.register_plugin`:: 5 | 6 | import sc2reader 7 | from sc2reader.engine.plugins import APMTracker, SelectionTracker 8 | sc2reader.engine.register_plugin(APMTracker()) 9 | sc2reader.engine.register_plugin(SelectionTracker()) 10 | 11 | Plugins will be called in order of registration for each event. If plugin B depends on plugin A make sure to register plugin A first! 12 | 13 | See the :doc:`articles/creatingagameengineplugin` article for instructions on making your own plugins. 14 | 15 | 16 | ContextLoader 17 | ------------- 18 | 19 | .. note:: 20 | 21 | This plugin is registered by default. 22 | 23 | This plugin creates and maintains all the :class:`~sc2reader.data.Unit` and :class:`~sc2reader.data.Ability` data objects from the raw replay data. This creates all the ``event.player``, ``event.unit``, ``event.ability`` object references and maintains other game data structures like :attr:`~sc2reader.resources.Replay.objects`. 24 | 25 | 26 | GameHeartNormalizer 27 | --------------------- 28 | 29 | .. note:: 30 | 31 | This plugin is registered by default. 32 | 33 | This plugin fixes player lists, teams, game lengths, and frames for games that were played with the GameHeart mod. 34 | 35 | 36 | APMTracker 37 | ---------------- 38 | 39 | The :class:`~sc2reader.engine.plugins.APMTracker` adds three simple fields based on a straight tally of non-camera player action events such as selections, abilities, and hotkeys. 40 | 41 | * ``player.aps`` = a dictionary of second => total actions in that second 42 | * ``player.apm`` = a dictionary of minute => total actions in that minute 43 | * ``player.avg_apm`` = Average APM as a float 44 | 45 | 46 | SelectionTracker 47 | -------------------- 48 | 49 | .. note:: 50 | 51 | This plugin is intended to be used in conjunction with other user written plugins. If you attempt to use the ``player.selection`` attribute outside of a registered plugin the values will be the values as they were at the end of the game. 52 | 53 | The :class:`SelectionTracker` maintains a ``person.selection`` structure maps selection buffers for that player to the player's current selection:: 54 | 55 | active_selection = event.player.selection[10] 56 | 57 | Where buffer is a control group 0-9 or a 10 which represents the active selection. 58 | -------------------------------------------------------------------------------- /docs/source/sc2reader.rst: -------------------------------------------------------------------------------- 1 | .. currentmodule:: sc2reader.factories 2 | 3 | SC2Reader 4 | ====================== 5 | 6 | The replay factory -------------------------------------------------------------------------------- /docs/source/supportobjects.rst: -------------------------------------------------------------------------------- 1 | .. currentmodule:: sc2reader.objects 2 | 3 | Support Structures 4 | ========================= 5 | 6 | These dumb data structures help to give meaningful organization and structure to the information in their respective parent resources. 7 | 8 | 9 | Entity 10 | ------------------ 11 | 12 | .. autoclass:: Entity 13 | :members: 14 | 15 | Player 16 | ------------------ 17 | 18 | .. autoclass:: Player 19 | :members: 20 | 21 | User 22 | ------------------ 23 | 24 | .. autoclass:: User 25 | :members: 26 | 27 | Observer 28 | ------------------ 29 | 30 | .. autoclass:: Observer 31 | :members: 32 | 33 | Computer 34 | ------------------ 35 | 36 | .. autoclass:: Computer 37 | :members: 38 | 39 | Participant 40 | ------------------ 41 | 42 | .. autoclass:: Participant 43 | :members: 44 | 45 | Team 46 | ------------------ 47 | 48 | .. autoclass:: Team 49 | :members: 50 | 51 | 52 | PlayerSummary 53 | ------------------ 54 | 55 | .. autoclass:: PlayerSummary 56 | :members: 57 | 58 | Graph 59 | ------------------ 60 | 61 | .. autoclass:: Graph 62 | :members: 63 | 64 | MapInfo 65 | ------------------ 66 | 67 | .. autoclass:: MapInfo 68 | :members: 69 | 70 | MapInfoPlayer 71 | ------------------ 72 | 73 | .. autoclass:: MapInfoPlayer 74 | :members: 75 | -------------------------------------------------------------------------------- /docs/source/utilities.rst: -------------------------------------------------------------------------------- 1 | .. currentmodule:: sc2reader.utils 2 | 3 | Utilities 4 | =================== 5 | 6 | These utilities are provided to make working with certain types of data a bit easier. 7 | 8 | DepotFile 9 | -------------- 10 | 11 | .. autoclass:: DepotFile 12 | :members: 13 | 14 | 15 | Color 16 | ------------- 17 | 18 | .. autoclass:: Color 19 | :members: 20 | 21 | 22 | Length 23 | ------------- 24 | 25 | .. autoclass:: Length 26 | :members: 27 | 28 | 29 | get_files 30 | --------------- 31 | 32 | .. autofunction:: get_files 33 | -------------------------------------------------------------------------------- /new_units.py: -------------------------------------------------------------------------------- 1 | # Shows new data entries from the requested build files: 2 | # 3 | # Usage: python new_units.py sc2reader/data/HotS/24764_units.csv sc2reader/data/HotS/24764_abilites.csv 4 | # 5 | # The output from this can be used to update the unit_lookup.csv and ability_lookup.csv files. Maybe the 6 | # script can be fixed to append these lines automatically... 7 | # 8 | import pkgutil 9 | import sys 10 | 11 | UNIT_LOOKUP = dict() 12 | for entry in pkgutil.get_data("sc2reader.data", "unit_lookup.csv").splitlines(): 13 | if not entry: 14 | continue 15 | str_id, title = entry.strip().split(",") 16 | UNIT_LOOKUP[str_id] = title 17 | 18 | with open(sys.argv[1]) as new_units: 19 | for line in new_units: 20 | new_unit_name = line.strip().split(",")[1] 21 | if new_unit_name not in UNIT_LOOKUP: 22 | print(f"{new_unit_name},{new_unit_name}") 23 | 24 | print("") 25 | print("") 26 | 27 | ABIL_LOOKUP = dict() 28 | for entry in pkgutil.get_data("sc2reader.data", "ability_lookup.csv").splitlines(): 29 | if not entry: 30 | continue 31 | str_id, abilities = entry.split(",", 1) 32 | ABIL_LOOKUP[str_id] = abilities.split(",") 33 | 34 | with open(sys.argv[2]) as new_abilities: 35 | for line in new_abilities: 36 | new_ability_name = line.strip().split(",")[1] 37 | if new_ability_name not in ABIL_LOOKUP: 38 | print(f"{new_ability_name},{new_ability_name}") 39 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | build-backend = "setuptools.build_meta" 3 | requires = [ 4 | "setuptools>=61.2", 5 | ] 6 | 7 | [project] 8 | name = "sc2reader" 9 | description = "Utility for parsing Starcraft II replay files" 10 | keywords = [ 11 | "parser", 12 | "replay", 13 | "sc2", 14 | "starcraft 2", 15 | ] 16 | license = { text = "MIT" } 17 | authors = [ { name = "Kevin Leung", email = "kkleung89@gmail.com" } ] 18 | requires-python = ">=3.9" 19 | classifiers = [ 20 | "Development Status :: 5 - Production/Stable", 21 | "Environment :: Console", 22 | "Intended Audience :: Developers", 23 | "License :: OSI Approved :: MIT License", 24 | "Natural Language :: English", 25 | "Operating System :: OS Independent", 26 | "Programming Language :: Python", 27 | "Programming Language :: Python :: 3 :: Only", 28 | "Programming Language :: Python :: 3.9", 29 | "Programming Language :: Python :: 3.10", 30 | "Programming Language :: Python :: 3.11", 31 | "Programming Language :: Python :: 3.12", 32 | "Programming Language :: Python :: 3.13", 33 | "Programming Language :: Python :: Implementation :: CPython", 34 | "Programming Language :: Python :: Implementation :: PyPy", 35 | "Topic :: Games/Entertainment", 36 | "Topic :: Games/Entertainment :: Real Time Strategy", 37 | "Topic :: Software Development", 38 | "Topic :: Software Development :: Libraries", 39 | "Topic :: Utilities", 40 | ] 41 | dynamic = [ 42 | "readme", 43 | "version", 44 | ] 45 | dependencies = [ 46 | "mpyq", 47 | "pillow", 48 | ] 49 | optional-dependencies.testing = [ 50 | "pytest", 51 | ] 52 | urls.Homepage = "https://github.com/ggtracker/sc2reader" 53 | scripts.sc2attributes = "sc2reader.scripts.sc2attributes:main" 54 | scripts.sc2json = "sc2reader.scripts.sc2json:main" 55 | scripts.sc2parse = "sc2reader.scripts.sc2parse:main" 56 | scripts.sc2printer = "sc2reader.scripts.sc2printer:main" 57 | scripts.sc2replayer = "sc2reader.scripts.sc2replayer:main" 58 | 59 | [tool.setuptools] 60 | include-package-data = true 61 | zip-safe = true 62 | platforms = [ "any" ] 63 | 64 | [tool.setuptools.dynamic] 65 | readme = { file = [ "README.rst", "CHANGELOG.rst" ] } 66 | version = { attr = "sc2reader.__version__" } 67 | 68 | [tool.setuptools.packages] 69 | find = { namespaces = false } 70 | 71 | [tool.ruff] 72 | line-length = 129 73 | 74 | lint.ignore = [ 75 | "F401", # module imported but unused; consider using `importlib.util.find_spec` to test for availability 76 | "F403", # Run `removestar` on this codebase 77 | "F405", # Run `removestar` on this codebase 78 | "F841", # Run `ruff --select=F841 --fix .` 79 | ] 80 | lint.mccabe.max-complexity = 34 81 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | mpyq 2 | Pillow 3 | -------------------------------------------------------------------------------- /sc2reader/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | sc2reader 3 | ~~~~~~~~~~~ 4 | 5 | A library for loading data from Starcraft II game resources. 6 | 7 | SC2Factory methods called on the package will be delegated to the default 8 | SC2Factory. To default to a cached factory set one or more of the following 9 | variables in your environment: 10 | 11 | SC2READER_CACHE_DIR = '/absolute/path/to/existing/cache/directory/' 12 | SC2READER_CACHE_MAX_SIZE = MAXIMUM_CACHE_ENTRIES_TO_HOLD_IN_MEMORY 13 | 14 | You can also set the default factory via setFactory, useFileCache, useDictCache, 15 | or useDoubleCache functions. 16 | 17 | :copyright: (c) 2011 by Graylin Kim. 18 | :license: MIT, see LICENSE for more details. 19 | """ 20 | 21 | __version__ = "1.8.0" 22 | 23 | import os 24 | import sys 25 | 26 | # import submodules 27 | from sc2reader import engine 28 | from sc2reader import factories, log_utils 29 | 30 | # setup the library logging 31 | log_utils.setup() 32 | 33 | # For backwards compatibility, goes away in 0.7 34 | SC2Reader = factories.SC2Factory 35 | 36 | 37 | def setFactory(factory): 38 | """ 39 | :param factory: The new default factory for the package. 40 | 41 | Links the following sc2reader global methods to the specified factory:: 42 | 43 | * sc2reader.load_replay(s) 44 | * sc2reader.load_map(s) 45 | * sc2reader.load_game_summar(y|ies) 46 | * sc2reader.configure 47 | * sc2reader.reset 48 | * sc2reader.register_plugin 49 | 50 | These methods when called will delegate to the factory for execution. 51 | """ 52 | module = sys.modules[__name__] 53 | module.load_replays = factory.load_replays 54 | module.load_replay = factory.load_replay 55 | module.load_maps = factory.load_maps 56 | module.load_map = factory.load_map 57 | module.load_game_summaries = factory.load_game_summaries 58 | module.load_game_summary = factory.load_game_summary 59 | 60 | module.configure = factory.configure 61 | module.reset = factory.reset 62 | 63 | module.register_plugin = factory.register_plugin 64 | module._defaultFactory = factory 65 | 66 | 67 | def useFileCache(cache_dir, **options): 68 | """ 69 | :param cache_dir: Absolute path to the existing cache directory 70 | 71 | Set the default factory to a new FileCachedSC2Factory with the given cache_dir. 72 | All remote resources are saved to the file system for faster access times. 73 | """ 74 | setFactory(factories.FileCachedSC2Factory(cache_dir, **options)) 75 | 76 | 77 | def useDictCache(cache_max_size=0, **options): 78 | """ 79 | :param cache_max_size: The maximum number of cache entries to hold in memory 80 | 81 | Set the default factory to a new DictCachedSC2Factory with the given cache_dir. 82 | A limited number of remote resources are cached in memory for faster access times. 83 | """ 84 | setFactory(factories.DictCachedSC2Factory(cache_max_size, **options)) 85 | 86 | 87 | def useDoubleCache(cache_dir, cache_max_size=0, **options): 88 | """ 89 | :param cache_dir: Absolute path to the existing cache directory 90 | :param cache_max_size: The maximum number of cache entries to hold in memory 91 | 92 | Set the default factory to a new DoubleCachedSC2Factory with the given cache_dir. 93 | A limited number of remote resources are cached in memory for faster access times. 94 | All remote resources are saved to the file system for faster access times. 95 | """ 96 | setFactory(factories.DoubleCachedSC2Factory(cache_dir, cache_max_size, **options)) 97 | 98 | 99 | # Allow environment variables to activate caching 100 | cache_dir = os.getenv("SC2READER_CACHE_DIR") 101 | cache_max_size = os.getenv("SC2READER_CACHE_MAX_SIZE") 102 | if cache_dir and cache_max_size: 103 | useDoubleCache(cache_dir, cache_max_size) 104 | elif cache_dir: 105 | useFileCache(cache_dir) 106 | elif cache_max_size: 107 | useDictCache(cache_max_size) 108 | else: 109 | setFactory(factories.SC2Factory()) 110 | -------------------------------------------------------------------------------- /sc2reader/constants.py: -------------------------------------------------------------------------------- 1 | import json 2 | import pkgutil 3 | 4 | # These are found in Repack-MPQ/fileset.{locale}#Mods#Core.SC2Mod#{locale}.SC2Data/LocalizedData/Editor/EditorCategoryStrings.txt 5 | # EDSTR_CATEGORY_Race 6 | # EDSTR_PLAYERPROPS_RACE 7 | # The ??? means that I don't know what language it is. 8 | # If multiple languages use the same set they should be comma separated 9 | LOCALIZED_RACES = { 10 | # enUS 11 | "Terran": "Terran", 12 | "Protoss": "Protoss", 13 | "Zerg": "Zerg", 14 | # ruRU 15 | "Терран": "Terran", 16 | "Протосс": "Protoss", 17 | "Зерг": "Zerg", 18 | # koKR 19 | "테란": "Terran", 20 | "프로토스": "Protoss", 21 | "저그": "Zerg", 22 | # plPL 23 | "Terranie": "Terran", 24 | "Protosi": "Protoss", 25 | "Zergi": "Zerg", 26 | # zhCH 27 | "人类": "Terran", 28 | "星灵": "Protoss", 29 | "异虫": "Zerg", 30 | # zhTW 31 | "人類": "Terran", 32 | "神族": "Protoss", 33 | "蟲族": "Zerg", 34 | # ??? 35 | "Terrano": "Terran", 36 | # deDE 37 | "Terraner": "Terran", 38 | # esES - Spanish 39 | # esMX - Latin American 40 | # frFR - French - France 41 | # plPL - Polish Polish 42 | # ptBR - Brazilian Portuguese 43 | } 44 | 45 | MESSAGE_CODES = {"0": "All", "2": "Allies", "128": "Header", "125": "Ping"} 46 | 47 | 48 | GAME_SPEED_FACTOR = { 49 | "WoL": {"Slower": 0.6, "Slow": 0.8, "Normal": 1.0, "Fast": 1.2, "Faster": 1.4}, 50 | "HotS": {"Slower": 0.6, "Slow": 0.8, "Normal": 1.0, "Fast": 1.2, "Faster": 1.4}, 51 | "LotV": {"Slower": 0.2, "Slow": 0.4, "Normal": 0.6, "Fast": 0.8, "Faster": 1.0}, 52 | } 53 | 54 | GATEWAY_CODES = { 55 | "US": "Americas", 56 | "KR": "Asia", 57 | "EU": "Europe", 58 | "SG": "South East Asia", 59 | "XX": "Public Test", 60 | } 61 | 62 | 63 | GATEWAY_LOOKUP = {0: "", 1: "us", 2: "eu", 3: "kr", 5: "cn", 6: "sea", 98: "xx"} 64 | 65 | COLOR_CODES = { 66 | "B4141E": "Red", 67 | "0042FF": "Blue", 68 | "1CA7EA": "Teal", 69 | "EBE129": "Yellow", 70 | "540081": "Purple", 71 | "FE8A0E": "Orange", 72 | "168000": "Green", 73 | "CCA6FC": "Light Pink", 74 | "1F01C9": "Violet", 75 | "525494": "Light Grey", 76 | "106246": "Dark Green", 77 | "4E2A04": "Brown", 78 | "96FF91": "Light Green", 79 | "232323": "Dark Grey", 80 | "E55BB0": "Pink", 81 | "FFFFFF": "White", 82 | "000000": "Black", 83 | } 84 | 85 | COLOR_CODES_INV = dict(zip(COLOR_CODES.values(), COLOR_CODES.keys())) 86 | 87 | SUBREGIONS = { 88 | # United States 89 | "us": {1: "us", 2: "la"}, 90 | # Europe 91 | "eu": {1: "eu", 2: "ru"}, 92 | # Korea - appear to both map to same place 93 | "kr": {1: "kr", 2: "tw"}, 94 | # Taiwan - appear to both map to same place 95 | "tw": {1: "kr", 2: "tw"}, 96 | # China - different url scheme (www.battlenet.com.cn)? 97 | "cn": {1: "cn"}, 98 | # South East Asia 99 | "sea": {1: "sea"}, 100 | # Singapore 101 | "sg": {1: "sg"}, 102 | # Public Test 103 | "xx": {1: "xx"}, 104 | } 105 | 106 | 107 | attributes_json = pkgutil.get_data("sc2reader.data", "attributes.json").decode("utf8") 108 | attributes_dict = json.loads(attributes_json) 109 | LOBBY_PROPERTIES = dict() 110 | for key, value in attributes_dict.get("attributes", dict()).items(): 111 | LOBBY_PROPERTIES[int(key)] = value 112 | -------------------------------------------------------------------------------- /sc2reader/data/HOWTO.md: -------------------------------------------------------------------------------- 1 | Supporting a new StarCraft II build version with updated balance data 2 | ===================================================================== 3 | 4 | Sometimes when a new version comes out, such as (3.4.0) 44401, Blizzard will update the ids used to identify units and abilities. 5 | 6 | See dsjoerg's commits on Jul 13, 2016 for context on what needs to be modified to support these changes: https://github.com/ggtracker/sc2reader/commits/upstream 7 | 8 | Here are some detailed steps on how to add support for these new ids. 9 | 10 | 1. Install and open the StarCraft II Editor, then navigate to `File` -> `Export Balance Data...` and select the expansion level for the balance data you wish to add, then select the directory which you wish to export the balance data to. 11 | 2. Find out the build version this balance data correlates to. One method of doing this is to navigate to the s2protocol repo (https://github.com/Blizzard/s2protocol) and looking at the version of the latest protocol. 12 | At the time of writing, the latest build version is 53644. 13 | 3. Execute `sc2reader/generate_build_data.py`, passing the expansion level selected in step 1, the build version determined in step 2, the directory the balance data was exported to in step 1, and the sc2reader project root directory as parameters. 14 | e.g. `python3 sc2reader/generate_build_data.py LotV 53644 balance_data/ sc2reader/` 15 | This will generate the necessary data files to support the new build version (namely, `53644_abilities.csv`, `53644_units.csv`, and updated versions of `ability_lookup.csv` and `unit_lookup.csv`). 16 | 4. Finally, modify `sc2reader/data/__init__.py` and `sc2reader/resources.py` to register support for the new build version. 17 | 18 | If you are not able to see the correct expansion for the balance data, you may need to authenticate. See the instructions at 19 | https://github.com/ggtracker/sc2reader/issues/98#issuecomment-542554588 on how to do that 20 | -------------------------------------------------------------------------------- /sc2reader/data/WoL/16117_abilities.csv: -------------------------------------------------------------------------------- 1 | 1,CAbilEffect 2 | 2,CAbilQueueable 3 | 3,CAbilProgress 4 | 4,CAbilRedirect 5 | 5,CAbilArmMagazine 6 | 6,CAbilAttack 7 | 7,CAbilAugment 8 | 8,CAbilBattery 9 | 9,CAbilBeacon 10 | 10,CAbilBehavior 11 | 11,CAbilBuild 12 | 12,CAbilBuildable 13 | 13,CAbilEffectInstant 14 | 14,CAbilEffectTarget 15 | 15,CAbilHarvest 16 | 16,CAbilInteract 17 | 17,CAbilInventory 18 | 18,CAbilLearn 19 | 19,CAbilMerge 20 | 20,CAbilMergeable 21 | 21,CAbilMorph 22 | 22,CAbilMorphPlacement 23 | 23,CAbilMove 24 | 24,CAbilPawn 25 | 25,CAbilQueue 26 | 26,CAbilRally 27 | 27,CAbilResearch 28 | 28,CAbilRevive 29 | 29,CAbilSpecialize 30 | 30,CAbilStop 31 | 31,CAbilTrain 32 | 32,CAbilTransport 33 | 33,CAbilWarpable 34 | 34,CAbilWarpTrain 35 | 35,Taunt 36 | 36,stop 37 | 37,HoldFire 38 | 38,move 39 | 39,Beacon 40 | 41,attack 41 | 42,TerranAddOns 42 | 43,TerranBuildingLiftOff 43 | 44,TerranBuildingLand 44 | 45,Refund 45 | 46,Salvage 46 | 47,DisguiseChangeling 47 | 48,Corruption 48 | 49,GhostHoldFire 49 | 50,GhostWeaponsFree 50 | 51,MorphToInfestedTerran 51 | 52,Explode 52 | 53,FleetBeaconResearch 53 | 54,FungalGrowth 54 | 55,GuardianShield 55 | 56,MULERepair 56 | 57,MorphZerglingToBaneling 57 | 58,NexusTrainMothership 58 | 59,Feedback 59 | 60,MassRecall 60 | 61,PlacePointDefenseDrone 61 | 62,HallucinationArchon 62 | 63,HallucinationColossus 63 | 64,HallucinationHighTemplar 64 | 65,HallucinationImmortal 65 | 66,HallucinationPhoenix 66 | 67,HallucinationProbe 67 | 68,HallucinationStalker 68 | 69,HallucinationVoidRay 69 | 70,HallucinationWarpPrism 70 | 71,HallucinationZealot 71 | 72,MULEGather 72 | 73,SeekerMissile 73 | 74,CalldownMULE 74 | 75,GravitonBeam 75 | 76,BuildinProgressNydusCanal 76 | 77,Siphon 77 | 78,Leech 78 | 79,SpawnChangeling 79 | 80,DisguiseAsZealot 80 | 81,DisguiseAsMarineWithShield 81 | 82,DisguiseAsMarineWithoutShield 82 | 83,DisguiseAsZerglingWithWings 83 | 84,DisguiseAsZerglingWithoutWings 84 | 85,PhaseShift 85 | 86,Rally 86 | 87,ProgressRally 87 | 88,RallyCommand 88 | 89,RallyNexus 89 | 90,RallyHatchery 90 | 91,RoachWarrenResearch 91 | 92,SapStructure 92 | 93,InfestedTerrans 93 | 94,NeuralParasite 94 | 95,SpawnLarva 95 | 96,StimpackMarauder 96 | 97,SupplyDrop 97 | 98,250mmStrikeCannons 98 | 99,TemporalRift 99 | 100,TimeWarp 100 | 101,UltraliskCavernResearch 101 | 102,WormholeTransit 102 | 103,SCVHarvest 103 | 104,ProbeHarvest 104 | 105,AttackWarpPrism 105 | 106,que1 106 | 107,que5 107 | 108,que5LongBlend 108 | 109,que5Passive 109 | 110,BuildInProgress 110 | 111,Repair 111 | 112,TerranBuild 112 | 113,RavenBuild 113 | 114,Stimpack 114 | 115,GhostCloak 115 | 116,Snipe 116 | 117,MedivacHeal 117 | 118,SiegeMode 118 | 119,Unsiege 119 | 120,BansheeCloak 120 | 121,MedivacTransport 121 | 122,ScannerSweep 122 | 123,Yamato 123 | 124,AssaultMode 124 | 125,FighterMode 125 | 126,BunkerTransport 126 | 127,CommandCenterTransport 127 | 128,CommandCenterLiftOff 128 | 129,CommandCenterLand 129 | 130,BarracksAddOns 130 | 131,BarracksLiftOff 131 | 132,FactoryAddOns 132 | 133,FactoryLiftOff 133 | 134,StarportAddOns 134 | 135,StarportLiftOff 135 | 136,FactoryLand 136 | 137,StarportLand 137 | 138,CommandCenterTrain 138 | 139,BarracksLand 139 | 140,SupplyDepotLower 140 | 141,SupplyDepotRaise 141 | 142,BarracksTrain 142 | 143,FactoryTrain 143 | 144,StarportTrain 144 | 145,EngineeringBayResearch 145 | 146,MercCompoundResearch 146 | 147,ArmSiloWithNuke 147 | 148,BarracksTechLabResearch 148 | 149,FactoryTechLabResearch 149 | 150,StarportTechLabResearch 150 | 151,GhostAcademyResearch 151 | 152,ArmoryResearch 152 | 153,ProtossBuild 153 | 154,WarpPrismTransport 154 | 155,GatewayTrain 155 | 156,StargateTrain 156 | 157,RoboticsFacilityTrain 157 | 158,NexusTrain 158 | 159,PsiStorm 159 | 160,HangarQueue5 160 | 161,BroodLordQueue2 161 | 162,CarrierHangar 162 | 163,ForgeResearch 163 | 164,RoboticsBayResearch 164 | 165,TemplarArchivesResearch 165 | 166,ZergBuild 166 | 167,DroneHarvest 167 | 168,evolutionchamberresearch 168 | 169,UpgradeToLair 169 | 170,UpgradeToHive 170 | 171,UpgradeToGreaterSpire 171 | 172,LairResearch 172 | 173,SpawningPoolResearch 173 | 174,HydraliskDenResearch 174 | 175,SpireResearch 175 | 176,LarvaTrain 176 | 177,MorphToBroodLord 177 | 178,BurrowBanelingDown 178 | 179,BurrowBanelingUp 179 | 180,BurrowDroneDown 180 | 181,BurrowDroneUp 181 | 182,BurrowHydraliskDown 182 | 183,BurrowHydraliskUp 183 | 184,BurrowRoachDown 184 | 185,BurrowRoachUp 185 | 186,BurrowZerglingDown 186 | 187,BurrowZerglingUp 187 | 188,BurrowInfestorTerranDown 188 | 189,BurrowInfestorTerranUp 189 | 190,RedstoneLavaCritterBurrow 190 | 191,RedstoneLavaCritterInjuredBurrow 191 | 192,RedstoneLavaCritterUnburrow 192 | 193,RedstoneLavaCritterInjuredUnburrow 193 | 194,OverlordTransport 194 | 195,Mergeable 195 | 196,Warpable 196 | 197,WarpGateTrain 197 | 198,BurrowQueenDown 198 | 199,BurrowQueenUp 199 | 200,NydusCanalTransport 200 | 201,Blink 201 | 202,BurrowInfestorDown 202 | 203,BurrowInfestorUp 203 | 204,MorphToOverseer 204 | 205,UpgradeToPlanetaryFortress 205 | 206,InfestationPitResearch 206 | 207,BanelingNestResearch 207 | 208,BurrowUltraliskDown 208 | 209,BurrowUltraliskUp 209 | 210,UpgradeToOrbital 210 | 211,UpgradeToWarpGate 211 | 212,MorphBackToGateway 212 | 213,OrbitalLiftOff 213 | 214,OrbitalCommandLand 214 | 215,ForceField 215 | 216,PhasingMode 216 | 217,TransportMode 217 | 218,FusionCoreResearch 218 | 219,CyberneticsCoreResearch 219 | 220,TwilightCouncilResearch 220 | 221,TacNukeStrike 221 | 222,SalvageBunkerRefund 222 | 223,SalvageBunker 223 | 224,EMP 224 | 225,Vortex 225 | 226,TrainQueen 226 | 227,BurrowCreepTumorDown 227 | 228,Transfusion 228 | 229,TechLabMorph 229 | 230,BarracksTechLabMorph 230 | 231,FactoryTechLabMorph 231 | 232,StarportTechLabMorph 232 | 233,ReactorMorph 233 | 234,BarracksReactorMorph 234 | 235,FactoryReactorMorph 235 | 236,StarportReactorMorph 236 | 237,AttackRedirect 237 | 238,StimpackRedirect 238 | 239,StimpackMarauderRedirect 239 | 240,burrowedStop 240 | 241,StopRedirect 241 | 242,GenerateCreep 242 | 243,QueenBuild 243 | 244,SpineCrawlerUproot 244 | 245,SporeCrawlerUproot 245 | 246,SpineCrawlerRoot 246 | 247,SporeCrawlerRoot 247 | 248,CreepTumorBuild 248 | 249,BuildAutoTurret 249 | 250,ArchonWarp 250 | 251,BuildNydusCanal 251 | 252,BroodLordHangar 252 | 253,Charge 253 | 254,TowerCapture 254 | 255,HerdInteract 255 | 256,Frenzy 256 | 257,Contaminate 257 | 258,Shatter 258 | 259,InfestedTerransLayEgg 259 | -------------------------------------------------------------------------------- /sc2reader/data/create_lookup.py: -------------------------------------------------------------------------------- 1 | abilities = dict() 2 | with open("hots_abilities.csv") as f: 3 | for line in f: 4 | num, ability = line.strip("\r\n ").split(",") 5 | abilities[ability] = [""] * 32 6 | 7 | with open("command_lookup.csv") as f: 8 | for line in f: 9 | ability, commands = line.strip("\r\n ").split("|", 1) 10 | abilities[ability] = commands.split("|") 11 | 12 | with open("new_lookup.csv", "w") as out: 13 | for ability, commands in sorted(abilities.items()): 14 | out.write(",".join([ability] + commands) + "\n") 15 | -------------------------------------------------------------------------------- /sc2reader/engine/__init__.py: -------------------------------------------------------------------------------- 1 | import sys 2 | from sc2reader.engine.engine import GameEngine 3 | from sc2reader.engine.events import PluginExit 4 | from sc2reader.engine.utils import GameState 5 | from sc2reader.engine import plugins 6 | 7 | 8 | def setGameEngine(engine): 9 | module = sys.modules[__name__] 10 | module.run = engine.run 11 | module.plugins = engine.plugins 12 | module.register_plugin = engine.register_plugin 13 | module.register_plugins = engine.register_plugins 14 | 15 | 16 | _default_engine = GameEngine() 17 | _default_engine.register_plugin(plugins.GameHeartNormalizer()) 18 | _default_engine.register_plugin(plugins.ContextLoader()) 19 | setGameEngine(_default_engine) 20 | -------------------------------------------------------------------------------- /sc2reader/engine/events.py: -------------------------------------------------------------------------------- 1 | class InitGameEvent: 2 | name = "InitGame" 3 | 4 | 5 | class EndGameEvent: 6 | name = "EndGame" 7 | 8 | 9 | class PluginExit: 10 | name = "PluginExit" 11 | 12 | def __init__(self, plugin, code=0, details=None): 13 | self.plugin = plugin 14 | self.code = code 15 | self.details = details or {} 16 | -------------------------------------------------------------------------------- /sc2reader/engine/plugins/__init__.py: -------------------------------------------------------------------------------- 1 | from sc2reader.engine.plugins.apm import APMTracker 2 | from sc2reader.engine.plugins.selection import SelectionTracker 3 | from sc2reader.engine.plugins.context import ContextLoader 4 | from sc2reader.engine.plugins.supply import SupplyTracker 5 | from sc2reader.engine.plugins.creeptracker import CreepTracker 6 | from sc2reader.engine.plugins.gameheart import GameHeartNormalizer 7 | -------------------------------------------------------------------------------- /sc2reader/engine/plugins/apm.py: -------------------------------------------------------------------------------- 1 | from collections import defaultdict 2 | 3 | 4 | class APMTracker: 5 | """ 6 | Builds ``player.aps`` and ``player.apm`` dictionaries where an action is 7 | any Selection, ControlGroup, or Command event. 8 | 9 | Also provides ``player.avg_apm`` which is defined as the sum of all the 10 | above actions divided by the number of seconds played by the player (not 11 | necessarily the whole game) multiplied by 60. 12 | 13 | APM is 0 for games under 1 minute in length. 14 | """ 15 | 16 | name = "APMTracker" 17 | 18 | def handleInitGame(self, event, replay): 19 | for human in replay.humans: 20 | human.apm = defaultdict(int) 21 | human.aps = defaultdict(int) 22 | human.seconds_played = replay.length.seconds 23 | 24 | def handleControlGroupEvent(self, event, replay): 25 | event.player.aps[event.second] += 1.4 26 | event.player.apm[int(event.second / 60)] += 1.4 27 | 28 | def handleSelectionEvent(self, event, replay): 29 | event.player.aps[event.second] += 1.4 30 | event.player.apm[int(event.second / 60)] += 1.4 31 | 32 | def handleCommandEvent(self, event, replay): 33 | event.player.aps[event.second] += 1.4 34 | event.player.apm[int(event.second / 60)] += 1.4 35 | 36 | def handlePlayerLeaveEvent(self, event, replay): 37 | event.player.seconds_played = event.second 38 | 39 | def handleEndGame(self, event, replay): 40 | for human in replay.humans: 41 | if len(human.apm.keys()) > 0: 42 | human.avg_apm = ( 43 | sum(human.aps.values()) / float(human.seconds_played) * 60 44 | ) 45 | else: 46 | human.avg_apm = 0 47 | -------------------------------------------------------------------------------- /sc2reader/engine/plugins/gameheart.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from sc2reader.utils import Length, get_real_type 3 | from sc2reader.objects import Observer, Team 4 | from sc2reader.engine.events import PluginExit 5 | from sc2reader.constants import GAME_SPEED_FACTOR 6 | 7 | 8 | class GameHeartNormalizer: 9 | """ 10 | normalize a GameHeart replay to: 11 | 1) reset frames to the game start 12 | 2) remove observing players 13 | 3) fix race selection 14 | 4) fix team selection 15 | If a replay is not a GameHeart replay, it should be left untouched 16 | Hopefully, the changes here will also extend to other replays that use 17 | in-game lobbies 18 | 19 | GameHeart games have some constraints we can use here: 20 | * They are all 1v1's. 21 | * You can't random in GameHeart 22 | """ 23 | 24 | name = "GameHeartNormalizer" 25 | 26 | PRIMARY_BUILDINGS = dict(Hatchery="Zerg", Nexus="Protoss", CommandCenter="Terran") 27 | 28 | def handleInitGame(self, event, replay): 29 | # without tracker events game heart games can't be fixed 30 | if len(replay.tracker_events) == 0: 31 | yield PluginExit(self, code=0, details=dict()) 32 | return 33 | 34 | # Exit plugin if game is LOTV as LOTV games dont use GameHeart 35 | if replay.expansion == "LotV": 36 | yield PluginExit(self, code=0, details=dict()) 37 | return 38 | 39 | start_frame = -1 40 | actual_players = {} 41 | for event in replay.tracker_events: 42 | if start_frame != -1 and event.frame > start_frame + 5: # fuzz it a little 43 | break 44 | if ( 45 | event.name == "UnitBornEvent" 46 | and event.control_pid 47 | and event.unit_type_name in self.PRIMARY_BUILDINGS 48 | ): 49 | # In normal replays, starting units are born on frame zero. 50 | if event.frame == 0: 51 | yield PluginExit(self, code=0, details=dict()) 52 | return 53 | else: 54 | start_frame = event.frame 55 | actual_players[event.control_pid] = self.PRIMARY_BUILDINGS[ 56 | event.unit_type_name 57 | ] 58 | 59 | self.fix_entities(replay, actual_players) 60 | self.fix_events(replay, start_frame) 61 | 62 | replay.frames -= start_frame 63 | replay.game_length = Length(seconds=replay.frames / 16) 64 | replay.real_type = get_real_type(replay.teams) 65 | replay.real_length = Length( 66 | seconds=int(replay.game_length.seconds / GAME_SPEED_FACTOR[replay.speed]) 67 | ) 68 | replay.start_time = datetime.utcfromtimestamp( 69 | replay.unix_timestamp - replay.real_length.seconds 70 | ) 71 | 72 | def fix_events(self, replay, start_frame): 73 | # Set back the game clock for all events 74 | for event in replay.events: 75 | if event.frame < start_frame: 76 | event.frame = 0 77 | event.second = 0 78 | else: 79 | event.frame -= start_frame 80 | event.second = event.frame >> 4 81 | 82 | def fix_entities(self, replay, actual_players): 83 | # Change the players that aren't playing into observers 84 | for p in [p for p in replay.players if p.pid not in actual_players]: 85 | # Fix the slot data to be accurate 86 | p.slot_data["observe"] = 1 87 | p.slot_data["team_id"] = None 88 | obs = Observer(p.sid, p.slot_data, p.uid, p.init_data, p.pid) 89 | 90 | # Because these obs start the game as players the client 91 | # creates various Beacon units for them. 92 | obs.units = p.units 93 | 94 | # Remove all references to the old player 95 | del replay.player[p.pid] 96 | del replay.entity[p.pid] 97 | del replay.human[p.uid] 98 | replay.players.remove(p) 99 | replay.entities.remove(p) 100 | replay.humans.remove(p) 101 | 102 | # Create all the necessary references for the new observer 103 | replay.observer[obs.uid] = obs 104 | replay.entity[obs.pid] = obs 105 | replay.human[obs.uid] = obs 106 | replay.observers.append(obs) 107 | replay.entities.append(obs) 108 | replay.humans.append(obs) 109 | 110 | # Maintain order, just in case someone is depending on it 111 | replay.observers = sorted(replay.observers, key=lambda o: o.sid) 112 | replay.entities = sorted(replay.entities, key=lambda o: o.sid) 113 | replay.humans = sorted(replay.humans, key=lambda o: o.sid) 114 | 115 | # Assume one player per team, should be valid for GameHeart games 116 | replay.team = dict() 117 | replay.teams = list() 118 | for index, player in enumerate(replay.players): 119 | team_id = index + 1 120 | team = Team(team_id) 121 | replay.team[team_id] = team 122 | replay.teams.append(team) 123 | player.team = team 124 | team.result = player.result 125 | player.pick_race = actual_players[player.pid] 126 | player.play_race = player.pick_race 127 | team.players = [player] 128 | team.result = player.result 129 | if team.result == "Win": 130 | replay.winner = team 131 | -------------------------------------------------------------------------------- /sc2reader/engine/plugins/selection.py: -------------------------------------------------------------------------------- 1 | class SelectionTracker: 2 | """ 3 | Tracks a player's active selection as an input into other plugins. 4 | 5 | In some situations selection tracking isn't perfect. The plugin will 6 | detect these situations and report errors. For a player will a high 7 | level of selection errors, it may be best to ignore the selection 8 | results as they could have been severely compromised. 9 | 10 | Exposes the following interface, directly integrated into the player: 11 | 12 | for person in replay.entities: 13 | total_errors = person.selection_errors 14 | 15 | selection = person.selection 16 | control_group_0 = selection[0] 17 | ... 18 | control_group_9 = selection[9] 19 | active_selection = selection[10] 20 | 21 | # TODO: list a few error inducing situations 22 | """ 23 | 24 | name = "SelectionTracker" 25 | 26 | def handleInitGame(self, event, replay): 27 | for person in replay.entities: 28 | person.selection = dict() 29 | for i in range(11): 30 | person.selection[i] = list() 31 | person.selection_errors = 0 32 | 33 | def handleSelectionEvent(self, event, replay): 34 | selection = event.player.selection[event.control_group] 35 | new_selection, error = self._deselect( 36 | selection, event.mask_type, event.mask_data 37 | ) 38 | new_selection = self._select(new_selection, event.objects) 39 | event.player.selection[event.control_group] = new_selection 40 | if error: 41 | event.player.selection_errors += 1 42 | 43 | def handleGetControlGroupEvent(self, event, replay): 44 | selection = event.player.selection[event.control_group] 45 | new_selection, error = self._deselect( 46 | selection, event.mask_type, event.mask_data 47 | ) 48 | event.player.selection[10] = new_selection 49 | if error: 50 | event.player.selection_errors += 1 51 | 52 | def handleSetControlGroupEvent(self, event, replay): 53 | event.player.selection[event.control_group] = event.player.selection[10] 54 | 55 | def handleAddToControlGroupEvent(self, event, replay): 56 | selection = event.player.selection[event.control_group] 57 | new_selection, error = self._deselect( 58 | selection, event.mask_type, event.mask_data 59 | ) 60 | new_selection = self._select(new_selection, event.player.selection[10]) 61 | event.player.selection[event.control_group] = new_selection 62 | if error: 63 | event.player.selection_errors += 1 64 | 65 | def _select(self, selection, units): 66 | return sorted(set(selection + units)) 67 | 68 | def _deselect(self, selection, mode, data): 69 | """ 70 | Returns false if there was a data error when deselecting 71 | """ 72 | if mode == "None": 73 | return selection, False 74 | 75 | selection_size, data_size = len(selection), len(data) 76 | 77 | if mode == "Mask": 78 | # Deselect objects according to deselect mask 79 | def sfilter(bit_u): 80 | return not bit_u[0] 81 | 82 | mask = data + [False] * (selection_size - data_size) 83 | new_selection = [u for (bit, u) in filter(sfilter, zip(mask, selection))] 84 | error = data_size > selection_size 85 | 86 | elif mode == "OneIndices": 87 | # Deselect objects according to indexes 88 | clean_data = list(filter(lambda i: i < selection_size, data)) 89 | new_selection = [u for i, u in enumerate(selection) if i < selection_size] 90 | error = len(list(filter(lambda i: i >= selection_size, data))) != 0 91 | 92 | elif mode == "ZeroIndices": 93 | # Select objects according to indexes 94 | clean_data = list(filter(lambda i: i < selection_size, data)) 95 | new_selection = [selection[i] for i in clean_data] 96 | error = len(clean_data) != data_size 97 | 98 | return new_selection, error 99 | -------------------------------------------------------------------------------- /sc2reader/engine/utils.py: -------------------------------------------------------------------------------- 1 | from bisect import bisect_left 2 | 3 | 4 | class GameState(dict): 5 | def __init__(self, initial_state): 6 | self._frames = list() 7 | self._frameset = set() 8 | self[0] = initial_state 9 | self.locked = False 10 | 11 | def __getitem__(self, frame): 12 | if frame in self: 13 | return super().__getitem__(frame) 14 | 15 | # Get the previous frame from our sorted frame list 16 | # bisect_left returns the left most key where an item is 17 | # less than or equal to the value in that key. If it is 18 | # less than we need to subtract 1 19 | key = bisect_left(self._frames, frame) 20 | if key == len(self._frames) or self._frames[key] > frame: 21 | prev_frame = self._frames[key - 1] 22 | else: 23 | prev_frame = self._frames[key] 24 | 25 | # If we've locked the game state we don't need deep copies anymore 26 | if self.locked: 27 | state = self[prev_frame] 28 | else: 29 | # Copy the previous state and use it as our basis here 30 | state = self[prev_frame] 31 | if hasattr(state, "copy"): 32 | state = state.copy() 33 | 34 | self[frame] = state 35 | return state 36 | 37 | def __setitem__(self, frame, value): 38 | if frame not in self._frameset: 39 | self._frames.insert(bisect_left(self._frames, frame), frame) 40 | self._frameset.add(frame) 41 | 42 | super().__setitem__(frame, value) 43 | -------------------------------------------------------------------------------- /sc2reader/events/__init__.py: -------------------------------------------------------------------------------- 1 | # Export all events of all types to the package interface 2 | from sc2reader.events import base, game, message, tracker 3 | from sc2reader.events.base import * 4 | from sc2reader.events.game import * 5 | from sc2reader.events.message import * 6 | from sc2reader.events.tracker import * 7 | -------------------------------------------------------------------------------- /sc2reader/events/base.py: -------------------------------------------------------------------------------- 1 | class Event: 2 | name = "Event" 3 | -------------------------------------------------------------------------------- /sc2reader/events/message.py: -------------------------------------------------------------------------------- 1 | from sc2reader.events.base import Event 2 | from sc2reader.utils import Length 3 | from sc2reader.log_utils import loggable 4 | 5 | 6 | @loggable 7 | class MessageEvent(Event): 8 | """ 9 | Parent class for all message events. 10 | """ 11 | 12 | def __init__(self, frame, pid): 13 | #: The user id (or player id for older replays) of the person that generated the event. 14 | self.pid = pid 15 | 16 | #: The frame of the game this event was applied 17 | self.frame = frame 18 | 19 | #: The second of the game (game time not real time) this event was applied 20 | self.second = frame >> 4 21 | 22 | #: Short cut string for event class name 23 | self.name = self.__class__.__name__ 24 | 25 | def _str_prefix(self): 26 | player_name = self.player.name if getattr(self, "pid", 16) != 16 else "Global" 27 | return f"{Length(seconds=int(self.frame / 16))}\t{player_name:<15} " 28 | 29 | def __str__(self): 30 | return self._str_prefix() + self.name 31 | 32 | 33 | @loggable 34 | class ChatEvent(MessageEvent): 35 | """ 36 | Records in-game chat events. 37 | """ 38 | 39 | def __init__(self, frame, pid, target, text): 40 | super().__init__(frame, pid) 41 | #: The numerical target type. 0 = to all; 2 = to allies; 4 = to observers. 42 | self.target = target 43 | 44 | #: The text of the message. 45 | self.text = text 46 | 47 | #: Flag marked true of message was to all. 48 | self.to_all = self.target == 0 49 | 50 | #: Flag marked true of message was to allies. 51 | self.to_allies = self.target == 2 52 | 53 | #: Flag marked true of message was to observers. 54 | self.to_observers = self.target == 4 55 | 56 | 57 | @loggable 58 | class ProgressEvent(MessageEvent): 59 | """ 60 | Sent during the load screen to update load process for other clients. 61 | """ 62 | 63 | def __init__(self, frame, pid, progress): 64 | super().__init__(frame, pid) 65 | 66 | #: Marks the load progress for the player. Scaled 0-100. 67 | self.progress = progress 68 | 69 | 70 | @loggable 71 | class PingEvent(MessageEvent): 72 | """ 73 | Records pings made by players in game. 74 | """ 75 | 76 | def __init__(self, frame, pid, target, x, y): 77 | super().__init__(frame, pid) 78 | 79 | #: The numerical target type. 0 = to all; 2 = to allies; 4 = to observers. 80 | self.target = target 81 | 82 | #: Flag marked true of message was to all. 83 | self.to_all = self.target == 0 84 | 85 | #: Flag marked true of message was to allies. 86 | self.to_allies = self.target == 2 87 | 88 | #: Flag marked true of message was to observers. 89 | self.to_observers = self.target == 4 90 | 91 | #: The x coordinate of the target location 92 | self.x = x 93 | 94 | #: The y coordinate of the target location 95 | self.y = y 96 | 97 | #: The (x,y) coordinate of the target location 98 | self.location = (self.x, self.y) 99 | -------------------------------------------------------------------------------- /sc2reader/exceptions.py: -------------------------------------------------------------------------------- 1 | class SC2ReaderError(Exception): 2 | pass 3 | 4 | 5 | class SC2ReaderLocalizationError(SC2ReaderError): 6 | pass 7 | 8 | 9 | class CorruptTrackerFileError(SC2ReaderError): 10 | pass 11 | 12 | 13 | class MPQError(SC2ReaderError): 14 | pass 15 | 16 | 17 | class NoMatchingFilesError(SC2ReaderError): 18 | pass 19 | 20 | 21 | class MultipleMatchingFilesError(SC2ReaderError): 22 | pass 23 | 24 | 25 | class ReadError(SC2ReaderError): 26 | def __init__(self, msg, type, location, replay=None, game_events=[], buffer=None): 27 | self.__dict__.update(locals()) 28 | super().__init__(msg) 29 | 30 | def __str__(self): 31 | return f"{self.msg}, Type: {self.type}" 32 | 33 | 34 | class ParseError(SC2ReaderError): 35 | pass 36 | 37 | 38 | class ProcessError(SC2ReaderError): 39 | pass 40 | 41 | 42 | class FileError(SC2ReaderError): 43 | pass 44 | -------------------------------------------------------------------------------- /sc2reader/factories/__init__.py: -------------------------------------------------------------------------------- 1 | from sc2reader.factories.sc2factory import SC2Factory 2 | from sc2reader.factories.sc2factory import FileCachedSC2Factory 3 | from sc2reader.factories.sc2factory import DictCachedSC2Factory 4 | from sc2reader.factories.sc2factory import DoubleCachedSC2Factory 5 | -------------------------------------------------------------------------------- /sc2reader/factories/plugins/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/sc2reader/factories/plugins/__init__.py -------------------------------------------------------------------------------- /sc2reader/factories/plugins/utils.py: -------------------------------------------------------------------------------- 1 | from bisect import bisect_left 2 | from collections import defaultdict 3 | from datetime import datetime 4 | from functools import wraps 5 | import json 6 | 7 | from sc2reader.log_utils import loggable 8 | 9 | 10 | def plugin(func): 11 | @wraps(func) 12 | def wrapper(**options): 13 | @wraps(func) 14 | def call(*args, **kwargs): 15 | opt = kwargs.copy() 16 | opt.update(options) 17 | return func(*args, **opt) 18 | 19 | return call 20 | 21 | return wrapper 22 | 23 | 24 | class JSONDateEncoder(json.JSONEncoder): 25 | def default(self, obj): 26 | if isinstance(obj, datetime): 27 | return obj.strftime("%Y-%m-%d %H:%M:%S") 28 | return json.JSONEncoder.default(self, obj) 29 | 30 | 31 | class GameState(dict): 32 | def __init__(self, initial_state): 33 | self._frames = list() 34 | self._frameset = set() 35 | self[0] = initial_state 36 | self.locked = False 37 | 38 | def __getitem__(self, frame): 39 | if frame in self: 40 | return super().__getitem__(frame) 41 | 42 | # Get the previous frame from our sorted frame list 43 | # bisect_left returns the left most key where an item is 44 | # less than or equal to the value in that key. If it is 45 | # less than we need to subtract 1 46 | key = bisect_left(self._frames, frame) 47 | if key == len(self._frames) or self._frames[key] > frame: 48 | prev_frame = self._frames[key - 1] 49 | else: 50 | prev_frame = self._frames[key] 51 | 52 | # If we've locked the game state we don't need deep copies anymore 53 | if self.locked: 54 | state = self[prev_frame] 55 | else: 56 | # Copy the previous state and use it as our basis here 57 | state = self[prev_frame] 58 | if hasattr(state, "copy"): 59 | state = state.copy() 60 | 61 | self[frame] = state 62 | return state 63 | 64 | def __setitem__(self, frame, value): 65 | if frame not in self._frameset: 66 | self._frames.insert(bisect_left(self._frames, frame), frame) 67 | self._frameset.add(frame) 68 | 69 | super().__setitem__(frame, value) 70 | 71 | 72 | @loggable 73 | class UnitSelection: 74 | def __init__(self, objects=None): 75 | self.objects = objects or list() 76 | 77 | def select(self, new_objects): 78 | new_set = set(self.objects + list(new_objects)) 79 | self.objects = sorted(new_set, key=lambda obj: obj.id) 80 | 81 | def deselect(self, mode, data): 82 | """Returns false if there was a data error when deselecting""" 83 | size = len(self.objects) 84 | 85 | if mode == "None": 86 | return True 87 | 88 | elif mode == "Mask": 89 | """Deselect objects according to deselect mask""" 90 | mask = data 91 | if len(mask) < size: 92 | # pad to the right 93 | mask = mask + [False] * (len(self.objects) - len(mask)) 94 | 95 | self.logger.debug(f"Deselection Mask: {mask}") 96 | self.objects = [ 97 | obj 98 | for (slct, obj) in filter( 99 | lambda slct_obj: not slct_obj[0], zip(mask, self.objects) 100 | ) 101 | ] 102 | return len(mask) <= size 103 | 104 | elif mode == "OneIndices": 105 | """Deselect objects according to indexes""" 106 | clean_data = list(filter(lambda i: i < size, data)) 107 | self.objects = [ 108 | self.objects[i] for i in range(len(self.objects)) if i not in clean_data 109 | ] 110 | return len(clean_data) == len(data) 111 | 112 | elif mode == "ZeroIndices": 113 | """Deselect objects according to indexes""" 114 | clean_data = list(filter(lambda i: i < size, data)) 115 | self.objects = [self.objects[i] for i in clean_data] 116 | return len(clean_data) == len(data) 117 | 118 | else: 119 | return False 120 | 121 | def __str__(self): 122 | return ", ".join(str(obj) for obj in self.objects) 123 | 124 | def copy(self): 125 | return UnitSelection(self.objects[:]) 126 | 127 | 128 | class PlayerSelection(defaultdict): 129 | def __init__(self): 130 | super().__init__(UnitSelection) 131 | 132 | def copy(self): 133 | new = PlayerSelection() 134 | for bank, selection in self.items(): 135 | new[bank] = selection # UnitSelection(selection.objects[:]) 136 | return new 137 | -------------------------------------------------------------------------------- /sc2reader/log_utils.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | try: 4 | unicode 5 | except NameError: 6 | basestring = unicode = str 7 | 8 | try: 9 | from logging import NullHandler 10 | except ImportError: 11 | # Copied from the Python 2.7 source code. 12 | class NullHandler(logging.Handler): 13 | """ 14 | This handler does nothing. It's intended to be used to avoid the 15 | "No handlers could be found for logger XXX" one-off warning. This is 16 | important for library code, which may contain code to log events. If a user 17 | of the library does not configure logging, the one-off warning might be 18 | produced; to avoid this, the library developer simply needs to instantiate 19 | a NullHandler and add it to the top-level logger of the library module or 20 | package. 21 | """ 22 | 23 | def handle(self, record): 24 | pass 25 | 26 | def emit(self, record): 27 | pass 28 | 29 | def createLock(self): 30 | self.lock = None 31 | 32 | 33 | LEVEL_MAP = dict( 34 | DEBUG=logging.DEBUG, 35 | INFO=logging.INFO, 36 | WARN=logging.WARNING, 37 | ERROR=logging.ERROR, 38 | CRITICAL=logging.CRITICAL, 39 | ) 40 | 41 | 42 | def setup(): 43 | logging.getLogger("sc2reader").addHandler(NullHandler()) 44 | 45 | 46 | def log_to_file(filename, level="WARN", format=None, datefmt=None, **options): 47 | add_log_handler(logging.FileHandler(filename, **options), level, format, datefmt) 48 | 49 | 50 | def log_to_console(level="WARN", format=None, datefmt=None, **options): 51 | add_log_handler(logging.StreamHandler(**options), level, format, datefmt) 52 | 53 | 54 | def add_log_handler(handler, level="WARN", format=None, datefmt=None): 55 | handler.setFormatter(logging.Formatter(format, datefmt)) 56 | 57 | if isinstance(level, basestring): 58 | level = LEVEL_MAP[level] 59 | 60 | logger = logging.getLogger("sc2reader") 61 | logger.setLevel(level) 62 | logger.addHandler(handler) 63 | 64 | 65 | def get_logger(entity): 66 | """ 67 | Retrieves loggers from the enties fully scoped name. 68 | 69 | get_logger(Replay) -> sc2reader.replay.Replay 70 | get_logger(get_logger) -> sc2reader.utils.get_logger 71 | 72 | :param entity: The entity for which we want a logger. 73 | """ 74 | try: 75 | return logging.getLogger(entity.__module__ + "." + entity.__name__) 76 | 77 | except AttributeError: 78 | raise TypeError(f"Cannot retrieve logger for {entity}.") 79 | 80 | 81 | def loggable(cls): 82 | cls.logger = get_logger(cls) 83 | return cls 84 | -------------------------------------------------------------------------------- /sc2reader/scripts/__init__.py: -------------------------------------------------------------------------------- 1 | # import submodules 2 | from sc2reader.scripts import utils 3 | -------------------------------------------------------------------------------- /sc2reader/scripts/sc2attributes.py: -------------------------------------------------------------------------------- 1 | # 2 | # Recursively searches for s2gs files in specified paths. Adds 3 | # new attributes and values and allows the user to choose when 4 | # conflicts are detected. 5 | # 6 | # Usage: sc2attributes PATH... 7 | # 8 | # Cannot be run from an egg installation because attributes.json 9 | # must be writable. Install from source when you want to use this. 10 | # 11 | # ---------------------------------------------------------------- 12 | # 13 | # The file has the following structure: 14 | # 15 | # sc2reader/data/attributes.json - { 16 | # "attributes": { json object }, 17 | # "decisions": "pickled python object", 18 | # } 19 | # 20 | # Why we need to track decisions: 21 | # 22 | # Sometimes the attribute names or values can change over time 23 | # or have values we don't like. When the script detects conflicts 24 | # between the s2gs names and the existing attribute names it 25 | # notifies the user and asks for a decision. In order to save the 26 | # user from making the same decisions over and over again we save 27 | # those decisions. The decisions are pickled instead of in json 28 | # because the data structure is too complex for the json format. 29 | # 30 | 31 | import argparse 32 | import json 33 | import os 34 | import pickle 35 | import traceback 36 | 37 | import sc2reader 38 | 39 | try: 40 | raw_input # Python 2 41 | except NameError: 42 | raw_input = input # Python 3 43 | 44 | decisions = dict() 45 | 46 | 47 | def main(): 48 | global decisions 49 | 50 | parser = argparse.ArgumentParser( 51 | description="Recursively parses replay files, intended for debugging parse issues." 52 | ) 53 | parser.add_argument( 54 | "folders", metavar="folder", type=str, nargs="+", help="Path to a folder" 55 | ) 56 | args = parser.parse_args() 57 | 58 | scripts_dir = os.path.dirname(os.path.abspath(__file__)) 59 | data_path = os.path.normpath( 60 | os.path.join(scripts_dir, "..", "data", "attributes.json") 61 | ) 62 | 63 | attributes = dict() 64 | if os.path.exists(data_path): 65 | with open(data_path) as data_file: 66 | data = json.load(data_file) 67 | attributes = data.get("attributes", attributes) 68 | decisions = pickle.loads(data.get("decisions", "(dp0\n.")) 69 | 70 | for folder in args.folders: 71 | for path in sc2reader.utils.get_files(folder, extension="s2gs"): 72 | try: 73 | summary = sc2reader.load_game_summary(path) 74 | for prop in summary.parts[0][5]: 75 | group_key = prop[0][1] 76 | group_name = summary.translations["enUS"][group_key] 77 | attribute_values = dict() 78 | if str(group_key) in attributes: 79 | attribute_name, attribute_values = attributes[str(group_key)] 80 | if attribute_name != group_name: 81 | group_name = get_choice( 82 | group_key, attribute_name, group_name 83 | ) 84 | 85 | for value in prop[1]: 86 | value_key = value[0].strip("\x00 ").replace(" v ", "v") 87 | value_name = summary.lang_sheets["enUS"][value[1][0][1]][ 88 | value[1][0][2] 89 | ] 90 | if str(value_key) in attribute_values: 91 | attribute_value_name = attribute_values[str(value_key)] 92 | if value_name != attribute_value_name: 93 | value_name = get_choice( 94 | (group_key, value_key), 95 | attribute_value_name, 96 | value_name, 97 | ) 98 | 99 | attribute_values[str(value_key)] = value_name 100 | 101 | attributes[f"{group_key:0>4}"] = ( 102 | group_name, 103 | attribute_values, 104 | ) 105 | except Exception as e: 106 | if isinstance(e, KeyboardInterrupt): 107 | raise 108 | else: 109 | traceback.print_exc() 110 | 111 | with open(data_path, "w") as data_file: 112 | data = dict(attributes=attributes, decisions=pickle.dumps(decisions)) 113 | json.dump(data, data_file, indent=2, sort_keys=True) 114 | 115 | 116 | def get_choice(s2gs_key, old_value, new_value): 117 | global decisions 118 | 119 | # This way old/new values can be swapped and decision is remembered 120 | key = frozenset([s2gs_key, old_value, new_value]) 121 | if key not in decisions: 122 | print(f"Naming conflict on {s2gs_key}: {old_value} != {new_value}") 123 | print("Which do you want to use?") 124 | print(f" (o) Old value '{old_value}'") 125 | print(f" (n) New value '{new_value}'") 126 | while True: 127 | answer = raw_input("Choose 'o' or 'n' then press enter: ").lower() 128 | if answer not in ("o", "n"): 129 | print(f"Invalid choice `{answer}`") 130 | else: 131 | break 132 | decisions[key] = {"o": old_value, "n": new_value}[answer] 133 | print("") 134 | return decisions[key] 135 | 136 | 137 | if __name__ == "__main__": 138 | main() 139 | -------------------------------------------------------------------------------- /sc2reader/scripts/sc2json.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import sc2reader 4 | from sc2reader.factories.plugins.replay import toJSON 5 | 6 | 7 | def main(): 8 | import argparse 9 | 10 | parser = argparse.ArgumentParser(description="Prints replay data to a json string.") 11 | parser.add_argument( 12 | "--indent", 13 | "-i", 14 | type=int, 15 | default=None, 16 | help="The per-line indent to use when printing a human readable json string", 17 | ) 18 | parser.add_argument( 19 | "--encoding", 20 | "-e", 21 | type=str, 22 | default="UTF-8", 23 | help="The character encoding use..", 24 | ) 25 | parser.add_argument( 26 | "path", 27 | metavar="path", 28 | type=str, 29 | nargs=1, 30 | help="Path to the replay to serialize.", 31 | ) 32 | args = parser.parse_args() 33 | 34 | factory = sc2reader.factories.SC2Factory() 35 | try: 36 | factory.register_plugin( 37 | "Replay", toJSON(encoding=args.encoding, indent=args.indent) 38 | ) # legacy Python 39 | except TypeError: 40 | factory.register_plugin("Replay", toJSON(indent=args.indent)) 41 | replay_json = factory.load_replay(args.path[0]) 42 | print(replay_json) 43 | 44 | 45 | if __name__ == "__main__": 46 | main() 47 | -------------------------------------------------------------------------------- /sc2reader/scripts/sc2replayer.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | try: 4 | # Assume that we are on *nix or Mac 5 | import termios 6 | import fcntl 7 | import os 8 | import sys 9 | 10 | def getch(): 11 | fd = sys.stdin.fileno() 12 | oldterm = termios.tcgetattr(fd) 13 | newattr = termios.tcgetattr(fd) 14 | newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO 15 | termios.tcsetattr(fd, termios.TCSANOW, newattr) 16 | oldflags = fcntl.fcntl(fd, fcntl.F_GETFL) 17 | fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK) 18 | try: 19 | while 1: 20 | try: 21 | sys.stdin.read(1) 22 | break 23 | except OSError: 24 | pass 25 | finally: 26 | termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm) 27 | fcntl.fcntl(fd, fcntl.F_SETFL, oldflags) 28 | 29 | except ImportError as e: 30 | try: 31 | # Oops, we might be on windows, try this one 32 | from msvcrt import getch 33 | except ImportError as e: 34 | # We can't make getch happen, just dump events to the screen 35 | def getch(): 36 | return True 37 | 38 | 39 | import argparse 40 | import sc2reader 41 | from sc2reader.events import ( 42 | CameraEvent, 43 | CommandEvent, 44 | ControlGroupEvent, 45 | GameStartEvent, 46 | PlayerLeaveEvent, 47 | SelectionEvent, 48 | ) 49 | 50 | 51 | def main(): 52 | parser = argparse.ArgumentParser( 53 | description="""Step by step replay of game events; shows only the 54 | Initialization, Command, and Selection events by default. Press any 55 | key to advance through the events in sequential order.""" 56 | ) 57 | 58 | parser.add_argument("FILE", type=str, help="The file you would like to replay") 59 | parser.add_argument( 60 | "--player", 61 | default=0, 62 | type=int, 63 | help="The number of the player you would like to watch. Defaults to 0 (All).", 64 | ) 65 | parser.add_argument( 66 | "--bytes", 67 | default=False, 68 | action="store_true", 69 | help="Displays the byte code of the event in hex after each event.", 70 | ) 71 | parser.add_argument( 72 | "--hotkeys", 73 | default=False, 74 | action="store_true", 75 | help="Shows the hotkey events in the event stream.", 76 | ) 77 | parser.add_argument( 78 | "--cameras", 79 | default=False, 80 | action="store_true", 81 | help="Shows the camera events in the event stream.", 82 | ) 83 | args = parser.parse_args() 84 | 85 | for filename in sc2reader.utils.get_files(args.FILE): 86 | replay = sc2reader.load_replay(filename, debug=True) 87 | print(f"Release {replay.release_string}") 88 | print(f"{replay.type} on {replay.map_name} at {replay.start_time}") 89 | print("") 90 | for team in replay.teams: 91 | print(team) 92 | for player in team.players: 93 | print(f" {player}") 94 | print("\n--------------------------\n\n") 95 | 96 | # Allow picking of the player to 'watch' 97 | if args.player: 98 | events = replay.player[args.player].events 99 | else: 100 | events = replay.events 101 | 102 | # Allow specification of events to `show` 103 | # Loop through the events 104 | for event in events: 105 | if ( 106 | isinstance(event, CommandEvent) 107 | or isinstance(event, SelectionEvent) 108 | or isinstance(event, PlayerLeaveEvent) 109 | or isinstance(event, GameStartEvent) 110 | or (args.hotkeys and isinstance(event, ControlGroupEvent)) 111 | or (args.cameras and isinstance(event, CameraEvent)) 112 | ): 113 | print(event) 114 | getch() 115 | if args.bytes: 116 | print("\t" + event.bytes.encode("hex")) 117 | 118 | 119 | if __name__ == "__main__": 120 | main() 121 | -------------------------------------------------------------------------------- /test_replays/1.0.0.16117/1.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.0.0.16117/1.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.0.1.16195/Arctic_vs_Froadac_5766.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.0.1.16195/Arctic_vs_Froadac_5766.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.0.1.16195/Froadac_vs_Bunnies_5770.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.0.1.16195/Froadac_vs_Bunnies_5770.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.0.1.16195/Froadac_vs_Tetramaster_6031.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.0.1.16195/Froadac_vs_Tetramaster_6031.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.0.1.16195/PredatorPR_vs_Froadac_5702.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.0.1.16195/PredatorPR_vs_Froadac_5702.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.0.1.16195/Taandey_vs_Froadac_5564.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.0.1.16195/Taandey_vs_Froadac_5564.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.0.2.16223/Froadac_vs_Jim_6063.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.0.2.16223/Froadac_vs_Jim_6063.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.0.2.16223/Froadac_vs_Pubu_5850.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.0.2.16223/Froadac_vs_Pubu_5850.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.0.2.16223/Pete_vs_Froadac_6016.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.0.2.16223/Pete_vs_Froadac_6016.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.0.2.16223/Pseudo_vs_Froadac_5694.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.0.2.16223/Pseudo_vs_Froadac_5694.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.0.2.16223/Technqiue_vs_Froadac_5782.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.0.2.16223/Technqiue_vs_Froadac_5782.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.0.2.16223/TvT_Epic-_Tanks_Thors_Banshees.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.0.2.16223/TvT_Epic-_Tanks_Thors_Banshees.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.0.3.16291/1v1_Scrap Station_1903.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.0.3.16291/1v1_Scrap Station_1903.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.0.3.16291/Froadac_vs_Calin_5555.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.0.3.16291/Froadac_vs_Calin_5555.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.0.3.16291/Froadac_vs_Nissassa_5611.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.0.3.16291/Froadac_vs_Nissassa_5611.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.0.3.16291/Froadac_vs_Oppo_6033.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.0.3.16291/Froadac_vs_Oppo_6033.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.0.3.16291/Froadac_vs_Zizzer_5984.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.0.3.16291/Froadac_vs_Zizzer_5984.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.0.3.16291/RookJackson_vs_Froadac_5821.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.0.3.16291/RookJackson_vs_Froadac_5821.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.0.16561/1v1_Blistering Sands_1894.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.0.16561/1v1_Blistering Sands_1894.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.0.16561/1v1_Lost Temple_1893.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.0.16561/1v1_Lost Temple_1893.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.0.16561/21087.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.0.16561/21087.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.0.16561/2v2_Discord IV_18612.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.0.16561/2v2_Discord IV_18612.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.0.16561/2v2_High Orbit_18613.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.0.16561/2v2_High Orbit_18613.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.0.16561/2v2_High Orbit_18614.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.0.16561/2v2_High Orbit_18614.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.0.16561/2v2_Scorched Haven_18616.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.0.16561/2v2_Scorched Haven_18616.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.0.16561/2v2_Scorched Haven_18617.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.0.16561/2v2_Scorched Haven_18617.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.0.16561/2v2_Tarsonis Assault_18994.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.0.16561/2v2_Tarsonis Assault_18994.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.0.16561/2v2_Twilight Fortress_18620.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.0.16561/2v2_Twilight Fortress_18620.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.0.16561/3v3_Dig Site_11014.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.0.16561/3v3_Dig Site_11014.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.0.16561/Froadac_vs_Coontastik_5955.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.0.16561/Froadac_vs_Coontastik_5955.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.0.16561/Froadac_vs_Gileril_5958.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.0.16561/Froadac_vs_Gileril_5958.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.0.16561/Froadac_vs_Shields_5952.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.0.16561/Froadac_vs_Shields_5952.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.0.16561/Ike_vs_Froadac_5957.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.0.16561/Ike_vs_Froadac_5957.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.0.16561/Triiptych_vs_EnS_9384.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.0.16561/Triiptych_vs_EnS_9384.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.0.16561/UnknownEvent_0400.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.0.16561/UnknownEvent_0400.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.0.16561/WeirdInitializationEvent.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.0.16561/WeirdInitializationEvent.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.0.16561/giMpygiMpy_vs_Kim_6731.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.0.16561/giMpygiMpy_vs_Kim_6731.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.0.16561/test.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.0.16561/test.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.1.16605/1v1_Delta Quadrant_316.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.1.16605/1v1_Delta Quadrant_316.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.1.16605/1v1_Metalopolis_2039.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.1.16605/1v1_Metalopolis_2039.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.1.16605/1v1_Scrap Station_1939.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.1.16605/1v1_Scrap Station_1939.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.1.16605/1v1_Shakuras Plateau_1948.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.1.16605/1v1_Shakuras Plateau_1948.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.1.16605/1v1_Shakuras Plateau_2881.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.1.16605/1v1_Shakuras Plateau_2881.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.1.16605/1v1_Steppes of War_1959.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.1.16605/1v1_Steppes of War_1959.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.1.16605/1v1_iCCup Match Point_2037.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.1.16605/1v1_iCCup Match Point_2037.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.1.16605/2v2_Scorched Haven_1935.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.1.16605/2v2_Scorched Haven_1935.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.1.16605/Froadac_vs_Final_5948.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.1.16605/Froadac_vs_Final_5948.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.1.16605/Protoss_vs_Froadac_5974.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.1.16605/Protoss_vs_Froadac_5974.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.1.16605/giMpygiMpy_vs_budsTOashes_6733.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.1.16605/giMpygiMpy_vs_budsTOashes_6733.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.2.16755/1v1_Blistering Sands_341.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.2.16755/1v1_Blistering Sands_341.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.2.16755/1v1_Frontier_3005.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.2.16755/1v1_Frontier_3005.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.2.16755/1v1_Lost Temple_2032.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.2.16755/1v1_Lost Temple_2032.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.2.16755/1v1_Lost Temple_2059.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.2.16755/1v1_Lost Temple_2059.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.2.16755/1v1_Lost Temple_2060.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.2.16755/1v1_Lost Temple_2060.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.2.16755/1v1_Metalopolis_2061.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.2.16755/1v1_Metalopolis_2061.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.2.16755/1v1_Metalopolis_342.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.2.16755/1v1_Metalopolis_342.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.2.16755/1v1_Xel'Naga Caverns_2031.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.2.16755/1v1_Xel'Naga Caverns_2031.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.2.16755/1v1_iCCup Fighting Spirit_2058.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.2.16755/1v1_iCCup Fighting Spirit_2058.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.2.16755/Pro_vs_nubington_8448.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.2.16755/Pro_vs_nubington_8448.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.3.16939/11.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.3.16939/11.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.3.16939/1v1_Blistering Sands_2747.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.3.16939/1v1_Blistering Sands_2747.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.3.16939/1v1_Lost Temple_2347.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.3.16939/1v1_Lost Temple_2347.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.3.16939/1v1_Metalopolis_2019.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.3.16939/1v1_Metalopolis_2019.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.3.16939/23.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.3.16939/23.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.3.16939/2v2_Monlyth Ridge_3048.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.3.16939/2v2_Monlyth Ridge_3048.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.3.16939/2v2_Monlyth Ridge_5906.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.3.16939/2v2_Monlyth Ridge_5906.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.3.16939/Froadac_vs_Tamgerine_6065.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.3.16939/Froadac_vs_Tamgerine_6065.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.3.16939/IceNine_vs_nubington_8573.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.3.16939/IceNine_vs_nubington_8573.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.3.16939/Navedy_vs_Froadac_6018.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.3.16939/Navedy_vs_Froadac_6018.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.3.16939/compLeX_vs_nubington_8515.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.3.16939/compLeX_vs_nubington_8515.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.3.16939/nubington_vs_BowmanSX_8570.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.3.16939/nubington_vs_BowmanSX_8570.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.1.3.16939/nubington_vs_BowmanSX_8582.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.1.3.16939/nubington_vs_BowmanSX_8582.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.0.17326/1v1 with Referee.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.0.17326/1v1 with Referee.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.0.17326/1v1_Shakuras Plateau_13.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.0.17326/1v1_Shakuras Plateau_13.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.0.17326/1v1_Shakuras Plateau_47.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.0.17326/1v1_Shakuras Plateau_47.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.0.17326/1v1_Steppes of War_200.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.0.17326/1v1_Steppes of War_200.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.0.17326/9.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.0.17326/9.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.0.17326/Antiochus_vs_nubington_8576.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.0.17326/Antiochus_vs_nubington_8576.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.0.17326/Azure_vs_BillyMays_10803.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.0.17326/Azure_vs_BillyMays_10803.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.0.17326/Finale_vs_nubington_8606.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.0.17326/Finale_vs_nubington_8606.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.0.17326/KEVNITO_vs_sscciownU_10046.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.0.17326/KEVNITO_vs_sscciownU_10046.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.0.17326/UnknownEvent_041C.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.0.17326/UnknownEvent_041C.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.0.17326/UnknownEvent_043C.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.0.17326/UnknownEvent_043C.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.0.17326/test1-2.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.0.17326/test1-2.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.1.17682/1v1_Lost Temple_3969.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.1.17682/1v1_Lost Temple_3969.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.1.17682/2v2_Scorched Haven_6473.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.1.17682/2v2_Scorched Haven_6473.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.1.17682/BowmanSX_vs_nubington_8614.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.1.17682/BowmanSX_vs_nubington_8614.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.1.17682/Deadiam_vs_McSwagger_6474.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.1.17682/Deadiam_vs_McSwagger_6474.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.1.17682/Froadac_vs_BattleOtter_6040.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.1.17682/Froadac_vs_BattleOtter_6040.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.1.17682/Laegoose_vs_nitrousx_4626.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.1.17682/Laegoose_vs_nitrousx_4626.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.1.17682/Sharky_vs_trolli_4792.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.1.17682/Sharky_vs_trolli_4792.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.1.17682/VTPokebunny_vs_LuckyFool_5768.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.1.17682/VTPokebunny_vs_LuckyFool_5768.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.2.17811/1.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.2.17811/1.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.2.17811/10.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.2.17811/10.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.2.17811/13.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.2.17811/13.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.2.17811/14.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.2.17811/14.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.2.17811/2.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.2.17811/2.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.2.17811/3.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.2.17811/3.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.2.17811/3v3_Colony 426_10434.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.2.17811/3v3_Colony 426_10434.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.2.17811/4.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.2.17811/4.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.2.17811/5.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.2.17811/5.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.2.17811/6.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.2.17811/6.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.2.17811/7.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.2.17811/7.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.2.17811/8.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.2.17811/8.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.2.17811/IbuFlaIVIZ_vs_Nilsson_10162.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.2.17811/IbuFlaIVIZ_vs_Nilsson_10162.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.2.2.17811/Nilsson_vs_Omyns_10164.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.2.2.17811/Nilsson_vs_Omyns_10164.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.0.18092/1v1_The Shattered Temple_2196.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.0.18092/1v1_The Shattered Temple_2196.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.0.18092/1v1_Typhon Peaks_2160.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.0.18092/1v1_Typhon Peaks_2160.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.0.18092/3v3_Ulaan Deeps_2216.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.0.18092/3v3_Ulaan Deeps_2216.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.0.18092/IPA_vs_EnsignLee_8178.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.0.18092/IPA_vs_EnsignLee_8178.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.0.18092/Tixx_vs_Nilsson_10167.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.0.18092/Tixx_vs_Nilsson_10167.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.0.18092/nubington_vs_sMiHorst_8641.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.0.18092/nubington_vs_sMiHorst_8641.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.0.18092/qxc_vs_PredY_9852.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.0.18092/qxc_vs_PredY_9852.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.0.18092/sMiHorst_vs_albertZERG_10345.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.0.18092/sMiHorst_vs_albertZERG_10345.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.1.18221/1v1_Metalopolis_2898.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.1.18221/1v1_Metalopolis_2898.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.1.18221/1v1_Shakuras Plateau_2877.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.1.18221/1v1_Shakuras Plateau_2877.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.1.18221/1v1_Shakuras Plateau_2896.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.1.18221/1v1_Shakuras Plateau_2896.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.1.18221/1v1_Tal'darim Altar LE_2875.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.1.18221/1v1_Tal'darim Altar LE_2875.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.1.18221/1v1_The Shattered Temple_2870.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.1.18221/1v1_The Shattered Temple_2870.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.1.18221/1v1_Xel'Naga Caverns_2874.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.1.18221/1v1_Xel'Naga Caverns_2874.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.1.18221/Effergy_vs_naeblis_10404.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.1.18221/Effergy_vs_naeblis_10404.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.1.18221/iLLUSiONFTW_vs_Nilsson_10170.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.1.18221/iLLUSiONFTW_vs_Nilsson_10170.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.1.18221/seawake_vs_Xzer_10761.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.1.18221/seawake_vs_Xzer_10761.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.1.18221/tehsYs_vs_Nilsson_10175.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.1.18221/tehsYs_vs_Nilsson_10175.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.2.18317/4v4_Outpost_10788.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.2.18317/4v4_Outpost_10788.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.2.18317/Azure_vs_BillyMays_10805.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.2.18317/Azure_vs_BillyMays_10805.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.2.18317/BadFurDay_vs_TheJester_5450.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.2.18317/BadFurDay_vs_TheJester_5450.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.2.18317/Broom_vs_oTLTRO_5384.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.2.18317/Broom_vs_oTLTRO_5384.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.2.18317/DerDrahtige_vs_ThArGos_5452.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.2.18317/DerDrahtige_vs_ThArGos_5452.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.2.18317/Ritsar_vs_Xzer_10778.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.2.18317/Ritsar_vs_Xzer_10778.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.2.18317/Viiper_vs_Auto_5386.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.2.18317/Viiper_vs_Auto_5386.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.2.18317/Zanti_vs_Metalreflux_5451.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.2.18317/Zanti_vs_Metalreflux_5451.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.2.18317/howdini_vs_cKio_5388.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.2.18317/howdini_vs_cKio_5388.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.3.18574/Gutterhulk.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.3.18574/Gutterhulk.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.3.18574/HighOrbit.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.3.18574/HighOrbit.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.3.18574/Metalopolis (11).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.3.18574/Metalopolis (11).SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.3.18574/Monlyth Ridge (6).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.3.18574/Monlyth Ridge (6).SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.3.18574/MonlythRidge.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.3.18574/MonlythRidge.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.3.18574/Sand Canyon (6).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.3.18574/Sand Canyon (6).SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.3.18574/Shakuras Plateau (4).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.3.18574/Shakuras Plateau (4).SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.3.18574/Slag Pits.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.3.18574/Slag Pits.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.3.18574/Tempest.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.3.18574/Tempest.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.3.18574/The Shattered Temple (4).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.3.18574/The Shattered Temple (4).SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.4.18701/24415.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.4.18701/24415.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.4.18701/24420.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.4.18701/24420.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.4.18701/24422.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.4.18701/24422.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.4.18701/24425.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.4.18701/24425.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.4.18701/24427.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.4.18701/24427.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.4.18701/24557.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.4.18701/24557.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.4.18701/24558.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.4.18701/24558.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.4.18701/24652.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.4.18701/24652.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.4.18701/24758.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.4.18701/24758.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.4.18701/24761.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.4.18701/24761.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.5.19132/23815.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.5.19132/23815.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.5.19132/24360.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.5.19132/24360.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.5.19132/24363.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.5.19132/24363.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.5.19132/24367.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.5.19132/24367.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.5.19132/24369.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.5.19132/24369.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.5.19132/24371.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.5.19132/24371.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.5.19132/24648.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.5.19132/24648.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.5.19132/24708.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.5.19132/24708.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.5.19132/24805.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.5.19132/24805.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.5.19132/AmandilGMMA_vs_SCDZingy_20328.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.5.19132/AmandilGMMA_vs_SCDZingy_20328.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.5.19132/iPStylin_vs_SCDTaCo_20332.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.5.19132/iPStylin_vs_SCDTaCo_20332.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.5.19132/tGKorlith_vs_iPStylin_20333.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.5.19132/tGKorlith_vs_iPStylin_20333.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.6.19269/24767.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.6.19269/24767.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.6.19269/24768.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.6.19269/24768.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.6.19269/24771.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.6.19269/24771.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.6.19269/24775.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.6.19269/24775.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.6.19269/24781.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.6.19269/24781.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.6.19269/24782.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.6.19269/24782.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.6.19269/24783.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.6.19269/24783.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.6.19269/24785.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.6.19269/24785.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.6.19269/24799.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.6.19269/24799.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.6.19269/24803.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.6.19269/24803.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.6.19269/24804.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.6.19269/24804.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.6.19269/24807.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.6.19269/24807.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.3.6.19269/24808.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.3.6.19269/24808.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36465.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36465.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36467.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36467.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36469.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36469.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36477.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36477.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36480.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36480.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36498.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36498.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36501.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36501.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36502.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36502.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36503.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36503.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36504.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36504.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36508.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36508.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36509.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36509.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36512.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36512.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36519.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36519.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36520.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36520.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36521.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36521.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36523.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36523.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36526.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36526.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36527.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36527.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36528.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36528.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36529.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36529.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36530.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36530.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36531.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36531.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36532.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36532.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36534.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36534.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36535.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36535.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36536.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36536.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36538.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36538.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36539.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36539.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36540.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36540.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36541.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36541.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36542.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36542.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36654.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36654.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36656.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36656.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36657.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36657.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36658.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36658.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36659.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36659.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36661.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36661.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36662.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36662.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/36663.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/36663.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/Backwater+Gulch.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/Backwater+Gulch.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/Discord IV (10).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/Discord IV (10).SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/Discord IV (11).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/Discord IV (11).SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/High Orbit (11).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/High Orbit (11).SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/Plunder+Isle.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/Plunder+Isle.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/Scorched Haven (23).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/Scorched Haven (23).SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/Shakuras Plateau (36).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/Shakuras Plateau (36).SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/Tal'darim Altar LE (24).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/Tal'darim Altar LE (24).SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/Tempest (6).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/Tempest (6).SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/Tempest (7).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/Tempest (7).SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/The Boneyard (10).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/The Boneyard (10).SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/The Boneyard (11).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/The Boneyard (11).SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/The Boneyard (9).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/The Boneyard (9).SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/The Shattered Temple (26).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/The Shattered Temple (26).SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/Typhon Peaks (18).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/Typhon Peaks (18).SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.0.19679/Xel'Naga Caverns (56).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.0.19679/Xel'Naga Caverns (56).SC2Replay -------------------------------------------------------------------------------- /test_replays/1.4.3.21029/ggtracker_398754.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.4.3.21029/ggtracker_398754.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.5.3.23260/Deadlock Ridge (110).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.5.3.23260/Deadlock Ridge (110).SC2Replay -------------------------------------------------------------------------------- /test_replays/1.5.3.23260/District 10 (68).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.5.3.23260/District 10 (68).SC2Replay -------------------------------------------------------------------------------- /test_replays/1.5.3.23260/ggtracker_109233.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.5.3.23260/ggtracker_109233.SC2Replay -------------------------------------------------------------------------------- /test_replays/1.5.4.24540/Deadlock Ridge (115).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.5.4.24540/Deadlock Ridge (115).SC2Replay -------------------------------------------------------------------------------- /test_replays/1.5.4.24540/ggtracker_1471849.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/1.5.4.24540/ggtracker_1471849.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.0.23260/test2v2.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.0.23260/test2v2.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.0.23925/Akilon Wastes (2).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.0.23925/Akilon Wastes (2).SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.0.23925/Akilon Wastes.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.0.23925/Akilon Wastes.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.0.23925/Antiga Shipyard.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.0.23925/Antiga Shipyard.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.0.23925/Cloud Kingdom LE (2).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.0.23925/Cloud Kingdom LE (2).SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.0.23925/Cloud Kingdom LE.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.0.23925/Cloud Kingdom LE.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.0.23925/jakatak_lunar.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.0.23925/jakatak_lunar.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.0.24247/Cloud Kingdom LE (13).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.0.24247/Cloud Kingdom LE (13).SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.0.24247/Hunting Ground (2).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.0.24247/Hunting Ground (2).SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.0.24247/Korhal City (19).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.0.24247/Korhal City (19).SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.0.24247/Newkirk City (7).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.0.24247/Newkirk City (7).SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.0.24247/PeepMode.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.0.24247/PeepMode.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.0.24247/molten.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.0.24247/molten.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.0.24540/message.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.0.24540/message.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.10.26490/replay26490.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.10.26490/replay26490.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.10.26490/replay26490_friendlyfire.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.10.26490/replay26490_friendlyfire.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.11.26825/DaedalusPoint.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.11.26825/DaedalusPoint.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.11.26825/bad_unit_ids_1.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.11.26825/bad_unit_ids_1.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.3.24764/1.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.3.24764/1.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.3.24764/Akilon Wastes (10).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.3.24764/Akilon Wastes (10).SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.3.24764/Akilon Wastes (2).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.3.24764/Akilon Wastes (2).SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.3.24764/Akilon Wastes (3).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.3.24764/Akilon Wastes (3).SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.3.24764/Akilon Wastes.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.3.24764/Akilon Wastes.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.3.24764/Antiga Shipyard (2).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.3.24764/Antiga Shipyard (2).SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.3.24764/Antiga Shipyard (3).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.3.24764/Antiga Shipyard (3).SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.3.24764/Antiga Shipyard.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.3.24764/Antiga Shipyard.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.3.24764/Newkirk City.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.3.24764/Newkirk City.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.3.24764/Star Station (2).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.3.24764/Star Station (2).SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.3.24764/Star Station (3).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.3.24764/Star Station (3).SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.3.24764/Star Station (4).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.3.24764/Star Station (4).SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.3.24764/Star Station (5).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.3.24764/Star Station (5).SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.3.24764/Star Station.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.3.24764/Star Station.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.3.24764/Swarm Training Stage 3.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.3.24764/Swarm Training Stage 3.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.3.24764/The Bio Lab.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.3.24764/The Bio Lab.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.3.24764/ggtracker_1571740.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.3.24764/ggtracker_1571740.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.3.24764/new_hots.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.3.24764/new_hots.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.3.24764/new_units.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.3.24764/new_units.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.3.24764/resume_from_replay.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.3.24764/resume_from_replay.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.3.24764/wraithan_korhal.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.3.24764/wraithan_korhal.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.4.24944/Backwater Complex (15).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.4.24944/Backwater Complex (15).SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.4.24944/Lunar Colony V.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.4.24944/Lunar Colony V.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.4.24944/ggtracker_1789768.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.4.24944/ggtracker_1789768.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.5.25092/cn1.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.5.25092/cn1.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.7.25293/ggtracker_2868002.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.7.25293/ggtracker_2868002.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.8.25446/ggtracker_3024127.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.8.25446/ggtracker_3024127.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.8.25446/ggtracker_3024216.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.8.25446/ggtracker_3024216.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.8.25446/ggtracker_3117069.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.8.25446/ggtracker_3117069.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.8.25446/ggtracker_3167674.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.8.25446/ggtracker_3167674.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.8.25446/ggtracker_3167851.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.8.25446/ggtracker_3167851.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.8.25446/ggtracker_3230037.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.8.25446/ggtracker_3230037.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.8.25604/issue131_arid_wastes.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.8.25604/issue131_arid_wastes.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.8.25604/issue135.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.8.25604/issue135.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.8.25604/issue136.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.8.25604/issue136.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.8.25604/mlg1.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.8.25604/mlg1.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.8.25605/ggtracker_3621322.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.8.25605/ggtracker_3621322.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.8.25605/ggtracker_3621402.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.8.25605/ggtracker_3621402.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.8.25605/ggtracker_3663861.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.8.25605/ggtracker_3663861.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.8.25605/ggtracker_3695400.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.8.25605/ggtracker_3695400.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.0.9.26147/bad_unit_ids_2.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.0.9.26147/bad_unit_ids_2.SC2Replay -------------------------------------------------------------------------------- /test_replays/2.1.3.28667/Habitation Station LE (54).SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.1.3.28667/Habitation Station LE (54).SC2Replay -------------------------------------------------------------------------------- /test_replays/2.1.4/Catallena LE.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/2.1.4/Catallena LE.SC2Replay -------------------------------------------------------------------------------- /test_replays/3.0.0.38215/first.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/3.0.0.38215/first.SC2Replay -------------------------------------------------------------------------------- /test_replays/3.0.0.38215/fourth.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/3.0.0.38215/fourth.SC2Replay -------------------------------------------------------------------------------- /test_replays/3.0.0.38215/second.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/3.0.0.38215/second.SC2Replay -------------------------------------------------------------------------------- /test_replays/3.0.0.38215/third.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/3.0.0.38215/third.SC2Replay -------------------------------------------------------------------------------- /test_replays/3.0.0.38749/1.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/3.0.0.38749/1.SC2Replay -------------------------------------------------------------------------------- /test_replays/3.0.0.38749/2.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/3.0.0.38749/2.SC2Replay -------------------------------------------------------------------------------- /test_replays/3.0.0.38996/1.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/3.0.0.38996/1.SC2Replay -------------------------------------------------------------------------------- /test_replays/3.0.0.38996/2.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/3.0.0.38996/2.SC2Replay -------------------------------------------------------------------------------- /test_replays/3.1.0/1.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/3.1.0/1.SC2Replay -------------------------------------------------------------------------------- /test_replays/3.1.0/2.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/3.1.0/2.SC2Replay -------------------------------------------------------------------------------- /test_replays/3.1.0/3.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/3.1.0/3.SC2Replay -------------------------------------------------------------------------------- /test_replays/3.1.0/4.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/3.1.0/4.SC2Replay -------------------------------------------------------------------------------- /test_replays/3.1.0/centralprotocol.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/3.1.0/centralprotocol.SC2Replay -------------------------------------------------------------------------------- /test_replays/3.1.0/dusktowers.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/3.1.0/dusktowers.SC2Replay -------------------------------------------------------------------------------- /test_replays/3.1.2/6494799.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/3.1.2/6494799.SC2Replay -------------------------------------------------------------------------------- /test_replays/3.12/Honorgrounds.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/3.12/Honorgrounds.SC2Replay -------------------------------------------------------------------------------- /test_replays/3.14.0.54518/1.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/3.14.0.54518/1.SC2Replay -------------------------------------------------------------------------------- /test_replays/3.14.0.54518/2.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/3.14.0.54518/2.SC2Replay -------------------------------------------------------------------------------- /test_replays/3.14.0.54518/3.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/3.14.0.54518/3.SC2Replay -------------------------------------------------------------------------------- /test_replays/3.16/AbyssalReef.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/3.16/AbyssalReef.SC2Replay -------------------------------------------------------------------------------- /test_replays/3.2.0/1.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/3.2.0/1.SC2Replay -------------------------------------------------------------------------------- /test_replays/3.3.0/1.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/3.3.0/1.SC2Replay -------------------------------------------------------------------------------- /test_replays/3.3.0/2.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/3.3.0/2.SC2Replay -------------------------------------------------------------------------------- /test_replays/3.3.0/3.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/3.3.0/3.SC2Replay -------------------------------------------------------------------------------- /test_replays/3.3.0/4.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/3.3.0/4.SC2Replay -------------------------------------------------------------------------------- /test_replays/3.3.0/ggissue48.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/3.3.0/ggissue48.SC2Replay -------------------------------------------------------------------------------- /test_replays/3.3.0/ggissue49.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/3.3.0/ggissue49.SC2Replay -------------------------------------------------------------------------------- /test_replays/3.4.0/issueYY.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/3.4.0/issueYY.SC2Replay -------------------------------------------------------------------------------- /test_replays/3.7.0/1.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/3.7.0/1.SC2Replay -------------------------------------------------------------------------------- /test_replays/3.7.0/2.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/3.7.0/2.SC2Replay -------------------------------------------------------------------------------- /test_replays/4.0.0.59587/1.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/4.0.0.59587/1.SC2Replay -------------------------------------------------------------------------------- /test_replays/4.1.2.60604/1.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/4.1.2.60604/1.SC2Replay -------------------------------------------------------------------------------- /test_replays/4.10.0.75689/trophy_id_13.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/4.10.0.75689/trophy_id_13.SC2Replay -------------------------------------------------------------------------------- /test_replays/4.11.0.77379/Oblivion Express.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/4.11.0.77379/Oblivion Express.SC2Replay -------------------------------------------------------------------------------- /test_replays/4.3.0.64469/1.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/4.3.0.64469/1.SC2Replay -------------------------------------------------------------------------------- /test_replays/4.4.0.65895/1.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/4.4.0.65895/1.SC2Replay -------------------------------------------------------------------------------- /test_replays/4.7.0.70154/1.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/4.7.0.70154/1.SC2Replay -------------------------------------------------------------------------------- /test_replays/5.0.0.80949/2020-07-28 - (T)Ocrucius VS (Z)Rairden.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/5.0.0.80949/2020-07-28 - (T)Ocrucius VS (Z)Rairden.SC2Replay -------------------------------------------------------------------------------- /test_replays/coop/CoA.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/coop/CoA.SC2Replay -------------------------------------------------------------------------------- /test_replays/event_order.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/event_order.SC2Replay -------------------------------------------------------------------------------- /test_replays/gameheart/gameheart.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/gameheart/gameheart.SC2Replay -------------------------------------------------------------------------------- /test_replays/gameheart/gh_sameteam.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/gameheart/gh_sameteam.SC2Replay -------------------------------------------------------------------------------- /test_replays/lotv/lotv1.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/lotv/lotv1.SC2Replay -------------------------------------------------------------------------------- /test_replays/lotv/lotv2.SC2Replay: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_replays/lotv/lotv2.SC2Replay -------------------------------------------------------------------------------- /test_s2gs/hots1.s2gs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_s2gs/hots1.s2gs -------------------------------------------------------------------------------- /test_s2gs/hots2.s2gs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_s2gs/hots2.s2gs -------------------------------------------------------------------------------- /test_s2gs/lotv.s2gs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_s2gs/lotv.s2gs -------------------------------------------------------------------------------- /test_s2gs/s2gs1.s2gs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_s2gs/s2gs1.s2gs -------------------------------------------------------------------------------- /test_s2gs/summary.s2gs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggtracker/sc2reader/33747e2ad46b9ebd7a0072d9488e66c993efe9b8/test_s2gs/summary.s2gs -------------------------------------------------------------------------------- /test_s2gs/test_all.py: -------------------------------------------------------------------------------- 1 | # Newer unittest features aren't built in for python 2.6 2 | import sys 3 | 4 | if sys.version_info[:2] < (2, 7): 5 | import unittest2 as unittest 6 | else: 7 | import unittest 8 | 9 | import sc2reader 10 | 11 | sc2reader.log_utils.log_to_console("INFO") 12 | 13 | 14 | class TestSummaries(unittest.TestCase): 15 | def test_a_WoL_s2gs(self): 16 | summary = sc2reader.load_game_summary("test_s2gs/s2gs1.s2gs") 17 | self.assertEqual(summary.players[0].resource_collection_rate, 1276) 18 | self.assertEqual(summary.players[0].build_order[0].order, "Probe") 19 | self.assertEqual(summary.expansion, "WoL") 20 | 21 | def test_a_LotV_s2gs(self): 22 | summary = sc2reader.load_game_summary("test_s2gs/lotv.s2gs") 23 | self.assertEqual(summary.players[0].resource_collection_rate, 1619) 24 | self.assertEqual(summary.players[0].build_order[0].order, "Probe") 25 | self.assertEqual(summary.expansion, "HotS") 26 | 27 | 28 | """ 29 | def test_another_HotS_s2gs(self): 30 | summary = sc2reader.load_game_summary("test_s2gs/hots2.s2gs") 31 | self.assertEqual(summary.players[0].enemies_destroyed, 14575) 32 | self.assertEqual(summary.players[0].time_supply_capped, 50) 33 | self.assertEqual(summary.players[0].idle_production_time, 4438) 34 | self.assertEqual(summary.players[0].resources_spent, 25450) 35 | self.assertEqual(summary.players[0].apm, 204) 36 | self.assertEqual(summary.players[0].workers_active_graph.as_points()[8][1], 25) 37 | self.assertEqual(summary.players[0].upgrade_spending_graph.as_points()[8][1], 300) 38 | self.assertEqual(summary.expansion, 'HotS') 39 | """ 40 | 41 | if __name__ == "__main__": 42 | unittest.main() 43 | --------------------------------------------------------------------------------