From b4a30d8539c2fed4cbfc7b8cfec874e65cdc50a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Bisinger?= Date: Sat, 21 Feb 2026 21:57:31 +0100 Subject: [PATCH] Add support for The Last Chieftains in the fast parser Make the necessary changes to support savegames from the Last Chieftains DLC. The full parser changes are not sufficient to make it work yet, more investigation is needed. --- mgz/fast/header.py | 5 +++++ mgz/header/de.py | 7 ++++++- mgz/header/initial.py | 2 ++ mgz/model/__init__.py | 2 +- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/mgz/fast/header.py b/mgz/fast/header.py index 5cc5462..d0671b7 100644 --- a/mgz/fast/header.py +++ b/mgz/fast/header.py @@ -468,6 +468,8 @@ def parse_de(data, version, save, skip=False): data.read(8) if save >= 64.3: data.read(4) + if save >= 67.2: + _ = de_string(data) players.append(dict( number=number, @@ -550,6 +552,9 @@ def parse_de(data, version, save, skip=False): data.read(c * 4) if not skip: de_string(data) + if save >= 67.2: + _ = de_string(data) + _ = de_string(data) data.read(8) if save >= 37: timestamp, x = unpack('= 25.06, "handicap"/Bytes(8)), If(lambda ctx: find_save_version(ctx) >= 64.3, "unknown_de_64_3" / Int32ul), + If(lambda ctx: find_save_version(ctx) >= 67.2, "unknown_de_67_2" / de_string), ) string_block = Struct( @@ -167,6 +168,10 @@ If(lambda ctx: find_save_version(ctx) >= 66.3, Bytes(12)), If(lambda ctx: find_save_version(ctx) >= 66.3, Array(lambda ctx: ctx.unknown_count, Bytes(4))), de_string, + If(lambda ctx: find_save_version(ctx) >= 67.2, Struct( + de_string, + de_string, + )), Bytes(5), If(lambda ctx: find_save_version(ctx) >= 13.13, Byte), If(lambda ctx: find_save_version(ctx) < 13.17, Struct( @@ -178,5 +183,5 @@ "ver37"/If(lambda ctx: find_save_version(ctx) >= 37, Struct( Int32ul, Int32ul - )) + )), ) diff --git a/mgz/header/initial.py b/mgz/header/initial.py index 605fd7c..4229531 100644 --- a/mgz/header/initial.py +++ b/mgz/header/initial.py @@ -6,6 +6,7 @@ Int32ul, Padding, Struct, Tell, this, Bytes, Const, IfThenElse) from mgz.enums import MyDiplomacyEnum, TheirDiplomacyEnum +from mgz.header.de import de_string from mgz.header.objects import existing_object from mgz.header.playerstats import player_stats from mgz.util import Find, GotoObjectsEnd, RepeatUpTo, Version, find_save_version, find_version @@ -42,6 +43,7 @@ "y"/Int16ul ), "culture"/Byte, + "name"/If(lambda ctx: find_save_version(ctx) >= 67.2, de_string), "civilization"/Byte, "game_status"/Byte, "resigned"/Flag, diff --git a/mgz/model/__init__.py b/mgz/model/__init__.py index 0a4445f..364d83e 100644 --- a/mgz/model/__init__.py +++ b/mgz/model/__init__.py @@ -171,7 +171,7 @@ def parse_match(handle): player['name'].decode(encoding), consts['player_colors'][str(player['color_id'])], player['color_id'], - dataset['civilizations'][str(player['civilization_id'])]['name'], + dataset['civilizations'].get(str(player['civilization_id']), {'name': f""})['name'], player['civilization_id'], Position(pos_x, pos_y), [