diff --git a/mgz/fast/header.py b/mgz/fast/header.py index 596102f..bacb07a 100644 --- a/mgz/fast/header.py +++ b/mgz/fast/header.py @@ -249,7 +249,9 @@ def parse_scenario(data, num_players, version, save): map_id, difficulty_id = unpack('= 26.16: + if save >= 26.21: + settings_version = 3.2 + elif save >= 26.16: settings_version = 3.0 elif save >= 25.22: settings_version = 2.6 diff --git a/mgz/header/objects.py b/mgz/header/objects.py index 2cd816a..a082bb6 100644 --- a/mgz/header/objects.py +++ b/mgz/header/objects.py @@ -330,30 +330,30 @@ ) unit_ai = "ai"/Struct( - "mood"/Int32ul, - "current_order"/Int32ul, - "current_order_priority"/Int32ul, - "current_action"/Int32ul, - "current_target"/Int32ul, - "current_target_type"/Int16ul, + "mood"/Int32sl, + "current_order"/Int32sl, + "current_order_priority"/Int32sl, + "current_action"/Int32sl, + "current_target"/Int32sl, + "current_target_type"/Int16sl, Padding(2), "current_target_location"/vector, "desired_target_distance"/Float32l, - "last_action"/Int32ul, - "last_order"/Int32ul, - "last_target"/Int32ul, - "last_target_type"/Int32ul, - "last_update_type"/Int32ul, + "last_action"/Int32sl, + "last_order"/Int32sl, + "last_target"/Int32sl, + "last_target_type"/Int32sl, + "last_update_type"/Int32sl, "idle_timer"/Int32ul, "idle_timeout"/Int32ul, "adjusted_idle_timeout"/Int32ul, "secondary_timer"/Int32ul, "look_around_timer"/Int32ul, "look_around_timeout"/Int32ul, - "defend_target"/Int32ul, + "defend_target"/Int32sl, "defense_buffer"/Float32l, "last_world_position"/waypoint, - "de_2006_unk"/If(lambda ctx: find_save_version(ctx) >= 20.06, Struct( + "de_2006_unk"/If(lambda ctx: 26.21 > find_save_version(ctx) >= 20.06, Struct( "unk_float"/Float32l, "unk"/Int32ul )), @@ -369,7 +369,7 @@ "state_position_y"/Float32l, "time_since_enemy_sighting"/Int32ul, "alert_mode"/Byte, - "alert_mode_object_id"/Int32ul, + "alert_mode_object_id"/Int32sl, "has_patrol_path"/Int32ul, If(lambda ctx: ctx.has_patrol_path > 0, path), "patrol_current_waypoint"/Int32ul, @@ -379,7 +379,7 @@ "randomized_retarget_timer"/Int32ul, "num_retarget_entries"/Int32ul, "retarget_entries"/Array(lambda ctx: ctx.num_retarget_entries, retarget), - "best_unit_to_attack"/Int32ul, + "best_unit_to_attack"/Int32sl, "formation_type"/Byte, "de_unk"/If(lambda ctx: find_version(ctx) == Version.DE, Bytes(4)), "de_unk_byte"/If(lambda ctx: find_save_version(ctx) >= 25.22, Byte) diff --git a/mgz/header/scenario.py b/mgz/header/scenario.py index 2a6f1d1..2f511ed 100644 --- a/mgz/header/scenario.py +++ b/mgz/header/scenario.py @@ -33,12 +33,12 @@ # Scenarios have intro text, a bitmap, and cinematics. messages = "messages"/Struct( - "instruction_id"/Int32ul, - "hints_id"/Int32ul, - "victory_id"/Int32ul, - "defeat_id"/Int32ul, - "history_id"/Int32ul, - "scouts_id"/If(lambda ctx: ctx._._.version != Version.AOK, Int32ul), + "instruction_id"/Int32sl, + "hints_id"/Int32sl, + "victory_id"/Int32sl, + "defeat_id"/Int32sl, + "history_id"/Int32sl, + "scouts_id"/If(lambda ctx: ctx._._.version != Version.AOK, Int32sl), "instructions_length"/Int16ul, "instructions"/Bytes(lambda ctx: ctx.instructions_length), "hints"/PascalString(lengthfield="hints_length"/Int16ul), @@ -129,11 +129,11 @@ If(lambda ctx: find_save_version(ctx) >= 20.06, Padding(1)), If(lambda ctx: find_save_version(ctx) >= 20.16, Padding(4)), If(lambda ctx: find_save_version(ctx) >= 25.02, Padding(4*16)), - If(lambda ctx: find_save_version(ctx) >= 25.06, Padding(4)) + If(lambda ctx: 26.21 > find_save_version(ctx) >= 25.06, Padding(4)) ) ), Array(9, "player_info"/Struct( - "data_ref"/Int32ul, + "slot"/Int32sl, PlayerTypeEnum("type"/Int32ul), "name"/PascalString(lengthfield="name_length"/Int32ul) )), @@ -145,7 +145,8 @@ If(lambda ctx: 25.06 > find_save_version(ctx) >= 13.34, Find(struct.pack(' find_save_version(ctx) >= 25.06, Find(struct.pack(' find_save_version(ctx) >= 25.22, Find(struct.pack('= 26.16, Find(struct.pack(' find_save_version(ctx) >= 26.16, Find(struct.pack('= 26.21, Find(struct.pack('= 26.16: + if save_version >= 26.21: + marker_de = read_bytes.find(b"\xf6\x28\xbc\x3f") + elif save_version >= 26.16: marker_de = read_bytes.find(b"\x48\xe1\xba\x3f") elif save_version >= 25.06: marker_de = read_bytes.find(b"\x9a\x99\xb9\x3f") diff --git a/setup.py b/setup.py index f665918..6b07f4b 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name='mgz', - version='1.7.7', + version='1.7.10', description='Parse Age of Empires 2 recorded games.', url='https://github.com/happyleavesaoc/aoc-mgz/', license='MIT', @@ -12,7 +12,7 @@ packages=find_packages(), install_requires=[ 'aiohttp>=3.6.2', - 'aocref>=2.0.5', + 'aocref>=2.0.6', 'construct==2.8.16', 'dataclasses==0.8; python_version < "3.7"', 'flatbuffers>=1.10', diff --git a/tests/recs/de-26.21.aoe2record b/tests/recs/de-26.21.aoe2record new file mode 100644 index 0000000..eaccfd0 Binary files /dev/null and b/tests/recs/de-26.21.aoe2record differ