From ea1cd5a62e43ee33ddc0acc9d85be2659a367cfa Mon Sep 17 00:00:00 2001 From: duncathan Date: Sat, 19 Feb 2022 01:29:58 -0600 Subject: [PATCH] add formats for bmmap and bmmdef --- .../dread_types.json | 25 ++++++--------- .../formats/__init__.py | 4 +++ .../formats/bmmap.py | 20 ++++++++++++ .../formats/bmmdef.py | 32 +++++++++++++++++++ test/formats/test_minimap.py | 15 +++++++++ 5 files changed, 81 insertions(+), 15 deletions(-) create mode 100644 mercury_engine_data_structures/formats/bmmap.py create mode 100644 mercury_engine_data_structures/formats/bmmdef.py create mode 100644 test/formats/test_minimap.py diff --git a/mercury_engine_data_structures/dread_types.json b/mercury_engine_data_structures/dread_types.json index 0824d895..b126e653 100644 --- a/mercury_engine_data_structures/dread_types.json +++ b/mercury_engine_data_structures/dread_types.json @@ -21250,29 +21250,24 @@ "target": "game::logic::collision::CCollider" }, "base::global::TRntString128": { - "kind": "struct", - "parent": null, - "fields": {} + "kind": "primitive", + "primitive_kind": "string" }, "base::global::TRntString256": { - "kind": "struct", - "parent": null, - "fields": {} + "kind": "primitive", + "primitive_kind": "string" }, "base::global::TRntString32": { - "kind": "struct", - "parent": null, - "fields": {} + "kind": "primitive", + "primitive_kind": "string" }, "base::global::TRntString512": { - "kind": "struct", - "parent": null, - "fields": {} + "kind": "primitive", + "primitive_kind": "string" }, "base::global::TRntString64": { - "kind": "struct", - "parent": null, - "fields": {} + "kind": "primitive", + "primitive_kind": "string" }, "base::global::timeline::CEvent": { "kind": "struct", diff --git a/mercury_engine_data_structures/formats/__init__.py b/mercury_engine_data_structures/formats/__init__.py index b5a01c7f..cdb86973 100644 --- a/mercury_engine_data_structures/formats/__init__.py +++ b/mercury_engine_data_structures/formats/__init__.py @@ -2,6 +2,8 @@ from mercury_engine_data_structures.formats.base_resource import BaseResource, AssetType from mercury_engine_data_structures.formats.bmbls import Bmbls +from mercury_engine_data_structures.formats.bmmap import Bmmap +from mercury_engine_data_structures.formats.bmmdef import Bmmdef from mercury_engine_data_structures.formats.bmsad import Bmsad from mercury_engine_data_structures.formats.bmscc import Bmscc from mercury_engine_data_structures.formats.bmssd import Bmssd @@ -17,6 +19,8 @@ ALL_FORMATS = { "PKG": Pkg, "BMBLS": Bmbls, + "BMMAP": Bmmap, + "BMMDEF": Bmmdef, "BMSSD": Bmssd, "BMSAD": Bmsad, "BRFLD": Brfld, diff --git a/mercury_engine_data_structures/formats/bmmap.py b/mercury_engine_data_structures/formats/bmmap.py new file mode 100644 index 00000000..37c210a6 --- /dev/null +++ b/mercury_engine_data_structures/formats/bmmap.py @@ -0,0 +1,20 @@ +from construct import Construct, Container + +from mercury_engine_data_structures.formats import BaseResource, standard_format +from mercury_engine_data_structures.game_check import Game + +BMMAP = standard_format.create('CMinimapData', 0x02000001) + + +class Bmmap(BaseResource): + @classmethod + def construct_class(cls, target_game: Game) -> Construct: + return BMMAP + + @property + def items(self) -> Container: + return self.raw.Root.mapItems + + @property + def ability_labels(self) -> Container: + return self.raw.Root.mapAbilityLabels diff --git a/mercury_engine_data_structures/formats/bmmdef.py b/mercury_engine_data_structures/formats/bmmdef.py new file mode 100644 index 00000000..d8de0de2 --- /dev/null +++ b/mercury_engine_data_structures/formats/bmmdef.py @@ -0,0 +1,32 @@ +from typing import Tuple +from construct import Construct, Container + +from mercury_engine_data_structures.formats import BaseResource, standard_format +from mercury_engine_data_structures.game_check import Game + +BMMDEF = standard_format.create('CMinimapDef', 0x02000001) + + +class Bmmdef(BaseResource): + @classmethod + def construct_class(cls, target_game: Game) -> Construct: + return BMMDEF + + @property + def icons(self) -> Container: + return self.raw.Root.mapIconDefs + + def add_icon(self, icon_id: str, uSpriteRow: int, uSpriteCol: int, + sInspectorLabel: str, sDisabledIconId: str = '', + vAnchorOffset: Tuple[int, int] = (0, 0), bAutoScale: bool = True, **kwargs): + icon = Container() + icon.uSpriteRow = uSpriteRow + icon.uSpriteCol = uSpriteCol + icon.sDisabledIconId = sDisabledIconId + icon.sInspectorLabel = sInspectorLabel + icon.vAnchorOffset = list(vAnchorOffset) + icon.bAutoScale = bAutoScale + for k, v in kwargs.items(): + icon[k] = v + + self.icons[icon_id] = icon diff --git a/test/formats/test_minimap.py b/test/formats/test_minimap.py new file mode 100644 index 00000000..1c540c5b --- /dev/null +++ b/test/formats/test_minimap.py @@ -0,0 +1,15 @@ +from mercury_engine_data_structures.formats.bmmap import BMMAP +from mercury_engine_data_structures.formats.bmmdef import BMMDEF +from mercury_engine_data_structures.game_check import Game +from test.test_lib import parse_and_build_compare + + +def test_compare_bmmap_dread(dread_path): + parse_and_build_compare( + BMMAP, Game.DREAD, dread_path.joinpath("maps/levels/c10_samus/s010_cave/s010_cave.bmmap"), True + ) + +def test_compare_bmmdef_dread(dread_path): + parse_and_build_compare( + BMMDEF, Game.DREAD, dread_path.joinpath("system/minimap/minimap.bmmdef"), True + )