Skip to content

I thought the problem was solved, but actually it still exists. #118

@loach2020

Description

@loach2020

I solved the issue with match = parse_match(data) by modifying the Chinese encoding in Map.py. However, header.parse_stream(data) still reports an error.

In Map.py, by placing ['位置:', 'utf-8', 'zh'] on the first line, the correct encoding can be recognized.

Presumably, an error was triggered during the recognition of one of the encoding dictionaries in the middle, preventing the program from iterating through the remaining options. Additionally, there seems to be an issue with the style of the colon, which is causing failure to match the keywords.For example: ['位置:'],['位置: ']

Indeed, you can consider ignoring symbols and focusing only on words. Here is how you can slightly modify the following code to extract map_name:name = line[pos+len(e_m)+2:].decode(encoding)#.replace('.rms', '')

The regular expression in the get_map_seed() function couldn't make a proper match either. The following modifications were made:

def get_map_seed(instructions):
    """Extract map seed from instructions."""
    match = re.search(rb':\x20+([a-zA-Z0-9_!~\-+. ]+?\.rms)', instructions)
    seed = None
    if match:
        seed = int.from_bytes(match.group(1), byteorder='big')
    return seed

SP Replay v5.8 @2025.03.02 164204.aoe2record
MP Replay v5.8 @2025.02.26 123131 (8).aoe2record

The correct result:

from mgz.model import parse_match
# #with open('MP Replay v5.8 @2025.02.26 123131 (8).aoe2record', 'rb') as data:
with open('SP Replay v5.8 @2025.03.02 164204.aoe2record', 'rb') as data:
    match = parse_match(data)
    print(match.teams)

=>

C:\Python\Python312\python.exe "C:\Program Files (x86)\Steam\steamapps\common\Age2HD\SaveGame\test.py" 
[[斋藤道三, 频耶达拉], [THEGFW, 阿方索国王]]

进程已结束,退出代码为 0

The part that has problems:

import os
from mgz import header, fast

with open('SP Replay v5.8 @2025.03.02 164204.aoe2record', 'rb') as data:
    eof = os.fstat(data.fileno()).st_size
    header.parse_stream(data)
    fast.meta(data)
    while data.tell() < eof:
        fast.operation(data)

=>

C:\Python\Python312\python.exe "C:\Program Files (x86)\Steam\steamapps\common\Age2HD\SaveGame\test.py" 
Traceback (most recent call last):
  File "C:\Program Files (x86)\Steam\steamapps\common\Age2HD\SaveGame\test.py", line 6, in <module>
    header.parse_stream(data)
  File "C:\Python\Python312\Lib\site-packages\construct\core.py", line 171, in parse_stream
    return self._parse(stream, context2, "(parsing)")
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python\Python312\Lib\site-packages\construct\core.py", line 867, in _parse
    subobj = sc._parse(stream, context, path)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python\Python312\Lib\site-packages\construct\core.py", line 295, in _parse
    return self.subcon._parse(stream, context, path)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python\Python312\Lib\site-packages\construct\core.py", line 867, in _parse
    subobj = sc._parse(stream, context, path)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python\Python312\Lib\site-packages\construct\core.py", line 295, in _parse
    return self.subcon._parse(stream, context, path)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python\Python312\Lib\site-packages\mgz\util.py", line 58, in _parse
    return self.subcon._parse(new_stream, context, path)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python\Python312\Lib\site-packages\construct\core.py", line 357, in _parse
    return self.subcon.parse(data, context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python\Python312\Lib\site-packages\construct\core.py", line 158, in parse
    return self.parse_stream(BytesIO(data), context, **kw)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python\Python312\Lib\site-packages\construct\core.py", line 171, in parse_stream
    return self._parse(stream, context2, "(parsing)")
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python\Python312\Lib\site-packages\construct\core.py", line 867, in _parse
    subobj = sc._parse(stream, context, path)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python\Python312\Lib\site-packages\construct\core.py", line 1036, in _parse
    raise RangeError("unsane min %s and max %s" % (min, max))
construct.core.RangeError: unsane min -1 and max -1

进程已结束,退出代码为 1
from mgz.summary import Summary
with open(r'SP Replay v5.8 @2025.03.02 164204.aoe2record', 'rb') as data:
    s = Summary(data)
    print(s.get_players())

=>

C:\Python\Python312\python.exe "C:\Program Files (x86)\Steam\steamapps\common\Age2HD\SaveGame\test.py" 
Traceback (most recent call last):
  File "C:\Python\Python312\Lib\site-packages\mgz\summary\full.py", line 75, in __init__
    self._header = mgz.header.parse_stream(self._handle)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python\Python312\Lib\site-packages\construct\core.py", line 171, in parse_stream
    return self._parse(stream, context2, "(parsing)")
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python\Python312\Lib\site-packages\construct\core.py", line 867, in _parse
    subobj = sc._parse(stream, context, path)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python\Python312\Lib\site-packages\construct\core.py", line 295, in _parse
    return self.subcon._parse(stream, context, path)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python\Python312\Lib\site-packages\construct\core.py", line 867, in _parse
    subobj = sc._parse(stream, context, path)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python\Python312\Lib\site-packages\construct\core.py", line 295, in _parse
    return self.subcon._parse(stream, context, path)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python\Python312\Lib\site-packages\mgz\util.py", line 58, in _parse
    return self.subcon._parse(new_stream, context, path)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python\Python312\Lib\site-packages\construct\core.py", line 357, in _parse
    return self.subcon.parse(data, context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python\Python312\Lib\site-packages\construct\core.py", line 158, in parse
    return self.parse_stream(BytesIO(data), context, **kw)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python\Python312\Lib\site-packages\construct\core.py", line 171, in parse_stream
    return self._parse(stream, context2, "(parsing)")
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python\Python312\Lib\site-packages\construct\core.py", line 867, in _parse
    subobj = sc._parse(stream, context, path)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python\Python312\Lib\site-packages\construct\core.py", line 1036, in _parse
    raise RangeError("unsane min %s and max %s" % (min, max))
construct.core.RangeError: unsane min -1 and max -1

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Program Files (x86)\Steam\steamapps\common\Age2HD\SaveGame\test.py", line 13, in <module>
    s = Summary(data)
        ^^^^^^^^^^^^^
  File "C:\Python\Python312\Lib\site-packages\mgz\summary\__init__.py", line 27, in __call__
    return FullSummary(data)
           ^^^^^^^^^^^^^^^^^
  File "C:\Python\Python312\Lib\site-packages\mgz\summary\full.py", line 87, in __init__
    raise RuntimeError("invalid mgz file: {}".format(e))
RuntimeError: invalid mgz file: unsane min -1 and max -1

进程已结束,退出代码为 1

Since I'm not a professional either, could you please help me analyze exactly what the problem is?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions