From 35113bfb335366600c6f51df5c296e748299781b Mon Sep 17 00:00:00 2001 From: heinezen Date: Sun, 24 Nov 2024 18:43:03 +0100 Subject: [PATCH 1/4] convert: Fix setting allowed member type when array is empty. --- .../value_object/read/genie_structure.py | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/openage/convert/value_object/read/genie_structure.py b/openage/convert/value_object/read/genie_structure.py index bfc6324f1c..dcfd0f3baf 100644 --- a/openage/convert/value_object/read/genie_structure.py +++ b/openage/convert/value_object/read/genie_structure.py @@ -1,4 +1,4 @@ -# Copyright 2014-2023 the openage authors. See copying.md for legal info. +# Copyright 2014-2024 the openage authors. See copying.md for legal info. # TODO pylint: disable=C,R @@ -456,30 +456,40 @@ def _read_primitive( array_members = [] allowed_member_type = None + if storage_type is StorageType.ARRAY_INT: + allowed_member_type = StorageType.INT_MEMBER + + elif storage_type is StorageType.ARRAY_FLOAT: + allowed_member_type = StorageType.FLOAT_MEMBER + + elif storage_type is StorageType.ARRAY_BOOL: + allowed_member_type = StorageType.BOOLEAN_MEMBER + + elif storage_type is StorageType.ARRAY_ID: + allowed_member_type = StorageType.ID_MEMBER + + elif storage_type is StorageType.ARRAY_STRING: + allowed_member_type = StorageType.STRING_MEMBER + for elem in result: if storage_type is StorageType.ARRAY_INT: gen_member = IntMember(var_name, elem) - allowed_member_type = StorageType.INT_MEMBER array_members.append(gen_member) elif storage_type is StorageType.ARRAY_FLOAT: gen_member = FloatMember(var_name, elem) - allowed_member_type = StorageType.FLOAT_MEMBER array_members.append(gen_member) elif storage_type is StorageType.ARRAY_BOOL: gen_member = BooleanMember(var_name, elem) - allowed_member_type = StorageType.BOOLEAN_MEMBER array_members.append(gen_member) elif storage_type is StorageType.ARRAY_ID: gen_member = IDMember(var_name, elem) - allowed_member_type = StorageType.ID_MEMBER array_members.append(gen_member) elif storage_type is StorageType.ARRAY_STRING: gen_member = StringMember(var_name, elem) - allowed_member_type = StorageType.STRING_MEMBER array_members.append(gen_member) else: From 24e2f17ceeb4dd5cee8603559621db79a106d3a2 Mon Sep 17 00:00:00 2001 From: heinezen Date: Sun, 24 Nov 2024 20:55:56 +0100 Subject: [PATCH 2/4] convert: Allow multiple trading post targets for units. --- openage/convert/processor/conversion/aoc/processor.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openage/convert/processor/conversion/aoc/processor.py b/openage/convert/processor/conversion/aoc/processor.py index 718ab8af01..d042e32065 100644 --- a/openage/convert/processor/conversion/aoc/processor.py +++ b/openage/convert/processor/conversion/aoc/processor.py @@ -1361,10 +1361,10 @@ def link_trade_posts(full_data_set: GenieObjectContainer) -> None: continue trade_post_id = command["unit_id"].value - break - # Notify buiding - full_data_set.building_lines[trade_post_id].add_trading_line(unit_line) + # Notify buiding + if trade_post_id in full_data_set.building_lines.keys(): + full_data_set.building_lines[trade_post_id].add_trading_line(unit_line) @staticmethod def link_repairables(full_data_set: GenieObjectContainer) -> None: From f8701971a5d2901e53433c920ac6194374294ef9 Mon Sep 17 00:00:00 2001 From: heinezen Date: Sun, 24 Nov 2024 20:57:13 +0100 Subject: [PATCH 3/4] convert: Add new names for 'Battle for Greece' DLC. --- .../conversion/de2/internal_nyan_names.py | 71 ++++++++++++++++++- .../read/media/datfile/lookup_dicts.py | 9 +++ 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/openage/convert/value_object/conversion/de2/internal_nyan_names.py b/openage/convert/value_object/conversion/de2/internal_nyan_names.py index 30f9826ba3..e4f3c995bd 100644 --- a/openage/convert/value_object/conversion/de2/internal_nyan_names.py +++ b/openage/convert/value_object/conversion/de2/internal_nyan_names.py @@ -70,6 +70,37 @@ 1802: ("EliteCompositeBowman", "elite_composite_bowman"), 1805: ("EliteMonaspa", "elite_monaspa"), + + # BfG + 2101: ("BfGUnkown_2101", "bfg_unkown_2101"), + 2102: ("BfGUnkown_2102", "bfg_unkown_2102"), + 2104: ("BfGUnkown_2104", "bfg_unkown_2104"), + 2105: ("BfGUnkown_2105", "bfg_unkown_2105"), + 2107: ("BfGUnkown_2107", "bfg_unkown_2107"), + 2108: ("BfGUnkown_2108", "bfg_unkown_2108"), + 2110: ("BfGUnkown_2110", "bfg_unkown_2110"), + 2111: ("BfGUnkown_2111", "bfg_unkown_2111"), + 2123: ("BfGUnkown_2123", "bfg_unkown_2123"), + 2124: ("BfGUnkown_2124", "bfg_unkown_2124"), + 2125: ("BfGUnkown_2125", "bfg_unkown_2125"), + 2126: ("BfGUnkown_2126", "bfg_unkown_2126"), + 2127: ("BfGUnkown_2127", "bfg_unkown_2127"), + 2128: ("BfGUnkown_2128", "bfg_unkown_2128"), + 2129: ("BfGUnkown_2129", "bfg_unkown_2129"), + 2130: ("BfGUnkown_2130", "bfg_unkown_2130"), + 2131: ("BfGUnkown_2131", "bfg_unkown_2131"), + 2132: ("BfGUnkown_2132", "bfg_unkown_2132"), + 2133: ("BfGUnkown_2133", "bfg_unkown_2133"), + 2134: ("BfGUnkown_2134", "bfg_unkown_2134"), + 2135: ("BfGUnkown_2135", "bfg_unkown_2135"), + 2138: ("BfGUnkown_2138", "bfg_unkown_2138"), + 2139: ("BfGUnkown_2139", "bfg_unkown_2139"), + 2140: ("BfGUnkown_2140", "bfg_unkown_2140"), + 2148: ("BfGUnkown_2148", "bfg_unkown_2148"), + 2149: ("BfGUnkown_2149", "bfg_unkown_2149"), + 2150: ("BfGUnkown_2150", "bfg_unkown_2150"), + 2151: ("BfGUnkown_2151", "bfg_unkown_2151"), + 2162: ("BfGUnkown_2162", "bfg_unkown_2162"), } # key: head unit id; value: (nyan object name, filename prefix) @@ -88,6 +119,10 @@ # TMR 1808: ("MuleCart", "mule_cart"), + + # BfG + 2119: ("BfGUnkown_2119", "bfg_unkown_2119"), + 2172: ("BfGUnkown_2172", "bfg_unkown_2172"), } # key: (head) unit id; value: (nyan object name, filename prefix) @@ -171,6 +206,33 @@ 924: ("AsnuariCavalry", "asnuari_cavalry"), 929: ("FortifiedChurch", "fortified_church"), 967: ("EliteQizilbashWarrior", "elite_qizilbash_warrior"), + + # BfG + 1110: ("BfGUnkown_1110", "bfg_unkown_1110"), + 1111: ("BfGUnkown_1111", "bfg_unkown_1111"), + 1112: ("BfGUnkown_1112", "bfg_unkown_1112"), + 1113: ("BfGUnkown_1113", "bfg_unkown_1113"), + 1120: ("BfGUnkown_1120", "bfg_unkown_1120"), + 1121: ("BfGUnkown_1121", "bfg_unkown_1121"), + 1122: ("BfGUnkown_1122", "bfg_unkown_1122"), + 1123: ("BfGUnkown_1123", "bfg_unkown_1123"), + 1130: ("BfGUnkown_1130", "bfg_unkown_1130"), + 1131: ("BfGUnkown_1131", "bfg_unkown_1131"), + 1132: ("BfGUnkown_1132", "bfg_unkown_1132"), + 1133: ("BfGUnkown_1133", "bfg_unkown_1133"), + 1161: ("BfGUnkown_1161", "bfg_unkown_1161"), + 1162: ("BfGUnkown_1162", "bfg_unkown_1162"), + 1165: ("BfGUnkown_1165", "bfg_unkown_1165"), + 1167: ("BfGUnkown_1167", "bfg_unkown_1167"), + 1173: ("BfGUnkown_1173", "bfg_unkown_1173"), + 1198: ("BfGUnkown_1198", "bfg_unkown_1198"), + 1202: ("BfGUnkown_1202", "bfg_unkown_1202"), + 1203: ("BfGUnkown_1203", "bfg_unkown_1203"), + 1204: ("BfGUnkown_1204", "bfg_unkown_1204"), + 1223: ("BfGUnkown_1223", "bfg_unkown_1223"), + 1224: ("BfGUnkown_1224", "bfg_unkown_1224"), + 1225: ("BfGUnkown_1225", "bfg_unkown_1225"), + 1226: ("BfGUnkown_1226", "bfg_unkown_1226"), } # key: civ index; value: (nyan object name, filename prefix) @@ -201,6 +263,11 @@ # TMR 44: ("Armenians", "armenians"), 45: ("Georgians", "georgians"), + + # BfG + 46: ("BfGUnkown_46", "bfg_unkown_46"), + 47: ("BfGUnkown_47", "bfg_unkown_47"), + 48: ("BfGUnkown_48", "bfg_unkown_48"), } # key: civ index; value: (civ ids, nyan object name, filename prefix) @@ -208,7 +275,7 @@ GRAPHICS_SET_LOOKUPS = { 0: ((0, 1, 2, 13, 14, 36), "WesternEuropean", "western_european"), 4: ((7, 37), "Byzantine", "byzantine"), - 6: ((19, 24, 43, 44, 45), "Mediterranean", "mediterranean"), + 6: ((19, 24, 43, 44, 45, 46, 47, 48), "Mediterranean", "mediterranean"), 7: ((20, 40, 41, 42), "Indian", "indian"), 8: ((22, 23, 32, 35, 38, 39), "EasternEuropean", "eastern_european"), 11: ((33, 34), "CentralAsian", "central_asian"), @@ -238,4 +305,6 @@ 37: "SiegeBallista", 38: "DE2Skirmisher", 39: "DE2CamelRider", + 40: "BfGUnkown_40", + 60: "BfGUnkown_60", } diff --git a/openage/convert/value_object/read/media/datfile/lookup_dicts.py b/openage/convert/value_object/read/media/datfile/lookup_dicts.py index 7f52816dff..2fd46f118d 100644 --- a/openage/convert/value_object/read/media/datfile/lookup_dicts.py +++ b/openage/convert/value_object/read/media/datfile/lookup_dicts.py @@ -279,6 +279,8 @@ 248: "DE2_UNKNOWN_248", 249: "DE2_UNKNOWN_249", 250: "DE2_UNKNOWN_250", + 501: "DE2_UNKNOWN_501", + 506: "DE2_UNKNOWN_506", } EFFECT_APPLY_TYPE = { @@ -338,6 +340,10 @@ 102: "TECH_TOGGLE", # d == research_id 103: "TECH_TIME_MODIFY", # a == research_id, if c == 0: d==absval else d==relval + -54: "UNKNOWN", # 199: "UNKNOWN", + -55: "UNKNOWN", # 200: "UNKNOWN", + -56: "UNKNOWN", # 201: "UNKNOWN", + # attribute_id: # 0: hit points # 1: line of sight @@ -506,6 +512,8 @@ 37: "DE2_SIEGE_BALLISTA", 38: "DE2_SKIRMISHER", 39: "DE2_CAMEL_RIDER", + 40: "DE2_UNKNOWN_40", + 60: "DE2_UNKNOWN_60", } UNIT_CLASSES = { @@ -757,4 +765,5 @@ 0x0b: "NOCAVALRY", 0x0f: "ALL", 0x10: "SWGB_LIVESTOCK", + 0x40: "DE2_UNKNOWN_40", } From eda7c605c2f975ed2dbd359a7985ea964092b117 Mon Sep 17 00:00:00 2001 From: heinezen Date: Sun, 24 Nov 2024 20:57:34 +0100 Subject: [PATCH 4/4] convert: Add new attributes/resources for 'Battle for Greece' DLC. --- .../conversion/de2/tech_subprocessor.py | 9 ++ .../de2/upgrade_attribute_subprocessor.py | 86 +++++++++- .../de2/upgrade_resource_subprocessor.py | 150 ++++++++++++++++++ 3 files changed, 244 insertions(+), 1 deletion(-) diff --git a/openage/convert/processor/conversion/de2/tech_subprocessor.py b/openage/convert/processor/conversion/de2/tech_subprocessor.py index c9c3a71c17..7bce1d1163 100644 --- a/openage/convert/processor/conversion/de2/tech_subprocessor.py +++ b/openage/convert/processor/conversion/de2/tech_subprocessor.py @@ -63,11 +63,14 @@ class DE2TechSubprocessor: 57: AoCUpgradeAttributeSubprocessor.kidnap_storage_upgrade, 30: DE2UpgradeAttributeSubprocessor.herdable_capacity_upgrade, + 51: DE2UpgradeAttributeSubprocessor.bfg_unknown_51_upgrade, 59: DE2UpgradeAttributeSubprocessor.charge_attack_upgrade, 60: DE2UpgradeAttributeSubprocessor.charge_regen_upgrade, 61: DE2UpgradeAttributeSubprocessor.charge_event_upgrade, 62: DE2UpgradeAttributeSubprocessor.charge_type_upgrade, 63: AoCUpgradeAttributeSubprocessor.ignore_armor_upgrade, + 71: DE2UpgradeAttributeSubprocessor.bfg_unknown_71_upgrade, + 73: DE2UpgradeAttributeSubprocessor.bfg_unknown_73_upgrade, 100: AoCUpgradeAttributeSubprocessor.resource_cost_upgrade, 101: AoCUpgradeAttributeSubprocessor.creation_time_upgrade, 102: AoCUpgradeAttributeSubprocessor.min_projectiles_upgrade, @@ -99,6 +102,7 @@ class DE2TechSubprocessor: 46: AoCUpgradeResourceSubprocessor.tribute_inefficiency_upgrade, 47: AoCUpgradeResourceSubprocessor.gather_gold_efficiency_upgrade, 50: AoCUpgradeResourceSubprocessor.reveal_ally_upgrade, + 69: DE2UpgradeResourceSubprocessor.bfg_unknown_69_upgrade, 77: AoCUpgradeResourceSubprocessor.conversion_resistance_upgrade, 78: AoCUpgradeResourceSubprocessor.trade_penalty_upgrade, 79: AoCUpgradeResourceSubprocessor.gather_stone_efficiency_upgrade, @@ -137,6 +141,7 @@ class DE2TechSubprocessor: 214: DE2UpgradeResourceSubprocessor.free_kipchaks_upgrade, 216: DE2UpgradeResourceSubprocessor.sheep_food_amount_upgrade, 218: DE2UpgradeResourceSubprocessor.cuman_tc_upgrade, + 219: DE2UpgradeResourceSubprocessor.bfg_unknown_219_upgrade, 220: DE2UpgradeResourceSubprocessor.relic_food_production_upgrade, 234: DE2UpgradeResourceSubprocessor.first_crusade_upgrade, 236: DE2UpgradeResourceSubprocessor.burgundian_vineyards_upgrade, @@ -160,6 +165,10 @@ class DE2TechSubprocessor: 274: DE2UpgradeResourceSubprocessor.chieftains_upgrade, 280: DE2UpgradeResourceSubprocessor.conversion_range_upgrade, 282: DE2UpgradeResourceSubprocessor.unknown_recharge_rate_upgrade, + 502: DE2UpgradeResourceSubprocessor.bfg_unknown_502_upgrade, + 507: DE2UpgradeResourceSubprocessor.bfg_unknown_507_upgrade, + 521: DE2UpgradeResourceSubprocessor.bfg_unknown_521_upgrade, + 551: DE2UpgradeResourceSubprocessor.bfg_unknown_551_upgrade, } @classmethod diff --git a/openage/convert/processor/conversion/de2/upgrade_attribute_subprocessor.py b/openage/convert/processor/conversion/de2/upgrade_attribute_subprocessor.py index f60ee8eb64..60a5a4f6ac 100644 --- a/openage/convert/processor/conversion/de2/upgrade_attribute_subprocessor.py +++ b/openage/convert/processor/conversion/de2/upgrade_attribute_subprocessor.py @@ -1,4 +1,4 @@ -# Copyright 2020-2023 the openage authors. See copying.md for legal info. +# Copyright 2020-2024 the openage authors. See copying.md for legal info. # # pylint: disable=too-few-public-methods # @@ -24,6 +24,90 @@ class DE2UpgradeAttributeSubprocessor: Creates raw API objects for attribute upgrade effects in DE2. """ + @staticmethod + def bfg_unknown_51_upgrade( + converter_group: ConverterObjectGroup, + line: GenieGameEntityGroup, + value: typing.Union[int, float], + operator: MemberOperator, + team: bool = False + ) -> list[ForwardRef]: + """ + Creates a patch for a BfG unknown attribute effect (ID: 51). + + :param converter_group: Tech/Civ that gets the patch. + :type converter_group: ...dataformat.converter_object.ConverterObjectGroup + :param line: Unit/Building line that has the ability. + :type line: ...dataformat.converter_object.ConverterObjectGroup + :param value: Value used for patching the member. + :type value: int, float + :param operator: Operator used for patching the member. + :type operator: MemberOperator + :returns: The forward references for the generated patches. + :rtype: list + """ + patches = [] + + # TODO: Implement + + return patches + + @staticmethod + def bfg_unknown_71_upgrade( + converter_group: ConverterObjectGroup, + line: GenieGameEntityGroup, + value: typing.Union[int, float], + operator: MemberOperator, + team: bool = False + ) -> list[ForwardRef]: + """ + Creates a patch for a BfG unknown attribute effect (ID: 71). + + :param converter_group: Tech/Civ that gets the patch. + :type converter_group: ...dataformat.converter_object.ConverterObjectGroup + :param line: Unit/Building line that has the ability. + :type line: ...dataformat.converter_object.ConverterObjectGroup + :param value: Value used for patching the member. + :type value: int, float + :param operator: Operator used for patching the member. + :type operator: MemberOperator + :returns: The forward references for the generated patches. + :rtype: list + """ + patches = [] + + # TODO: Implement + + return patches + + @staticmethod + def bfg_unknown_73_upgrade( + converter_group: ConverterObjectGroup, + line: GenieGameEntityGroup, + value: typing.Union[int, float], + operator: MemberOperator, + team: bool = False + ) -> list[ForwardRef]: + """ + Creates a patch for a BfG unknown attribute effect (ID: 73). + + :param converter_group: Tech/Civ that gets the patch. + :type converter_group: ...dataformat.converter_object.ConverterObjectGroup + :param line: Unit/Building line that has the ability. + :type line: ...dataformat.converter_object.ConverterObjectGroup + :param value: Value used for patching the member. + :type value: int, float + :param operator: Operator used for patching the member. + :type operator: MemberOperator + :returns: The forward references for the generated patches. + :rtype: list + """ + patches = [] + + # TODO: Implement + + return patches + @staticmethod def charge_attack_upgrade( converter_group: ConverterObjectGroup, diff --git a/openage/convert/processor/conversion/de2/upgrade_resource_subprocessor.py b/openage/convert/processor/conversion/de2/upgrade_resource_subprocessor.py index 9abf477831..9ccd9a68f2 100644 --- a/openage/convert/processor/conversion/de2/upgrade_resource_subprocessor.py +++ b/openage/convert/processor/conversion/de2/upgrade_resource_subprocessor.py @@ -48,6 +48,156 @@ def bengali_conversion_resistance_upgrade( return patches + @staticmethod + def bfg_unknown_69_upgrade( + converter_group: ConverterObjectGroup, + value: typing.Union[int, float], + operator: MemberOperator, + team: bool = False + ) -> list[ForwardRef]: + """ + Creates a patch for a BfG unknown resource effect (ID: 69). + + :param converter_group: Tech/Civ that gets the patch. + :type converter_group: ...dataformat.converter_object.ConverterObjectGroup + :param value: Value used for patching the member. + :type value: MemberOperator + :param operator: Operator used for patching the member. + :type operator: MemberOperator + :returns: The forward references for the generated patches. + :rtype: list + """ + patches = [] + + # TODO: Implement + + return patches + + @staticmethod + def bfg_unknown_219_upgrade( + converter_group: ConverterObjectGroup, + value: typing.Union[int, float], + operator: MemberOperator, + team: bool = False + ) -> list[ForwardRef]: + """ + Creates a patch for a BfG unknown resource effect (ID: 219). + + :param converter_group: Tech/Civ that gets the patch. + :type converter_group: ...dataformat.converter_object.ConverterObjectGroup + :param value: Value used for patching the member. + :type value: MemberOperator + :param operator: Operator used for patching the member. + :type operator: MemberOperator + :returns: The forward references for the generated patches. + :rtype: list + """ + patches = [] + + # TODO: Implement + + return patches + + @staticmethod + def bfg_unknown_502_upgrade( + converter_group: ConverterObjectGroup, + value: typing.Union[int, float], + operator: MemberOperator, + team: bool = False + ) -> list[ForwardRef]: + """ + Creates a patch for a BfG unknown resource effect (ID: 502). + + :param converter_group: Tech/Civ that gets the patch. + :type converter_group: ...dataformat.converter_object.ConverterObjectGroup + :param value: Value used for patching the member. + :type value: MemberOperator + :param operator: Operator used for patching the member. + :type operator: MemberOperator + :returns: The forward references for the generated patches. + :rtype: list + """ + patches = [] + + # TODO: Implement + + return patches + + @staticmethod + def bfg_unknown_507_upgrade( + converter_group: ConverterObjectGroup, + value: typing.Union[int, float], + operator: MemberOperator, + team: bool = False + ) -> list[ForwardRef]: + """ + Creates a patch for a BfG unknown resource effect (ID: 507). + + :param converter_group: Tech/Civ that gets the patch. + :type converter_group: ...dataformat.converter_object.ConverterObjectGroup + :param value: Value used for patching the member. + :type value: MemberOperator + :param operator: Operator used for patching the member. + :type operator: MemberOperator + :returns: The forward references for the generated patches. + :rtype: list + """ + patches = [] + + # TODO: Implement + + return patches + + @staticmethod + def bfg_unknown_521_upgrade( + converter_group: ConverterObjectGroup, + value: typing.Union[int, float], + operator: MemberOperator, + team: bool = False + ) -> list[ForwardRef]: + """ + Creates a patch for a BfG unknown resource effect (ID: 521). + + :param converter_group: Tech/Civ that gets the patch. + :type converter_group: ...dataformat.converter_object.ConverterObjectGroup + :param value: Value used for patching the member. + :type value: MemberOperator + :param operator: Operator used for patching the member. + :type operator: MemberOperator + :returns: The forward references for the generated patches. + :rtype: list + """ + patches = [] + + # TODO: Implement + + return patches + + @staticmethod + def bfg_unknown_551_upgrade( + converter_group: ConverterObjectGroup, + value: typing.Union[int, float], + operator: MemberOperator, + team: bool = False + ) -> list[ForwardRef]: + """ + Creates a patch for a BfG unknown resource effect (ID: 551). + + :param converter_group: Tech/Civ that gets the patch. + :type converter_group: ...dataformat.converter_object.ConverterObjectGroup + :param value: Value used for patching the member. + :type value: MemberOperator + :param operator: Operator used for patching the member. + :type operator: MemberOperator + :returns: The forward references for the generated patches. + :rtype: list + """ + patches = [] + + # TODO: Implement + + return patches + @staticmethod def burgundian_vineyards_upgrade( converter_group: ConverterObjectGroup,