Skip to content
Snippets Groups Projects
replays.rst 3.24 KiB
Newer Older
  • Learn to ignore specific revisions
  • Rojikku98's avatar
    Rojikku98 committed
    Replays
    =======
    This page will describe two different techniques for handling replays. The
    
    Rojikku98's avatar
    Rojikku98 committed
    first technique parses the information saved in the replay file. The second
    
    Rojikku98's avatar
    Rojikku98 committed
    uses the information in the replay file to actually replay the game. The
    
    Rojikku98's avatar
    Rojikku98 committed
    different techniques have certain advantages and disadvantages. The main
    one is that the reader is a lot faster while replaying the game provides
    a lot more information.
    
    Rojikku98's avatar
    Rojikku98 committed
    
    
    
    SC2Reader
    ---------
    SC2Reader_ is a library that can be used to implement the first technique.
    
    Here is a short example that uses SC2Reader to extract the build order.
    
    
    .. _SC2Reader: https://github.com/ggtracker/sc2reader
    
    .. code-block:: python
    
        import sc2reader
        import json
        from sc2reader.factories import SC2Factory
    
        # The path to the replays
        PATH = "../Replays"
    
        def main():
            # Creates a generator of all the replays in the dictionary
            replays = sc2reader.load_replays(PATH, load_level=3)
            games = []
            # Loops through every relay
            for replay in replays:
                building_order = []
                if is_terran_vs_terran(replay):
                    # Loops through every event
                    for event in replay.events:
                        # Check if the event is that a building is crated
                        if type(event) == sc2reader.events.tracker.UnitInitEvent:
                            if event.unit.name not in building_order:
                                building_order.append(event.unit.name)
                    games.append(building_order)
            return games
    
    
        def is_terran_vs_terran(replay):
            try:
                return sc2reader.constants.LOCALIZED_RACES[replay.players[0].play_race] == "Terran" \
                   and sc2reader.constants.LOCALIZED_RACES[replay.players[1].play_race] == "Terran"
            except(KeyError):
                return False
    
        if __name__ == '__main__':
            games = main()
            text = json.dumps(games)
            print("Res: " + text)
    
    
    
    SC2Reader has good documation_ that also describe what information
    
    Rojikku98's avatar
    Rojikku98 committed
    could be found. `What is in a Replay`_ and Events_ gives a good idea
    
    Rojikku98's avatar
    Rojikku98 committed
    if the information you want could be collected with SC2Reader.
    
    Rojikku98's avatar
    Rojikku98 committed
    
    .. _documation: https://sc2reader.readthedocs.io/en/latest/index.html
    .. _What is in a Replay: https://sc2reader.readthedocs.io/en/latest/articles/whatsinareplay.html
    .. _Events: https://sc2reader.readthedocs.io/en/latest/events/index.html
    
    ReplayObserver
    --------------
    
    Edvin Bergström's avatar
    Edvin Bergström committed
    This is the second technique it is much like using a bot but with the difference
    
    Rojikku98's avatar
    Rojikku98 committed
    that no action can be preform just observations.
    
    Rojikku98's avatar
    Rojikku98 committed
    
    
    .. code-block:: python
    
    
        from commandcenter import *
    
    Rojikku98's avatar
    Rojikku98 committed
    
    
        class MyObserver(ReplayObserver):
            def __init__(self):
                ReplayObserver.__init__(self)
    
            def on_game_start(self):
                ReplayObserver.on_game_start(self)
    
            def on_step(self):
                ReplayObserver.on_step(self)
    
    
        def main():
    
            coordinator = Coordinator(r"D:/StarCraft II/Versions/Base69232/SC2_x64.exe")
            if coordinator.load_replay_list("D:/Replays/"):
                observer = MyObserver()
                coordinator.add_replay_observer(observer)
                while coordinator.update():
                    pass
            else:
                print("No replays found")
    
        if __name__ == "__main__":