verify_ember_explosion_content.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. """Check the scene wire layout and authored event keys against extracted game data.
  2. Usage: python3 tests/verify_ember_explosion_content.py activity_sdk.pack 80BEB1CC.bin
  3. """
  4. import mmap
  5. from pathlib import Path
  6. import struct
  7. import sys
  8. with Path(sys.argv[1]).open('rb') as stream, mmap.mmap(stream.fileno(), 0, access=mmap.ACCESS_READ) as data:
  9. start, count, stride = struct.unpack_from('<QII', data, 160 + 35 * 16)
  10. fields, _, field_stride = struct.unpack_from('<QII', data, 160 + 36 * 16)
  11. schemas = {}
  12. for index in range(count):
  13. row = struct.unpack_from('<8IQII', data, start + index * stride)
  14. if row[0] in (0x8080626B, 0x80807ED9, 0x808094F3, 0x808094E1, 0x808094DF):
  15. schemas[row[0]] = [struct.unpack_from('<6Iq6I', data, fields + i * field_stride)
  16. for i in range(row[6], row[6] + row[7])]
  17. def layout(schema):
  18. return [(f[2], f[4], f[5], f[7]) for f in schemas[schema]]
  19. assert layout(0x8080626B) == [(0, 5, 0xFFFFFFFF, 32), (4, 2, 0xFFFFFFFF, 1),
  20. (8, 1, 0x80807ED9, 0xFFFFFFFF), (80, 1, 0x808094E1, 0xFFFFFFFF)]
  21. assert schemas[0x8080626B][0][6] == -2147483648
  22. assert layout(0x80807ED9) == [(0, 1, 0x808094F3, 0xFFFFFFFF), (68, 5, 0xFFFFFFFF, 31)]
  23. assert schemas[0x808094F3][0][7] == 4
  24. assert layout(0x808094E1) == [(0, 5, 0xFFFFFFFF, 6), (4, 1, 0x808094DF, 0)]
  25. assert layout(0x808094DF) == [(4, 9, 0xFFFFFFFF, 32)]
  26. scene = Path(sys.argv[2]).read_bytes()
  27. for suffix, offset, key in [('a', 0x5BC0, 0x329EB106), ('b', 0x5C20, 0x633B82E9),
  28. ('c', 0x5C80, 0x15A78938), ('d', 0x5CE0, 0xF9D55A83)]:
  29. value = 0x811C9DC5
  30. for byte in f'explosion_set_{suffix}_trigger'.encode():
  31. value = ((value * 0x01000193) & 0xFFFFFFFF) ^ byte
  32. assert value == key
  33. assert struct.unpack_from('<I', scene, offset - 12)[0] == 0x8080637D
  34. assert struct.unpack_from('<I', scene, offset)[0] == key
  35. print('Type-43 scene schema (74 + 32*n bits) and all four authored explosion event keys verified.')