happyleavesaoc / aoc-mgz

Age of Empires II recorded game parsing and summarization in Python 3.
MIT License
197 stars 41 forks source link

crash since v101.101.61591.0 - construct.core.MappingError: no decoding mapping for 8 #78

Closed global-uuid-database closed 2 years ago

global-uuid-database commented 2 years ago

Previous versions were parsed just fine, but it seems this new v101.101.61591.0 makes things explode:

Traceback (most recent call last):

  File "C:\Python39\lib\site-packages\construct\core.py", line 2844, in _decode
    return self.decoding[obj]
KeyError: 8

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Python39\lib\site-packages\construct\core.py", line 2784, in _parse
    return self.subcon._parse(stream, context, path)
  File "C:\Python39\lib\site-packages\construct\core.py", line 867, in _parse
    subobj = sc._parse(stream, context, path)
  File "C:\Python39\lib\site-packages\construct\core.py", line 311, in _parse
    return self._decode(self.subcon._parse(stream, context, path), context)
  File "C:\Python39\lib\site-packages\construct\core.py", line 2849, in _decode
    raise MappingError("no decoding mapping for %r" % (obj,))
construct.core.MappingError: no decoding mapping for 8

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:\git\aoe-analysis\analyser.py", line 896, in <module>
    rp.parse(args.file, accept_cache = True)
  File "D:\git\aoe-analysis\analyser.py", line 281, in parse
    self.get_player_names_from_recording()
  File "D:\git\aoe-analysis\analyser.py", line 798, in get_player_names_from_recording
    for player in header.parse_stream(h).de.players:
  File "C:\Python39\lib\site-packages\construct\core.py", line 171, in parse_stream
    return self._parse(stream, context2, "(parsing)")
  File "C:\Python39\lib\site-packages\construct\core.py", line 867, in _parse
    subobj = sc._parse(stream, context, path)
  File "C:\Python39\lib\site-packages\construct\core.py", line 295, in _parse
    return self.subcon._parse(stream, context, path)
  File "C:\Python39\lib\site-packages\construct\core.py", line 867, in _parse
    subobj = sc._parse(stream, context, path)
  File "C:\Python39\lib\site-packages\construct\core.py", line 295, in _parse
    return self.subcon._parse(stream, context, path)
  File "C:\Python39\lib\site-packages\mgz\util.py", line 58, in _parse
    return self.subcon._parse(new_stream, context, path)
  File "C:\Python39\lib\site-packages\construct\core.py", line 357, in _parse
    return self.subcon.parse(data, context)
  File "C:\Python39\lib\site-packages\construct\core.py", line 158, in parse
    return self.parse_stream(BytesIO(data), context, **kw)
  File "C:\Python39\lib\site-packages\construct\core.py", line 171, in parse_stream
    return self._parse(stream, context2, "(parsing)")
  File "C:\Python39\lib\site-packages\construct\core.py", line 867, in _parse
    subobj = sc._parse(stream, context, path)
  File "C:\Python39\lib\site-packages\construct\core.py", line 2784, in _parse
    return self.subcon._parse(stream, context, path)
  File "C:\Python39\lib\site-packages\construct\core.py", line 1594, in _parse
    obj = self.cases.get(key, self.default)._parse(stream, context, path)
  File "C:\Python39\lib\site-packages\construct\core.py", line 2788, in _parse
    raise e.__class__("%s\n    %s" % (e, path))
construct.core.MappingError: no decoding mapping for 8
    (parsing) -> de -> de
> c:\python39\lib\site-packages\construct\core.py(2788)_parse()
-> raise e.__class__("%s\n    %s" % (e, path))

some pdb debugging:

-> raise e.__class__("%s\n    %s" % (e, path))
(Pdb) l
2783                path += " -> %s" % (self.name)
2784                return self.subcon._parse(stream, context, path)
2785            except ConstructError as e:
2786                if "\n" in str(e):
2787                    raise
2788 ->             raise e.__class__("%s\n    %s" % (e, path))
2789        def _build(self, obj, stream, context, path):
2790            try:
2791                path += " -> %s" % (self.name)
2792                return self.subcon._build(obj, stream, context, path)
2793            except ConstructError as e:
(Pdb) u
> c:\python39\lib\site-packages\construct\core.py(1594)_parse()
-> obj = self.cases.get(key, self.default)._parse(stream, context, path)
(Pdb) print(stream, context, path)
<_io.BytesIO object at 0x00000200D8E46E00> Container:
    game_version = VER 9.4 (total 7)
    save_version = 26.16
    version = Version.DE (parsing) -> de

let's query the stream object to figure out where we are:

(Pdb) print(stream.tell())
64
(Pdb) print(stream.seek(0))
0
(Pdb) print(stream.read(256))
b'VER 9.4\x00\xaeG\xd1A\x97\xf0\x00\x00N\xb8~b\x00\xa0\x8aD\xe8\x03\x00\x00\x01\x00\x00\x00\t\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00\t\x00\x00\x00\n\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00M\x00\x00\x00M\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\xa3_\x02\x00\xa3_\x02\x00\xecQ\xd8?\x00\x00\x00\x00\xc8\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3_\x02\x00\x01\x00\x00\x00\x00\x01\x01\x01\x00\x01\x01\x01\x00\x00\x01\x00\x00\x00\x00\x1e\x00\x00\x00\x00\xa3_\x02\x00\x0b\x00\x00\x00\x03\x00\x00\x00\xff\x02\x02\x9cm\x91\xf1H\x00\x00\x00\x00(\x00\x00\x00`\n\x00\x00\x00`\n\x00\x00`\n\x05\x00NOPEN\x02\x00\x00\x00\x03\xa1\x16\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\xff\xff\xff\xffd\x00\x00\x00\x0b\x00\x00\x00\x04\x00\x00\x00\xff\x03\x03\x9c'

"NOPEN" is a redacted 5-letter username.

Interestingly enough it's not the 256 first bytes of the file, could it be possible that there are several streams contained in a .aoe2record file ?

$ hd -n 256 MP\ Replay\ v101.101.61591.0\ \@2022.05.13\ 215806\ \(7\).aoe2record
00000000  45 c9 09 00 00 00 00 00  ec bd 7f cc 75 d9 75 df  |E...........u.u.|
00000010  75 df 77 de 99 79 e7 97  fd 8e ed b1 1d 27 4e 5e  |u.w..y.......'N^|
00000020  27 55 f1 1f 36 b1 1d 3b  36 23 ab 63 bb 09 c9 1f  |'U..6..;6#.c....|
00000030  93 b4 54 51 45 a4 4a f1  84 b8 78 4a e2 d8 49 8b  |..TQE.J...xJ..I.|
00000040  a2 a8 2a 43 05 a8 8a 50  15 22 04 69 a8 2a 43 a1  |..*C...P.".i.*C.|
00000050  a4 88 56 a1 a2 28 ad 08  84 00 51 54 39 51 0a 14  |..V..(....QT9Q..|
00000060  a2 62 52 8b bf 22 05 a4  d0 3f 22 f8 27 c3 39 f7  |.bR.."...?".'.9.|
00000070  3e e7 de 73 ee 3d 67 ef  b5 f6 5e 6b ed b5 f6 f9  |>..s.=g...^k....|
00000080  7e b6 8f df 35 cf 3d 77  ff 58 df bd f7 f7 9e 73  |~...5.=w.X.....s|
00000090  ef 73 9f 3f f9 9d 7f e2  f1 3f f7 cf 7e f4 f0 b7  |.s.?.....?..~...|
000000a0  bf eb 1f 7e fa df ff bd  c3 e1 7b 7f f1 2f fc e0  |...~......{../..|
000000b0  e1 cb 3f f5 1d bf f3 c4  e1 70 ef 70 38 3c 33 1c  |..?......p.p8<3.|
000000c0  f7 87 63 f8 cf c3 83 e1  78 72 38 9e 1a 8e a7 87  |..c.....xr8.....|
000000d0  e3 e1 dd e3 cf ce 1e ff  9e bb 63 64 7c fe 78 8c  |..........cd|.x.|
000000e0  cf 1f 9f 37 f2 d7 7f e0  fe f1 f8 bf fe 85 df 7a  |...7...........z|
000000f0  65 fc ef 5f bb ab 67 62  7c 6c 7c ce e1 de bd 7b  |e.._..gb|l|....{|
00000100
happyleavesaoc commented 2 years ago

Can you provide the file?

global-uuid-database commented 2 years ago

Can you provide the file?

File shared privately in DM.