diff --git a/README.md b/README.md index 1dc1ad86..cbfa311c 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ Construct type definitions for Mercury Engine | BLSND | ✓ | ✓ | ✓ | ✓ | | BLUT | Missing | Missing | ✗ | ✗ | | BMBLS | Missing | Missing | ✓ | ✓ | -| BMDEFS | ✓ | ✓ | ✗ | ✗ | +| BMDEFS | ✓ | ✓ | ✓ | ✓ | | BMMAP | Missing | Missing | ✓ | ✓ | | BMMDEF | Missing | Missing | ✓ | ✓ | | BMSAD | ✓ | ✓ | ✓ | ✓ | diff --git a/src/mercury_engine_data_structures/common_types.py b/src/mercury_engine_data_structures/common_types.py index 4f1d9b2e..341bb981 100644 --- a/src/mercury_engine_data_structures/common_types.py +++ b/src/mercury_engine_data_structures/common_types.py @@ -1,5 +1,6 @@ import copy import functools +import struct import typing import construct @@ -19,6 +20,35 @@ CVector3D = construct.Array(3, Float) CVector4D = construct.Array(4, Float) +class VersionAdapter(Adapter): + def __init__(self, value: int | str | tuple[int, int, int] | None = None): + if isinstance(value, str): + value = tuple([int(i) for i in value.split(".")]) + elif isinstance(value, int): + value = struct.pack(" str: """Specialized construct compile for CVector2/3/4D""" diff --git a/src/mercury_engine_data_structures/dread_data.py b/src/mercury_engine_data_structures/dread_data.py index 470bb3cc..55cb20fb 100644 --- a/src/mercury_engine_data_structures/dread_data.py +++ b/src/mercury_engine_data_structures/dread_data.py @@ -58,3 +58,13 @@ def all_property_id_to_name() -> Dict[int, str]: asset_id: name for name, asset_id in names.items() } + +def all_files_ending_with(ext: str, exclusions: Optional[list[str]] = None) -> list[str]: + if not ext.startswith("."): + ext = "." + ext + + if exclusions is None: + exclusions = [] + + return [name for name in all_name_to_asset_id().keys() + if name.endswith(ext) and name not in exclusions] diff --git a/src/mercury_engine_data_structures/formats/bapd.py b/src/mercury_engine_data_structures/formats/bapd.py index ee81afc0..996157ec 100644 --- a/src/mercury_engine_data_structures/formats/bapd.py +++ b/src/mercury_engine_data_structures/formats/bapd.py @@ -4,7 +4,7 @@ from mercury_engine_data_structures.formats.standard_format import game_model from mercury_engine_data_structures.game_check import Game -BAPD = game_model('sound::CAudioPresets', 0x02030002) +BAPD = game_model('sound::CAudioPresets', "2.3.2") class Bapd(BaseResource): diff --git a/src/mercury_engine_data_structures/formats/bldef.py b/src/mercury_engine_data_structures/formats/bldef.py index 68003553..92cbc4a4 100644 --- a/src/mercury_engine_data_structures/formats/bldef.py +++ b/src/mercury_engine_data_structures/formats/bldef.py @@ -8,7 +8,7 @@ class Bldef(BaseResource): @classmethod def construct_class(cls, target_game: Game) -> Construct: - return standard_format.game_model('CLightManager', 0x02000001) + return standard_format.game_model('CLightManager', "1.0.2") @property def lightdefs(self) -> Container: diff --git a/src/mercury_engine_data_structures/formats/blsnd.py b/src/mercury_engine_data_structures/formats/blsnd.py index d319fdf5..dbebb640 100644 --- a/src/mercury_engine_data_structures/formats/blsnd.py +++ b/src/mercury_engine_data_structures/formats/blsnd.py @@ -4,13 +4,12 @@ from construct.core import ( Const, Construct, - Hex, IfThenElse, Int32ul, Struct, ) -from mercury_engine_data_structures.common_types import StrId, make_vector +from mercury_engine_data_structures.common_types import StrId, VersionAdapter, make_vector from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game, current_game_at_most @@ -18,8 +17,8 @@ "_magic" / Const(b"LSND"), "version" / IfThenElse( current_game_at_most(Game.SAMUS_RETURNS), - Const(0x000B0001, Hex(Int32ul)), - Const(0x000C0001, Hex(Int32ul)) + VersionAdapter("1.11.0"), + VersionAdapter("1.12.0") ), "unk" / Int32ul, "sound_limits" / make_vector(Struct( diff --git a/src/mercury_engine_data_structures/formats/bmbls.py b/src/mercury_engine_data_structures/formats/bmbls.py index 5a3bca90..03b4372d 100644 --- a/src/mercury_engine_data_structures/formats/bmbls.py +++ b/src/mercury_engine_data_structures/formats/bmbls.py @@ -4,7 +4,7 @@ from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game -BMBLS = standard_format.create('base::animation::CBlendSpaceResource', 0x02020001) +BMBLS = standard_format.create('base::animation::CBlendSpaceResource', "1.2.2") class Bmbls(BaseResource): diff --git a/src/mercury_engine_data_structures/formats/bmdefs.py b/src/mercury_engine_data_structures/formats/bmdefs.py index cbc63c69..76f211dc 100644 --- a/src/mercury_engine_data_structures/formats/bmdefs.py +++ b/src/mercury_engine_data_structures/formats/bmdefs.py @@ -4,12 +4,12 @@ Construct, Flag, Float32l, - Int16ul, Int32ul, Struct, ) -from mercury_engine_data_structures.common_types import StrId, make_vector +from mercury_engine_data_structures.common_types import StrId, VersionAdapter, make_vector +from mercury_engine_data_structures.formats import standard_format from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game @@ -67,8 +67,7 @@ BMDEFS = Struct( _magic=Const(b"MDEF"), - major_version=Int16ul, - minor_version=Int16ul, + version=VersionAdapter("1.5.0"), unk1=Int32ul, sounds=make_vector(Struct( "sound_name" / StrId, @@ -92,4 +91,7 @@ class Bmdefs(BaseResource): @classmethod def construct_class(cls, target_game: Game) -> Construct: - return BMDEFS + if target_game == Game.SAMUS_RETURNS: + return BMDEFS + else: + return standard_format.game_model("sound::CMusicManager", "4.0.2") diff --git a/src/mercury_engine_data_structures/formats/bmmap.py b/src/mercury_engine_data_structures/formats/bmmap.py index 38204ad9..66a870fc 100644 --- a/src/mercury_engine_data_structures/formats/bmmap.py +++ b/src/mercury_engine_data_structures/formats/bmmap.py @@ -6,7 +6,7 @@ from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game -BMMAP = standard_format.create('CMinimapData', 0x02000001) +BMMAP = standard_format.create('CMinimapData', "1.0.2") class Bmmap(BaseResource): diff --git a/src/mercury_engine_data_structures/formats/bmmdef.py b/src/mercury_engine_data_structures/formats/bmmdef.py index 3cbeb8ad..fcf1a9e6 100644 --- a/src/mercury_engine_data_structures/formats/bmmdef.py +++ b/src/mercury_engine_data_structures/formats/bmmdef.py @@ -6,7 +6,7 @@ from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game -BMMDEF = standard_format.create('CMinimapDef', 0x02000001) +BMMDEF = standard_format.create('CMinimapDef', "1.0.2") class Bmmdef(BaseResource): diff --git a/src/mercury_engine_data_structures/formats/bmsad.py b/src/mercury_engine_data_structures/formats/bmsad.py index 51b2fcd2..5c0b3307 100644 --- a/src/mercury_engine_data_structures/formats/bmsad.py +++ b/src/mercury_engine_data_structures/formats/bmsad.py @@ -22,7 +22,15 @@ from construct.lib.containers import Container, ListContainer from mercury_engine_data_structures import common_types, type_lib -from mercury_engine_data_structures.common_types import Char, CVector3D, Float, StrId, make_dict, make_vector +from mercury_engine_data_structures.common_types import ( + Char, + CVector3D, + Float, + StrId, + VersionAdapter, + make_dict, + make_vector, +) from mercury_engine_data_structures.construct_extensions.alignment import PrefixedAllowZeroLen from mercury_engine_data_structures.construct_extensions.function_complex import ComplexIf, SwitchComplexKey from mercury_engine_data_structures.construct_extensions.misc import ErrorWithMessage @@ -320,7 +328,7 @@ def _not_implemented(code): # BMSAD BMSAD_SR = Struct( "_magic" / Const(b"MSAD"), - "version" / Const(0x002C0001, Hex(Int32ul)), + "version" / VersionAdapter("1.44.0"), "name" / StrId, @@ -349,7 +357,7 @@ def _not_implemented(code): BMSAD_Dread = Struct( "_magic" / Const(b"MSAD"), - "version" / Const(0x0200000F, Hex(Int32ul)), + "version" / VersionAdapter("15.0.2"), "name" / StrId, "type" / StrId, diff --git a/src/mercury_engine_data_structures/formats/bmsas.py b/src/mercury_engine_data_structures/formats/bmsas.py index a1999ca4..76845975 100644 --- a/src/mercury_engine_data_structures/formats/bmsas.py +++ b/src/mercury_engine_data_structures/formats/bmsas.py @@ -17,7 +17,7 @@ Switch, ) -from mercury_engine_data_structures.common_types import Char, CVector3D, DictAdapter, Float, make_vector +from mercury_engine_data_structures.common_types import Char, CVector3D, DictAdapter, Float, VersionAdapter, make_vector from mercury_engine_data_structures.common_types import StrId as StrIdSR from mercury_engine_data_structures.construct_extensions.strings import PascalStringRobust from mercury_engine_data_structures.formats.base_resource import BaseResource @@ -266,7 +266,7 @@ def build_arg_list_sr(obj_data: dict, io, this): BMSAS_Dread = Struct( _magic=Const(b"MSAS"), - _version=Const(0x00170003, Hex(Int32ul)), + _version=VersionAdapter("3.23.0"), name=StrId, unk=Hex(Int32ul), animations=make_vector(AnimationDread), diff --git a/src/mercury_engine_data_structures/formats/bmsbk.py b/src/mercury_engine_data_structures/formats/bmsbk.py index 427e99f5..082cbe37 100644 --- a/src/mercury_engine_data_structures/formats/bmsbk.py +++ b/src/mercury_engine_data_structures/formats/bmsbk.py @@ -7,14 +7,13 @@ Container, Flag, Float32l, - Hex, Int32ul, Rebuild, Struct, Terminated, ) -from mercury_engine_data_structures.common_types import CVector3D, StrId, make_vector +from mercury_engine_data_structures.common_types import CVector3D, StrId, VersionAdapter, make_vector from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game @@ -45,7 +44,7 @@ def _rebuild_types(ctx: Container) -> int: BMSBK = Struct( "magic" / Const(b"MSBK"), - "version" / Hex(Int32ul), + "version" / VersionAdapter(), "block_groups" / make_vector(BlockGroup), "collision_cameras" / make_vector(Struct( "name" / StrId, diff --git a/src/mercury_engine_data_structures/formats/bmscc.py b/src/mercury_engine_data_structures/formats/bmscc.py index 0c826825..edef4773 100644 --- a/src/mercury_engine_data_structures/formats/bmscc.py +++ b/src/mercury_engine_data_structures/formats/bmscc.py @@ -3,7 +3,6 @@ Const, Construct, GreedyBytes, - Hex, IfThenElse, Int8ul, Int16ul, @@ -12,7 +11,7 @@ ) from mercury_engine_data_structures import game_check -from mercury_engine_data_structures.common_types import StrId, UInt, make_vector +from mercury_engine_data_structures.common_types import StrId, VersionAdapter, make_vector from mercury_engine_data_structures.construct_extensions.misc import ErrorWithMessage from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.formats.collision import collision_formats @@ -47,8 +46,8 @@ _magic=Const(b"MSCD"), _version=IfThenElse( game_check.current_game_at_most(Game.SAMUS_RETURNS), - Const(0x000D0001, Hex(UInt)), - Const(0x00100001, Hex(UInt)), + VersionAdapter("1.14.0"), + VersionAdapter("1.16.0"), ), layers=make_vector(CollisionLayer), eof=GreedyBytes, diff --git a/src/mercury_engine_data_structures/formats/bmscu.py b/src/mercury_engine_data_structures/formats/bmscu.py index 499a4292..3ff63cd2 100644 --- a/src/mercury_engine_data_structures/formats/bmscu.py +++ b/src/mercury_engine_data_structures/formats/bmscu.py @@ -4,7 +4,7 @@ from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game -BMSCU = standard_format.create('CCutSceneDef', 0x02030008) +BMSCU = standard_format.create('CCutSceneDef', "8.3.2") class Bmscu(BaseResource): diff --git a/src/mercury_engine_data_structures/formats/bmsem.py b/src/mercury_engine_data_structures/formats/bmsem.py index 82e53257..0feafc62 100644 --- a/src/mercury_engine_data_structures/formats/bmsem.py +++ b/src/mercury_engine_data_structures/formats/bmsem.py @@ -3,18 +3,17 @@ Const, Construct, Float32l, - Hex, Int32ul, Struct, ) -from mercury_engine_data_structures.common_types import StrId, make_vector +from mercury_engine_data_structures.common_types import StrId, VersionAdapter, make_vector from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game BMSEM = Struct( _magic=Const(b"MSEM"), - _version=Const(0x00030001, Hex(Int32ul)), + _version=VersionAdapter("1.3.0"), groups=make_vector(Struct( "group_name" / StrId, "layers" / make_vector(Struct( diff --git a/src/mercury_engine_data_structures/formats/bmses.py b/src/mercury_engine_data_structures/formats/bmses.py index 5442169c..2eeb04b3 100644 --- a/src/mercury_engine_data_structures/formats/bmses.py +++ b/src/mercury_engine_data_structures/formats/bmses.py @@ -5,19 +5,17 @@ Const, Construct, Float32l, - Hex, Int32sl, - Int32ul, Struct, ) -from mercury_engine_data_structures.common_types import StrId, make_vector +from mercury_engine_data_structures.common_types import StrId, VersionAdapter, make_vector from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game BMSES = Struct( "_magic" / Const(b"MSES"), - "version" / Const(0x00050001, Hex(Int32ul)), + "version" / VersionAdapter("1.5.0"), "sounds" / make_vector(Struct( "name" / StrId, "sound_file" / StrId, diff --git a/src/mercury_engine_data_structures/formats/bmsld.py b/src/mercury_engine_data_structures/formats/bmsld.py index 89884e09..5d75e952 100644 --- a/src/mercury_engine_data_structures/formats/bmsld.py +++ b/src/mercury_engine_data_structures/formats/bmsld.py @@ -4,7 +4,7 @@ import construct from construct import Const, Construct, Container, Flag, Float32l, Hex, Int32ul, Struct, Switch -from mercury_engine_data_structures.common_types import CVector3D, Float, StrId, make_dict, make_vector +from mercury_engine_data_structures.common_types import CVector3D, Float, StrId, VersionAdapter, make_dict, make_vector from mercury_engine_data_structures.construct_extensions.misc import ErrorWithMessage from mercury_engine_data_structures.construct_extensions.strings import StaticPaddedString from mercury_engine_data_structures.crc import crc32 @@ -81,7 +81,7 @@ BMSLD = Struct( _magic=Const(b"MSLD"), - version=Const(0x00140001, Hex(Int32ul)), + version=VersionAdapter("1.20.0"), unk1=Int32ul, unk2=Int32ul, diff --git a/src/mercury_engine_data_structures/formats/bmslgroup.py b/src/mercury_engine_data_structures/formats/bmslgroup.py index c9cf9380..80ea19c4 100644 --- a/src/mercury_engine_data_structures/formats/bmslgroup.py +++ b/src/mercury_engine_data_structures/formats/bmslgroup.py @@ -4,7 +4,7 @@ from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game -BMSLGROUP = standard_format.create('navmesh::CDynamicSmartLinkGroup', 0x02000001) +BMSLGROUP = standard_format.create('navmesh::CDynamicSmartLinkGroup', "1.0.2") class Bmslgroup(BaseResource): diff --git a/src/mercury_engine_data_structures/formats/bmslink.py b/src/mercury_engine_data_structures/formats/bmslink.py index d7484fd4..2edf0405 100644 --- a/src/mercury_engine_data_structures/formats/bmslink.py +++ b/src/mercury_engine_data_structures/formats/bmslink.py @@ -3,14 +3,13 @@ from construct.core import ( Byte, Const, - Hex, Int32ul, LazyBound, PrefixedArray, Struct, ) -from mercury_engine_data_structures.common_types import Float, StrId +from mercury_engine_data_structures.common_types import Float, StrId, VersionAdapter from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game @@ -54,7 +53,7 @@ BMSLINK = Struct( _magic = Const(b"LINK"), - version = Const(0x001F0001, Hex(Int32ul)), + version = VersionAdapter("1.31.0"), unk_bool = Byte, location = LocationStruct, diff --git a/src/mercury_engine_data_structures/formats/bmsmd.py b/src/mercury_engine_data_structures/formats/bmsmd.py index ba01cd41..f1966d31 100644 --- a/src/mercury_engine_data_structures/formats/bmsmd.py +++ b/src/mercury_engine_data_structures/formats/bmsmd.py @@ -11,13 +11,13 @@ Struct, ) -from mercury_engine_data_structures.common_types import StrId, make_vector +from mercury_engine_data_structures.common_types import StrId, VersionAdapter, make_vector from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game BMSMD = Struct( "_magic" / Const(b"MSMD"), - "version" / Const(0x000D0001, Hex(Int32ul)), + "version" / VersionAdapter("1.13.0"), "map_data" / make_vector(Struct( "icon" / StrId, "scenarios" / make_vector(Struct( diff --git a/src/mercury_engine_data_structures/formats/bmsmsd.py b/src/mercury_engine_data_structures/formats/bmsmsd.py index c34de497..5bfbbb5e 100644 --- a/src/mercury_engine_data_structures/formats/bmsmsd.py +++ b/src/mercury_engine_data_structures/formats/bmsmsd.py @@ -1,9 +1,9 @@ import functools import construct -from construct.core import Const, Construct, Enum, FlagsEnum, Float32l, Hex, Int32sl, Int32ul, Struct +from construct.core import Const, Construct, Enum, FlagsEnum, Float32l, Int32sl, Int32ul, Struct -from mercury_engine_data_structures.common_types import CVector2D, CVector3D, StrId, make_vector +from mercury_engine_data_structures.common_types import CVector2D, CVector3D, StrId, VersionAdapter, make_vector from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game @@ -41,7 +41,7 @@ # BMSMSD BMSMSD = Struct( "_magic" / Const(b"MMSD"), - "version" / Const(0x00070001, Hex(Int32ul)), + "version" / VersionAdapter("1.7.0"), "scenario" / StrId, "tile_size" / construct.Array(2, Float32l), "x_tiles" / Int32sl, diff --git a/src/mercury_engine_data_structures/formats/bmsnav.py b/src/mercury_engine_data_structures/formats/bmsnav.py index c03433ea..403d94f8 100644 --- a/src/mercury_engine_data_structures/formats/bmsnav.py +++ b/src/mercury_engine_data_structures/formats/bmsnav.py @@ -1,6 +1,6 @@ from construct.core import Array, Byte, Const, Construct, Flag, Hex, Int32ul, PrefixedArray, Struct, Terminated -from mercury_engine_data_structures.common_types import CVector2D, CVector3D, Float, StrId, make_dict +from mercury_engine_data_structures.common_types import CVector2D, CVector3D, Float, StrId, VersionAdapter, make_dict from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game @@ -162,7 +162,7 @@ ) BMSNAV = Struct( _magic=Const(b'MNAV'), - version=Const(0x00030002, Hex(Int32ul)), + version=VersionAdapter("2.3.0"), aNavmeshGeos=PrefixedArray(Int32ul, CVector2D), # giant list of all of the navmesh geos in the scenario. referenced by index all over the rest of the format. geo_connections=PrefixedArray(Int32ul, geo_connections), # maybe mapping the geo connections? diff --git a/src/mercury_engine_data_structures/formats/bmssd.py b/src/mercury_engine_data_structures/formats/bmssd.py index 8376b073..91db9b6f 100644 --- a/src/mercury_engine_data_structures/formats/bmssd.py +++ b/src/mercury_engine_data_structures/formats/bmssd.py @@ -10,14 +10,14 @@ ) from mercury_engine_data_structures import game_check -from mercury_engine_data_structures.common_types import CVector3D, StrId, make_vector +from mercury_engine_data_structures.common_types import CVector3D, StrId, VersionAdapter, make_vector from mercury_engine_data_structures.construct_extensions.strings import StaticPaddedString from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game BMSSD = Struct( _magic=Const(b"MSSD"), - unk1=Int32ul, + unk1=VersionAdapter(), part_info=game_check.is_at_most( Game.SAMUS_RETURNS, make_vector( diff --git a/src/mercury_engine_data_structures/formats/bmtre.py b/src/mercury_engine_data_structures/formats/bmtre.py index b9be6280..8669be34 100644 --- a/src/mercury_engine_data_structures/formats/bmtre.py +++ b/src/mercury_engine_data_structures/formats/bmtre.py @@ -5,7 +5,6 @@ Construct, Container, Flag, - Hex, Int32sl, Int32ul, LazyBound, @@ -14,7 +13,7 @@ Switch, ) -from mercury_engine_data_structures.common_types import Float, StrId +from mercury_engine_data_structures.common_types import Float, StrId, VersionAdapter from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.formats.property_enum import PropertyEnum from mercury_engine_data_structures.game_check import Game @@ -56,7 +55,7 @@ BMTRE = Struct( _magic = Const(b"BTRE"), - version = Const(0x00050001, Hex(Int32ul)), # for dread, unsure if it exists in SR + version = VersionAdapter("1.5.0"), args = PrefixedArray(Int32ul, StrKeyArgument), behavior = Behavior, ) diff --git a/src/mercury_engine_data_structures/formats/bmtun.py b/src/mercury_engine_data_structures/formats/bmtun.py index c05719d8..1bbf008a 100644 --- a/src/mercury_engine_data_structures/formats/bmtun.py +++ b/src/mercury_engine_data_structures/formats/bmtun.py @@ -5,14 +5,12 @@ Const, Construct, Flag, - Hex, Int32sl, - Int32ul, Struct, Switch, ) -from mercury_engine_data_structures.common_types import Char, CVector3D, Float, StrId, make_dict +from mercury_engine_data_structures.common_types import Char, CVector3D, Float, StrId, VersionAdapter, make_dict from mercury_engine_data_structures.construct_extensions.misc import ErrorWithMessage from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game @@ -40,7 +38,7 @@ # BMTUN BMTUN = Struct( "_magic" / Const(b"MTUN"), - "version" / Const(0x00050001, Hex(Int32ul)), + "version" / VersionAdapter("1.5.0"), "classes" / make_dict(TunableClass), construct.Terminated, ) diff --git a/src/mercury_engine_data_structures/formats/brem.py b/src/mercury_engine_data_structures/formats/brem.py index da41b063..568725b3 100644 --- a/src/mercury_engine_data_structures/formats/brem.py +++ b/src/mercury_engine_data_structures/formats/brem.py @@ -8,4 +8,4 @@ class Brem(BaseResource): @classmethod def construct_class(cls, target_game: Game) -> construct.Construct: - return standard_format.game_model('CEnvironmentMusicPresets', 0x02000004) + return standard_format.game_model('CEnvironmentMusicPresets', "4.0.2") diff --git a/src/mercury_engine_data_structures/formats/bres.py b/src/mercury_engine_data_structures/formats/bres.py index 3f3ad88c..f4af7700 100644 --- a/src/mercury_engine_data_structures/formats/bres.py +++ b/src/mercury_engine_data_structures/formats/bres.py @@ -8,4 +8,4 @@ class Bres(BaseResource): @classmethod def construct_class(cls, target_game: Game) -> construct.Construct: - return standard_format.game_model('CEnvironmentSoundPresets', 0x02020001) + return standard_format.game_model('CEnvironmentSoundPresets', "1.2.2") diff --git a/src/mercury_engine_data_structures/formats/brev.py b/src/mercury_engine_data_structures/formats/brev.py index ffcd431b..a46389bb 100644 --- a/src/mercury_engine_data_structures/formats/brev.py +++ b/src/mercury_engine_data_structures/formats/brev.py @@ -8,4 +8,4 @@ class Brev(BaseResource): @classmethod def construct_class(cls, target_game: Game) -> construct.Construct: - return standard_format.game_model('CEnvironmentVisualPresets', 0x02020004) + return standard_format.game_model('CEnvironmentVisualPresets', "4.2.2") diff --git a/src/mercury_engine_data_structures/formats/brfld.py b/src/mercury_engine_data_structures/formats/brfld.py index 5c1e964a..a898291b 100644 --- a/src/mercury_engine_data_structures/formats/brfld.py +++ b/src/mercury_engine_data_structures/formats/brfld.py @@ -15,7 +15,7 @@ class Brfld(BaseResource): @classmethod @functools.lru_cache def construct_class(cls, target_game: Game) -> construct.Construct: - return standard_format.game_model('CScenario', 0x02000031) + return standard_format.game_model('CScenario', "49.0.2") def actors_for_layer(self, name: str) -> dict: return self.raw.Root.pScenario.rEntitiesLayer.dctSublayers[name].dctActors diff --git a/src/mercury_engine_data_structures/formats/brsa.py b/src/mercury_engine_data_structures/formats/brsa.py index 03f94b82..23b574c9 100644 --- a/src/mercury_engine_data_structures/formats/brsa.py +++ b/src/mercury_engine_data_structures/formats/brsa.py @@ -12,7 +12,7 @@ class Brsa(BaseResource): @classmethod @functools.lru_cache def construct_class(cls, target_game: Game) -> Construct: - return standard_format.game_model('CSubAreaManager', 0x02010002) + return standard_format.game_model('CSubAreaManager', "2.1.2") @property def subarea_setups(self) -> Iterator[Container]: diff --git a/src/mercury_engine_data_structures/formats/bsmat.py b/src/mercury_engine_data_structures/formats/bsmat.py index 4f647564..998243e2 100644 --- a/src/mercury_engine_data_structures/formats/bsmat.py +++ b/src/mercury_engine_data_structures/formats/bsmat.py @@ -7,7 +7,6 @@ Container, Enum, Flag, - Hex, Int32sl, Int32ul, PrefixedArray, @@ -15,7 +14,7 @@ Switch, ) -from mercury_engine_data_structures.common_types import Char, Float, StrId +from mercury_engine_data_structures.common_types import Char, Float, StrId, VersionAdapter from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game @@ -222,7 +221,7 @@ BSMAT = Struct( _magic = Const(b"MSUR"), - _ver = Const(0x00110002, Hex(Int32ul)), + _ver = VersionAdapter("2.17.0"), name = StrId, # Binary shader data diff --git a/src/mercury_engine_data_structures/formats/gui_files.py b/src/mercury_engine_data_structures/formats/gui_files.py index ec4aa52f..199d46fd 100644 --- a/src/mercury_engine_data_structures/formats/gui_files.py +++ b/src/mercury_engine_data_structures/formats/gui_files.py @@ -4,9 +4,9 @@ from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game -BMSCP = standard_format.create('GUI::CDisplayObjectContainer', 0x02020001, explicit_root=True) -BMSSK = standard_format.create('GUI::CGUIManager::SkinContainer', 0x02020001, explicit_root=True) -BMSSS = standard_format.create('GUI::CGUIManager::SpriteSheetContainer', 0x02020001, explicit_root=True) +BMSCP = standard_format.create('GUI::CDisplayObjectContainer', "1.2.2", explicit_root=True) +BMSSK = standard_format.create('GUI::CGUIManager::SkinContainer', "1.2.2", explicit_root=True) +BMSSS = standard_format.create('GUI::CGUIManager::SpriteSheetContainer', "1.2.2", explicit_root=True) class Bmscp(BaseResource): diff --git a/src/mercury_engine_data_structures/formats/standard_format.py b/src/mercury_engine_data_structures/formats/standard_format.py index 5e09242d..ca23ec62 100644 --- a/src/mercury_engine_data_structures/formats/standard_format.py +++ b/src/mercury_engine_data_structures/formats/standard_format.py @@ -4,6 +4,7 @@ import construct +from mercury_engine_data_structures.common_types import VersionAdapter from mercury_engine_data_structures.formats.property_enum import PropertyEnum from mercury_engine_data_structures.game_check import Game, GameSpecificStruct from mercury_engine_data_structures.type_lib import get_type_lib_dread @@ -13,7 +14,8 @@ def _const_if_present(con: construct.Construct, value: typing.Any | None) -> con return construct.Const(value, con) if value is not None else con -def create(name: Optional[str], version: Optional[int], root_name: Optional[str] = None, explicit_root: bool = False): +def create(name: Optional[str], version: Optional[int | str | tuple[int, int, int]], + root_name: Optional[str] = None, explicit_root: bool = False): # this maybe needs to change in the future if SR and Dread have different formats for type using this type_lib = get_type_lib_dread() if root_name is None: @@ -30,7 +32,7 @@ def create(name: Optional[str], version: Optional[int], root_name: Optional[str] result = GameSpecificStruct(construct.Struct( _class_crc=_const_if_present(PropertyEnum, name), - _version=_const_if_present(construct.Hex(construct.Int32ul), version), + _version=VersionAdapter(version), root_type=construct.Const('Root', PropertyEnum), Root=root, @@ -42,9 +44,9 @@ def create(name: Optional[str], version: Optional[int], root_name: Optional[str] @functools.lru_cache -def _cached_game_model(): - return create(None, None, "gameeditor::CGameModelRoot").compile() +def _cached_game_model(name: Optional[str], version: Optional[int | str | tuple[int, int, int]]): + return create(name, version, "gameeditor::CGameModelRoot").compile() -def game_model(name: str, version: int): - return _cached_game_model() +def game_model(name: Optional[str], version: Optional[int | str | tuple[int, int, int]]): + return _cached_game_model(name, version) diff --git a/src/mercury_engine_data_structures/formats/txt.py b/src/mercury_engine_data_structures/formats/txt.py index da2dac8c..789db228 100644 --- a/src/mercury_engine_data_structures/formats/txt.py +++ b/src/mercury_engine_data_structures/formats/txt.py @@ -4,7 +4,7 @@ import construct from construct.core import Const, Construct, GreedyRange, Struct -from mercury_engine_data_structures.common_types import DictAdapter, DictElement +from mercury_engine_data_structures.common_types import DictAdapter, DictElement, VersionAdapter from mercury_engine_data_structures.construct_extensions.strings import CStringRobust from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game, is_sr_or_else @@ -39,8 +39,8 @@ def _parse_{n}(io, this): TXT = Struct( "magic" / Const(b'BTXT'), "version" / is_sr_or_else( - Const(b'\x01\x00\x08\x00'), - Const(b'\x01\x00\x0a\x00'), + VersionAdapter("1.8.0"), + VersionAdapter("1.10.0"), ), "strings" / DictAdapter(_string_range), "_end" / construct.Terminated, diff --git a/src/mercury_engine_data_structures/samus_returns_data.py b/src/mercury_engine_data_structures/samus_returns_data.py index 62e9e274..33a4eac3 100644 --- a/src/mercury_engine_data_structures/samus_returns_data.py +++ b/src/mercury_engine_data_structures/samus_returns_data.py @@ -59,3 +59,13 @@ def all_property_id_to_name() -> Dict[int, str]: asset_id: name for name, asset_id in names.items() } + +def all_files_ending_with(ext: str, exclusions: Optional[list[str]] = None) -> list[str]: + if not ext.startswith("."): + ext = "." + ext + + if exclusions is None: + exclusions = [] + + return [name for name in all_name_to_asset_id().keys() + if name.endswith(ext) and name not in exclusions] diff --git a/tests/formats/test_bapd.py b/tests/formats/test_bapd.py index 8ee1ad60..5c91d7b1 100644 --- a/tests/formats/test_bapd.py +++ b/tests/formats/test_bapd.py @@ -4,10 +4,7 @@ from mercury_engine_data_structures import dread_data from mercury_engine_data_structures.formats.bapd import Bapd -all_dread_bapd = [name for name in dread_data.all_name_to_asset_id().keys() - if name.endswith(".bapd")] - -@pytest.mark.parametrize("bapd_path", all_dread_bapd) +@pytest.mark.parametrize("bapd_path", dread_data.all_files_ending_with(".bapd")) def test_bmtre(dread_file_tree, bapd_path): parse_build_compare_editor(Bapd, dread_file_tree, bapd_path) diff --git a/tests/formats/test_bcmdl.py b/tests/formats/test_bcmdl.py index 07bf43e9..47ebf7fe 100644 --- a/tests/formats/test_bcmdl.py +++ b/tests/formats/test_bcmdl.py @@ -6,9 +6,6 @@ from mercury_engine_data_structures import dread_data from mercury_engine_data_structures.formats.bcmdl import Bcmdl -all_dread_bcmdl = [name for name in dread_data.all_name_to_asset_id().keys() - if name.endswith(".bcmdl")] - dread_bcmdl_expected_failure = [ 'actors/characters/morphball/models/labase.bcmdl', 'actors/characters/morphball/models/ladamage.bcmdl', @@ -27,7 +24,7 @@ ] -@pytest.mark.parametrize("bcmdl_path", all_dread_bcmdl) +@pytest.mark.parametrize("bcmdl_path", dread_data.all_files_ending_with(".bcmdl")) def test_compare_dread_all(dread_file_tree, bcmdl_path): if bcmdl_path in dread_bcmdl_expected_failure: expectation = pytest.raises(AssertionError) diff --git a/tests/formats/test_bctex.py b/tests/formats/test_bctex.py index 73d3db43..fa0c82e2 100644 --- a/tests/formats/test_bctex.py +++ b/tests/formats/test_bctex.py @@ -1,23 +1,187 @@ import pytest -from tests.test_lib import parse_and_build_compare_parsed +from tests.test_lib import parse_build_compare_editor_parsed -from mercury_engine_data_structures import samus_returns_data -from mercury_engine_data_structures.formats.bctex import BCTEX_SR, BCTEX_Dread -from mercury_engine_data_structures.game_check import Game +from mercury_engine_data_structures import dread_data, samus_returns_data +from mercury_engine_data_structures.formats.bctex import Bctex +sr_missing = [ + "actors/characters/alpha/models/textures/alphab_a.bctex", + "actors/characters/alpha/models/textures/alphab_d.bctex", + "actors/characters/alphacredits/models/textures/alphab_a.bctex", + "actors/characters/alphacredits/models/textures/alphab_d.bctex", + "actors/characters/gamma/models/textures/coreveins.bctex", + "actors/characters/gammacredits/models/textures/coreveins.bctex", + "actors/characters/gammaevolved/models/textures/coreveins.bctex", + "actors/characters/glowflypuzzle/models/textures/glowfly_d.bctex", + "actors/characters/metroid/models/textures/coreveins.bctex", + "actors/characters/moheekwall/models/textures/moheekwall_a.bctex", + "actors/characters/morphball/models/textures/fusionmorph_a.bctex", + "actors/characters/morphball/models/textures/fusionmorphgravity_d.bctex", + "actors/characters/morphball/models/textures/fusionmorphpower_d.bctex", + "actors/characters/morphball/models/textures/fusionmorphvaria_d.bctex", + "actors/characters/morphball/models/textures/samuspowermorphnew_a.bctex", + "actors/characters/morphball/models/textures/samuspowermorphnew_d.bctex", + "actors/characters/morphball/models/textures/samusvariamorph_a.bctex", + "actors/characters/morphball/models/textures/samusvariamorph_d.bctex", + "actors/characters/omega/models/textures/coreveins.bctex", + "actors/characters/omegacredits/models/textures/coreveins.bctex", + "actors/characters/omegaevolved/models/textures/coreveins.bctex", + "actors/characters/queen/models/textures/coreveins.bctex", + "actors/characters/queen/models/textures/queen01_a.bctex", + "actors/characters/queen/models/textures/queen01_d.bctex", + "actors/characters/queen/models/textures/queen02_a.bctex", + "actors/characters/queen/models/textures/queen02_d.bctex", + "actors/characters/queen/models/textures/queen03_a.bctex", + "actors/characters/queen/models/textures/queen03_d.bctex", + "actors/characters/queen/models/textures/queen04_a.bctex", + "actors/characters/queen/models/textures/queen04_d.bctex", + "actors/characters/ridley/models/textures/ridleydeath_d.bctex", + "actors/characters/ridley/models/textures/ridleyhand_a.bctex", + "actors/characters/ridley/models/textures/ridleyhand_d.bctex", + "actors/characters/samus/models/textures/energywave.bctex", + "actors/characters/samus/models/textures/gradientdif.bctex", + "actors/characters/samus/models/textures/grid.bctex", + "actors/characters/samus/models/textures/noise3.bctex", + "actors/characters/samus/models/textures/samusending_a.bctex", + "actors/characters/samus/models/textures/samusending_d.bctex", + "actors/characters/samus/models/textures/samusgravityreward_d.bctex", + "actors/characters/samus/models/textures/samusweaponreward_d.bctex", + "actors/characters/samus/models/textures/samuszeroreward_a.bctex", + "actors/characters/samus/models/textures/samuszeroreward_d.bctex", + "actors/characters/samus/models/textures/samuszeroweapon_d.bctex", + "actors/characters/samusfusion/models/textures/droppables00.bctex", + "actors/characters/samusfusion/models/textures/droppables01.bctex", + "actors/characters/samusfusion/models/textures/energywave.bctex", + "actors/characters/samusfusion/models/textures/gradientdif.bctex", + "actors/characters/samusfusion/models/textures/grid.bctex", + "actors/characters/samusfusion/models/textures/laser_la.bctex", + "actors/characters/samusfusion/models/textures/noise3.bctex", + "actors/characters/samusfusion/models/textures/phasedisplacement.bctex", + "actors/characters/samusfusion/models/textures/scanningpulse.bctex", + "actors/characters/samusrewards/models/textures/energywave.bctex", + "actors/characters/samusrewards/models/textures/gradientdif.bctex", + "actors/characters/samusrewards/models/textures/grid.bctex", + "actors/characters/samusrewards/models/textures/laser_la.bctex", + "actors/characters/samusrewards/models/textures/noise3.bctex", + "actors/characters/samusrewards/models/textures/phasedisplacement.bctex", + "actors/characters/samusrewards/models/textures/samusending_a.bctex", + "actors/characters/samusrewards/models/textures/samusending_d.bctex", + "actors/characters/samusrewards/models/textures/samuspower_a.bctex", + "actors/characters/samusrewards/models/textures/samuspower_d.bctex", + "actors/characters/samusrewards/models/textures/samusvaria_a.bctex", + "actors/characters/samusrewards/models/textures/samusvaria_d.bctex", + "actors/characters/samusrewards/models/textures/samuszeroreward_a.bctex", + "actors/characters/samusrewards/models/textures/samuszeroweapon_d.bctex", + "actors/characters/samusrewards/models/textures/scanningpulse.bctex", + "actors/characters/zeta/models/textures/coreveins.bctex", + "actors/characters/zetacredits/models/textures/coreveins.bctex", + "actors/characters/zetaevolved/models/textures/coreveins.bctex", + "actors/items/itemsphere_spenergygaunlet/models/textures/itemspherespenergygaunlet_d.bctex", + "actors/items/powerup_spinattack/models/textures/itemvariasuit_d.bctex", + "actors/props/blockingplant/models/textures/blockingplantheavy_d.bctex", + "actors/props/creditsfx/models/textures/glow_big.bctex", + "actors/props/creditsfx/models/textures/glowmetroid.bctex", + "actors/props/creditsfx/models/textures/halowind.bctex", + "actors/props/creditsfx/models/textures/xflaremetroid.bctex", + "actors/props/doorcreatureleft/models/textures/doorcreature_d.bctex", + "actors/props/doorcreatureleft/models/textures/spiderweb_d.bctex", + "actors/props/dropprop/models/textures/dropprop_d.bctex", + "actors/props/samusshipinterior/models/textures/samusship_bigpanel2.bctex", + "actors/props/spenergybestowalstatue/models/textures/spenergybestowalstatue_d.bctex", + "actors/weapons/manicminerbotlaser/models/textures/target_circle.bctex", + "actors/weapons/weaponstank/models/textures/tankglow.bctex", + "actors/weapons/weaponstank/models/textures/weaponstank_d.bctex", + "cutscenes/postcredits/models/xparasite/textures/cubemetroids.bctex", + "maps/blocks/weightblock/textures/weightblock_d.bctex", + "maps/objects/chozohologram/textures/chozohologram_d.bctex", + "maps/textures/a1wall01.bctex", + "maps/textures/a2chozocolumn0301_d.bctex", + "maps/textures/a6chozocolumn01_d.bctex", + "maps/textures/a6chozocolumn0204_d.bctex", + "maps/textures/a9chozobg0301_d.bctex", + "maps/textures/brick_wall00.bctex", + "maps/textures/chozohologram01_d.bctex", + "maps/textures/chozointeriortile04.bctex", + "maps/textures/chozopath0902_d.bctex", + "maps/textures/chozopath1002_d.bctex", + "maps/textures/chozotilewall01b_d.bctex", + "maps/textures/chozotilewall04haz_d.bctex", + "maps/textures/chozoverticaldeco01_d.bctex", + "maps/textures/clear_blue_checker.bctex", + "maps/textures/dark_grey_checker.bctex", + "maps/textures/debris0301_d.bctex", + "maps/textures/green_d.bctex", + "maps/textures/insect0702_d.bctex", + "maps/textures/lava2.bctex", + "maps/textures/light_grey_checker.bctex", + "maps/textures/plant0103_d.bctex", + "maps/textures/plant0607_d.bctex", + "maps/textures/ref_rock03.bctex", + "maps/textures/ref_rock05.bctex", + "maps/textures/rock_wall01_d.bctex", + "maps/textures/rock_wall02.bctex", + "maps/textures/rockadorn0604cut_d.bctex", + "maps/textures/rockadornchozo0303_d.bctex", + "maps/textures/rockadornchozo0306_d.bctex", + "maps/textures/rockadorngold0303_d.bctex", + "maps/textures/rockadorngold0306_d.bctex", + "maps/textures/rockbg0601.bctex", + "maps/textures/rockcolumn0301_d.bctex", + "maps/textures/rockcolumn04.bctex", + "maps/textures/rockplatform0101_d.bctex", + "maps/textures/rockplatform0405b_d.bctex", + "maps/textures/rockplatform1002c_d.bctex", + "maps/textures/rockwall0302_d.bctex", + "maps/textures/rockwall0402b_d.bctex", + "maps/textures/rockwalltile0604.bctex", + "maps/textures/rockwalltile0702c_d.bctex", + "maps/textures/sand02_d.bctex", + "maps/textures/smoke0002_d.bctex", + "maps/textures/spaceblackhole_d.bctex", + "maps/textures/surface_sky.bctex", + "maps/textures/surfacebray2c_d.bctex", + "maps/textures/surfacecolumn01.bctex", + "maps/textures/temp/cubemetroids.bctex", + "maps/textures/wall06.bctex", + "maps/textures/water10b_d.bctex", + "maps/textures/waterfall.bctex", + "maps/textures/waterfront01_d.bctex", + "maps/textures/waterop.bctex", + "system/fx/textures/arc.bctex", + "system/fx/textures/arrow3.bctex", + "system/fx/textures/ashes_la.bctex", + "system/fx/textures/blood_red.bctex", + "system/fx/textures/energy.bctex", + "system/fx/textures/energybubble.bctex", + "system/fx/textures/energyray.bctex", + "system/fx/textures/energytrail.bctex", + "system/fx/textures/fireball_l.bctex", + "system/fx/textures/fireballbounce_l.bctex", + "system/fx/textures/fireballbounce_rgba.bctex", + "system/fx/textures/flame.bctex", + "system/fx/textures/flameline.bctex", + "system/fx/textures/fleechswarm.bctex", + "system/fx/textures/laserfalloff_la.bctex", + "system/fx/textures/lightning_fade.bctex", + "system/fx/textures/lightningcore_l.bctex", + "system/fx/textures/noise2.bctex", + "system/fx/textures/ramp_bwbwb.bctex", + "system/fx/textures/raypart_l.bctex", + "system/fx/textures/specialab.bctex", + "system/fx/textures/swarm.bctex", + "system/fx/textures/swirl.bctex", + "system/fx/textures/swirlcircle.bctex", + "system/fx/textures/swirlexplosion.bctex", + "system/fx/textures/target_l.bctex", + "system/fx/textures/threadleak.bctex", + "system/fx/textures/wind.bctex", + "system/fx/textures/wind_arc.bctex", +] -def test_compare_dread(dread_path): - parse_and_build_compare_parsed( - BCTEX_Dread, Game.DREAD, dread_path.joinpath("textures/system/minimap/icons/icons.bctex"), - print_data=True, - ) +@pytest.mark.parametrize("bctex_path", dread_data.all_files_ending_with(".bctex")) +def test_compare_dread(dread_file_tree, bctex_path): + parse_build_compare_editor_parsed(Bctex, dread_file_tree, bctex_path) -all_sr_bctex = [name for name in samus_returns_data.all_name_to_asset_id().keys() - if name.endswith(".bctex")] - -@pytest.mark.parametrize("bctex_path", all_sr_bctex) -def test_compare_sr(samus_returns_path, bctex_path): - parse_and_build_compare_parsed( - BCTEX_SR, Game.SAMUS_RETURNS, samus_returns_path.joinpath(bctex_path), - print_data=True, - ) +@pytest.mark.parametrize("bctex_path", samus_returns_data.all_files_ending_with(".bctex", sr_missing)) +def test_compare_sr(samus_returns_tree, bctex_path): + parse_build_compare_editor_parsed(Bctex, samus_returns_tree, bctex_path) diff --git a/tests/formats/test_blsnd.py b/tests/formats/test_blsnd.py index a4af6abe..790ca210 100644 --- a/tests/formats/test_blsnd.py +++ b/tests/formats/test_blsnd.py @@ -4,16 +4,11 @@ from mercury_engine_data_structures import dread_data, samus_returns_data from mercury_engine_data_structures.formats.blsnd import Blsnd -all_sr_blsnd = [name for name in samus_returns_data.all_name_to_asset_id().keys() - if name.endswith(".blsnd")] -all_dread_blsnd = [name for name in dread_data.all_name_to_asset_id().keys() - if name.endswith(".blsnd")] - -@pytest.mark.parametrize("blsnd_path", all_sr_blsnd) +@pytest.mark.parametrize("blsnd_path", samus_returns_data.all_files_ending_with(".blsnd")) def test_blsnd(samus_returns_tree, blsnd_path): parse_build_compare_editor(Blsnd, samus_returns_tree, blsnd_path) -@pytest.mark.parametrize("blsnd_path", all_dread_blsnd) +@pytest.mark.parametrize("blsnd_path", dread_data.all_files_ending_with(".blsnd")) def test_blsnd_dread(dread_file_tree, blsnd_path): parse_build_compare_editor(Blsnd, dread_file_tree, blsnd_path) diff --git a/tests/formats/test_bmbls.py b/tests/formats/test_bmbls.py index f8bd60ad..da29c4da 100644 --- a/tests/formats/test_bmbls.py +++ b/tests/formats/test_bmbls.py @@ -1,13 +1,10 @@ -from tests.test_lib import parse_and_build_compare +import pytest +from tests.test_lib import parse_build_compare_editor -from mercury_engine_data_structures.formats.bmbls import BMBLS -from mercury_engine_data_structures.game_check import Game +from mercury_engine_data_structures import dread_data +from mercury_engine_data_structures.formats.bmbls import Bmbls -def test_compare_dread(dread_path): - parse_and_build_compare( - BMBLS, Game.DREAD, dread_path.joinpath( - "packs/maps/s010_cave/subareas/subareapack_scorpius/actors/characters/" - "scorpius/animations/blendspaces/walktailinit.bmbls" - ) - ) +@pytest.mark.parametrize("bmbls_path", dread_data.all_files_ending_with(".bmbls")) +def test_compare_dread(dread_file_tree, bmbls_path): + parse_build_compare_editor(Bmbls, dread_file_tree, bmbls_path) diff --git a/tests/formats/test_bmdefs.py b/tests/formats/test_bmdefs.py index 495b5ce1..0d002045 100644 --- a/tests/formats/test_bmdefs.py +++ b/tests/formats/test_bmdefs.py @@ -3,5 +3,8 @@ from mercury_engine_data_structures.formats.bmdefs import Bmdefs -def test_bmdefs(samus_returns_tree): +def test_bmdefs_dread(dread_file_tree): + parse_build_compare_editor(Bmdefs, dread_file_tree, "system/snd/scenariomusicdefs.bmdefs") + +def test_bmdefs_sr(samus_returns_tree): parse_build_compare_editor(Bmdefs, samus_returns_tree, "system/snd/scenariomusicdefs.bmdefs") diff --git a/tests/formats/test_bmmap.py b/tests/formats/test_bmmap.py index 820dc7fb..da83edf9 100644 --- a/tests/formats/test_bmmap.py +++ b/tests/formats/test_bmmap.py @@ -1,22 +1,11 @@ import pytest from tests.test_lib import parse_build_compare_editor +from mercury_engine_data_structures import dread_data from mercury_engine_data_structures.formats.bmmap import Bmmap -dread_bmmap = [ - "maps/levels/c10_samus/s010_cave/s010_cave.bmmap", - "maps/levels/c10_samus/s020_magma/s020_magma.bmmap", - "maps/levels/c10_samus/s030_baselab/s030_baselab.bmmap", - "maps/levels/c10_samus/s040_aqua/s040_aqua.bmmap", - "maps/levels/c10_samus/s050_forest/s050_forest.bmmap", - "maps/levels/c10_samus/s060_quarantine/s060_quarantine.bmmap", - "maps/levels/c10_samus/s070_basesanc/s070_basesanc.bmmap", - "maps/levels/c10_samus/s080_shipyard/s080_shipyard.bmmap", - "maps/levels/c10_samus/s090_skybase/s090_skybase.bmmap", -] - -@pytest.mark.parametrize("bmmap_path", dread_bmmap) +@pytest.mark.parametrize("bmmap_path", dread_data.all_files_ending_with(".bmmap")) def test_dread_bmmap(dread_file_tree, bmmap_path): parse_build_compare_editor(Bmmap, dread_file_tree, bmmap_path) diff --git a/tests/formats/test_bmmdef.py b/tests/formats/test_bmmdef.py new file mode 100644 index 00000000..742e4d44 --- /dev/null +++ b/tests/formats/test_bmmdef.py @@ -0,0 +1,9 @@ +from tests.test_lib import parse_build_compare_editor + +from mercury_engine_data_structures.formats.bmmdef import Bmmdef + + +def test_compare_bmmdef_dread(dread_file_tree): + parse_build_compare_editor( + Bmmdef, dread_file_tree, "system/minimap/minimap.bmmdef" + ) diff --git a/tests/formats/test_bmsad.py b/tests/formats/test_bmsad.py index fdd05fa8..6c167548 100644 --- a/tests/formats/test_bmsad.py +++ b/tests/formats/test_bmsad.py @@ -9,19 +9,352 @@ from mercury_engine_data_structures.formats import dread_types from mercury_engine_data_structures.formats.bmsad import ActorDefFunc, Bmsad -all_sr_bmsad = [name for name in samus_returns_data.all_name_to_asset_id().keys() - if name.endswith(".bmsad")] - -all_dread_bmsad = [name for name in dread_data.all_name_to_asset_id().keys() - if name.endswith(".bmsad")] - expected_dread_failures = { "actors/props/pf_mushr_fr/charclasses/pf_mushr_fr.bmsad", } expected_sr_failures = set() - -@pytest.mark.parametrize("bmsad_path", all_dread_bmsad) +sr_missing = [ + "actors/items/itemsphere_springball/charclasses/itemsphere_springball.bmsad", + "actors/items/life/charclasses/life.bmsad", + "actors/items/lifebig/charclasses/lifebig.bmsad", + "actors/items/powerup_spinattack/charclasses/powerup_spinattack.bmsad", + "actors/props/doorchargeclosed/charclasses/doorchargeclosed.bmsad", + "actors/props/doorcreatureleft/charclasses/doorcreatureleft.bmsad", + "actors/props/doorcreatureright/charclasses/doorcreatureright.bmsad", + "actors/props/grapplemovable4x1/charclasses/grapplemovable4x1.bmsad", + "actors/props/heatzone/charclasses/heatzone.bmsad", + "actors/props/poisonzone/charclasses/poisonzone.bmsad", + "actors/props/unlockarea/charclasses/unlockarea.bmsad", + "actors/props/waterzone/charclasses/waterzone.bmsad", + "actors/spawnpoints/spawnpointfleechswarm/charclasses/spawnpointfleechswarm.bmsad", + "actors/weapons/energywave/charclasses/energywave.bmsad", + "cutscenes/area2cam/takes/01/actors/samus/samus.bmsad", + "cutscenes/area3cam/takes/01/actors/samus/samus.bmsad", + "cutscenes/brokenchozostatue/takes/01/actors/samus/samus.bmsad", + "cutscenes/brokenchozostatue/takes/02/actors/samus/samus.bmsad", + "cutscenes/elevator/takes/01/actors/baby/baby.bmsad", + "cutscenes/elevator/takes/01/actors/elevator/elevator.bmsad", + "cutscenes/elevator/takes/01/actors/samus/samus.bmsad", + "cutscenes/elevator/takes/02/actors/baby/baby.bmsad", + "cutscenes/elevator/takes/02/actors/elevator/elevator.bmsad", + "cutscenes/elevator/takes/02/actors/samus/samus.bmsad", + "cutscenes/elevator/takes/03/actors/baby/baby.bmsad", + "cutscenes/elevator/takes/03/actors/elevator/elevator.bmsad", + "cutscenes/elevator/takes/03/actors/samus/samus.bmsad", + "cutscenes/elevator/takes/04/actors/baby/baby.bmsad", + "cutscenes/elevator/takes/04/actors/elevator/elevator.bmsad", + "cutscenes/elevator/takes/04/actors/samus/samus.bmsad", + "cutscenes/energyshield/takes/01/actors/morphball/morphball.bmsad", + "cutscenes/energyshield/takes/01/actors/samus/samus.bmsad", + "cutscenes/energyshield/takes/01/actors/statue/statue.bmsad", + "cutscenes/energywave/takes/01/actors/morphball/morphball.bmsad", + "cutscenes/energywave/takes/01/actors/samus/samus.bmsad", + "cutscenes/energywave/takes/01/actors/statue/statue.bmsad", + "cutscenes/firstchozostatue/takes/01/actors/samus/samus.bmsad", + "cutscenes/gravitysuit/takes/01/actors/planefade/planefade.bmsad", + "cutscenes/gravitysuit/takes/01/actors/samusvaria/samusvaria.bmsad", + "cutscenes/gravitysuit/takes/02/actors/planefade/planefade.bmsad", + "cutscenes/gravitysuit/takes/02/actors/samus/samus.bmsad", + "cutscenes/gravitysuit/takes/03/actors/samus/samus.bmsad", + "cutscenes/gravitysuit/takes/04/actors/samus/samus.bmsad", + "cutscenes/gravitysuit/takes/05/actors/samus/samus.bmsad", + "cutscenes/introalpha/takes/01/actors/metroid/metroid.bmsad", + "cutscenes/introalpha/takes/01/actors/samus/samus.bmsad", + "cutscenes/introalpha/takes/02/actors/samus/samus.bmsad", + "cutscenes/introalpha/takes/03/actors/alpha/alpha.bmsad", + "cutscenes/introalpha/takes/03/actors/larvacocoon/larvacocoon.bmsad", + "cutscenes/introalpha/takes/03/actors/samus/samus.bmsad", + "cutscenes/introdnastatue/takes/01/actors/samus/samus.bmsad", + "cutscenes/introgamma/takes/01/actors/alphacocoon/alphacocoon.bmsad", + "cutscenes/introgamma/takes/01/actors/gamma/gamma.bmsad", + "cutscenes/introgamma/takes/01/actors/gammalight/gammalight.bmsad", + "cutscenes/introgamma/takes/01/actors/samus/samus.bmsad", + "cutscenes/intromanicminerbotarea3/takes/01/actors/demolish/demolish.bmsad", + "cutscenes/intromanicminerbotarea3/takes/01/actors/manicminerbot/manicminerbot.bmsad", + "cutscenes/intromanicminerbotarea3/takes/01/actors/samus/samus.bmsad", + "cutscenes/intromanicminerbotchase/takes/01/actors/manicminerbothidden/manicminerbothidden.bmsad", + "cutscenes/intromanicminerbotchase/takes/01/actors/samus/samus.bmsad", + "cutscenes/intromanicminerbotchase/takes/01/actors/wall/wall.bmsad", + "cutscenes/intromanicminerbotchaseph/takes/01/actors/manicminerbothidden/manicminerbothidden.bmsad", + "cutscenes/intromanicminerbotchaseph/takes/01/actors/samus/samus.bmsad", + "cutscenes/intrometroidboss/takes/01/actors/metroidboss/metroidboss.bmsad", + "cutscenes/intrometroidboss/takes/01/actors/samus/samus.bmsad", + "cutscenes/intrometroidlarvasurface/takes/01/actors/hornoad/hornoad.bmsad", + "cutscenes/intrometroidlarvasurface/takes/01/actors/metroid/metroid.bmsad", + "cutscenes/intrometroidlarvasurface/takes/01/actors/samus/samus.bmsad", + "cutscenes/introomega/takes/10/actors/omega/omega.bmsad", + "cutscenes/introomega/takes/10/actors/samus/samus.bmsad", + "cutscenes/introomega/takes/10/actors/zetacocoon/zetacocoon.bmsad", + "cutscenes/introqueen/takes/01/actors/background/background.bmsad", + "cutscenes/introqueen/takes/01/actors/queen/queen.bmsad", + "cutscenes/introqueen/takes/01/actors/samus/samus.bmsad", + "cutscenes/introqueen/takes/02/actors/background/background.bmsad", + "cutscenes/introqueen/takes/02/actors/queen/queen.bmsad", + "cutscenes/introqueen/takes/02/actors/samus/samus.bmsad", + "cutscenes/introqueen/takes/03/actors/queen/queen.bmsad", + "cutscenes/introqueen/takes/03/actors/samus/samus.bmsad", + "cutscenes/introspenergystatue/takes/01/actors/samus/samus.bmsad", + "cutscenes/introteleporter/takes/01/actors/samus/samus.bmsad", + "cutscenes/introteleporterarea01/takes/01/actors/platform/platform.bmsad", + "cutscenes/introteleporterarea01/takes/01/actors/samus/samus.bmsad", + "cutscenes/introteleporterarea01/takes/01/actors/teleporter/teleporter.bmsad", + "cutscenes/introteleporterarea01/takes/02/actors/platform/platform.bmsad", + "cutscenes/introteleporterarea01/takes/02/actors/samus/samus.bmsad", + "cutscenes/introteleporterarea01/takes/02/actors/teleporter/teleporter.bmsad", + "cutscenes/introteleporterarea01/takes/03/actors/platform/platform.bmsad", + "cutscenes/introteleporterarea01/takes/03/actors/samus/samus.bmsad", + "cutscenes/introteleporterarea01/takes/03/actors/teleporter/teleporter.bmsad", + "cutscenes/introzeta/takes/01/actors/gammacocoon/gammacocoon.bmsad", + "cutscenes/introzeta/takes/01/actors/samus/samus.bmsad", + "cutscenes/introzeta/takes/02/actors/samus/samus.bmsad", + "cutscenes/introzeta/takes/02/actors/zeta/zeta.bmsad", + "cutscenes/manicminerbotchaseend/takes/01/actors/itemspacejump/itemspacejump.bmsad", + "cutscenes/manicminerbotchaseend/takes/01/actors/manicminerbothidden/manicminerbothidden.bmsad", + "cutscenes/manicminerbotchaseend/takes/01/actors/morphball/morphball.bmsad", + "cutscenes/manicminerbotchaseend/takes/01/actors/mouthrocks/mouthrocks.bmsad", + "cutscenes/manicminerbotchaseend/takes/01/actors/wall/wall.bmsad", + "cutscenes/manicminerbotdeath/takes/01/actors/itemsphere/itemsphere.bmsad", + "cutscenes/manicminerbotdeath/takes/01/actors/manicbrokenface/manicbrokenface.bmsad", + "cutscenes/manicminerbotdeath/takes/01/actors/manicminerbot/manicminerbot.bmsad", + "cutscenes/manicminerbotdeath/takes/01/actors/samus/samus.bmsad", + "cutscenes/manicminerbotdeath/takes/01/actors/wall/wall.bmsad", + "cutscenes/manicminerbotfinalbattle/takes/01/actors/manicdoors/manicdoors.bmsad", + "cutscenes/manicminerbotfinalbattle/takes/01/actors/manicminerbot/manicminerbot.bmsad", + "cutscenes/manicminerbotfinalbattle/takes/01/actors/robotsmallworking01/robotsmallworking01.bmsad", + "cutscenes/manicminerbotfinalbattle/takes/01/actors/robotsmallworking02/robotsmallworking02.bmsad", + "cutscenes/manicminerbotfinalbattle/takes/01/actors/robotsmallworking03/robotsmallworking03.bmsad", + "cutscenes/manicminerbotfinalbattle/takes/01/actors/samus/samus.bmsad", + "cutscenes/manicminerbotfinalbattle/takes/02/actors/manicvisor/manicvisor.bmsad", + "cutscenes/manicminerbotfinalbattle/takes/02/actors/samus/samus.bmsad", + "cutscenes/manicminerbotfinalbattle/takes/03/actors/manicminerbot/manicminerbot.bmsad", + "cutscenes/manicminerbotfinalbattle/takes/03/actors/samus/samus.bmsad", + "cutscenes/manicminerbotfinalbattle/takes/04/actors/manicminerbot/manicminerbot.bmsad", + "cutscenes/manicminerbotfinalbattle/takes/05/actors/manicminerbot/manicminerbot.bmsad", + "cutscenes/manicminerbotfinalbattle/takes/05/actors/samus/samus.bmsad", + "cutscenes/manicminerbotstealorb/takes/01/actors/manicminerbot/manicminerbot.bmsad", + "cutscenes/manicminerbotstealorb/takes/01/actors/samus/samus.bmsad", + "cutscenes/manicminerbotstealorb/takes/01/actors/sand/sand.bmsad", + "cutscenes/manicminerbotstealorb/takes/01/actors/statueorb/statueorb.bmsad", + "cutscenes/meleetuto/takes/01/actors/gullugg/gullugg.bmsad", + "cutscenes/meleetuto/takes/01/actors/samus/samus.bmsad", + "cutscenes/meleetuto/takes/02/actors/gullugg/gullugg.bmsad", + "cutscenes/meleetuto/takes/02/actors/samus/samus.bmsad", + "cutscenes/meleetuto/takes/03/actors/gullugg/gullugg.bmsad", + "cutscenes/meleetuto/takes/03/actors/samus/samus.bmsad", + "cutscenes/metroidhatchlingintro/takes/01/actors/babyhatchlingsmall/babyhatchlingsmall.bmsad", + "cutscenes/metroidhatchlingintro/takes/01/actors/hatchlingeggbroken/hatchlingeggbroken.bmsad", + "cutscenes/metroidhatchlingintro/takes/01/actors/samus/samus.bmsad", + "cutscenes/metroidhatchlingintro/takes/20/actors/babyhatchlingsmall/babyhatchlingsmall.bmsad", + "cutscenes/metroidhatchlingintro/takes/20/actors/background/background.bmsad", + "cutscenes/metroidhatchlingintro/takes/20/actors/hatchlingeggbroken/hatchlingeggbroken.bmsad", + "cutscenes/metroidhatchlingintro/takes/20/actors/samus/samus.bmsad", + "cutscenes/metroidhatchlingintro/takes/25/actors/babyhatchlingsmall/babyhatchlingsmall.bmsad", + "cutscenes/metroidhatchlingintro/takes/25/actors/hatchlingeggbroken/hatchlingeggbroken.bmsad", + "cutscenes/metroidhatchlingintro/takes/25/actors/samus/samus.bmsad", + "cutscenes/metroidhatchlingintro/takes/30/actors/babyhatchlingsmall/babyhatchlingsmall.bmsad", + "cutscenes/metroidhatchlingintro/takes/30/actors/background/background.bmsad", + "cutscenes/metroidhatchlingintro/takes/30/actors/hatchlingeggbroken/hatchlingeggbroken.bmsad", + "cutscenes/metroidhatchlingintro/takes/30/actors/samus/samus.bmsad", + "cutscenes/metroidhatchlingintro/takes/40/actors/babyhatchlingsmall/babyhatchlingsmall.bmsad", + "cutscenes/metroidhatchlingintro/takes/40/actors/samus/samus.bmsad", + "cutscenes/metroidhatchlingintro/takes/40/actors/samushd/samushd.bmsad", + "cutscenes/metroidhatchlingintro/takes/40/actors/samusnoskin/samusnoskin.bmsad", + "cutscenes/metroidhatchlingintro/takes/50/actors/babyhatchlingsmall/babyhatchlingsmall.bmsad", + "cutscenes/metroidhatchlingintro/takes/50/actors/samus/samus.bmsad", + "cutscenes/metroidhatchlingintro/takes/50/actors/samusvisor/samusvisor.bmsad", + "cutscenes/metroidhatchlingintro/takes/60/actors/babyhatchlingsmall/babyhatchlingsmall.bmsad", + "cutscenes/metroidhatchlingintro/takes/60/actors/samus/samus.bmsad", + "cutscenes/metroidhatchlingintro/takes/60/actors/samushd/samushd.bmsad", + "cutscenes/metroidhatchlingintro/takes/70/actors/babyhatchling/babyhatchling.bmsad", + "cutscenes/metroidhatchlingintro/takes/70/actors/babyhatchlingsmall/babyhatchlingsmall.bmsad", + "cutscenes/metroidhatchlingintro/takes/70/actors/samus/samus.bmsad", + "cutscenes/metroidqueendeath/takes/01/actors/background/background.bmsad", + "cutscenes/metroidqueendeath/takes/01/actors/background2/background2.bmsad", + "cutscenes/metroidqueendeath/takes/01/actors/background3/background3.bmsad", + "cutscenes/metroidqueendeath/takes/01/actors/morphball/morphball.bmsad", + "cutscenes/metroidqueendeath/takes/01/actors/queen/queen.bmsad", + "cutscenes/metroidqueendeath/takes/01/actors/samus/samus.bmsad", + "cutscenes/metroidqueendeathpowerbomb/takes/01/actors/morphball/morphball.bmsad", + "cutscenes/metroidqueendeathpowerbomb/takes/01/actors/queen/queen.bmsad", + "cutscenes/metroidqueendeathpowerbomb/takes/01/actors/samus/samus.bmsad", + "cutscenes/metroidqueenspit/takes/01/actors/morphball/morphball.bmsad", + "cutscenes/metroidqueenspit/takes/01/actors/queen/queen.bmsad", + "cutscenes/metroidqueenspitpowerbomb/takes/01/actors/morphball/morphball.bmsad", + "cutscenes/metroidqueenspitpowerbomb/takes/01/actors/queen/queen.bmsad", + "cutscenes/phasedisplacement/takes/01/actors/morphball/morphball.bmsad", + "cutscenes/phasedisplacement/takes/01/actors/samus/samus.bmsad", + "cutscenes/phasedisplacement/takes/01/actors/statue/statue.bmsad", + "cutscenes/planetarrival/takes/10/actors/planet/planet.bmsad", + "cutscenes/planetarrival/takes/10/actors/shipsmall/shipsmall.bmsad", + "cutscenes/planetarrival/takes/20/actors/cloudssurface/cloudssurface.bmsad", + "cutscenes/planetarrival/takes/20/actors/shipcutscene/shipcutscene.bmsad", + "cutscenes/planetarrival/takes/30/actors/shipcutscene/shipcutscene.bmsad", + "cutscenes/planetarrival/takes/31/actors/samus/samus.bmsad", + "cutscenes/postcredits/takes/10/actors/hornoad/hornoad.bmsad", + "cutscenes/postcredits/takes/10/actors/hornoadmimic/hornoadmimic.bmsad", + "cutscenes/postcredits/takes/10/actors/plants/plants.bmsad", + "cutscenes/postcredits/takes/10/actors/ridleyhand/ridleyhand.bmsad", + "cutscenes/postcredits/takes/10/actors/xparasite/xparasite.bmsad", + "cutscenes/ridley1/takes/10/actors/baby/baby.bmsad", + "cutscenes/ridley1/takes/10/actors/gunship/gunship.bmsad", + "cutscenes/ridley1/takes/10/actors/ridleyfloor/ridleyfloor.bmsad", + "cutscenes/ridley1/takes/10/actors/samus/samus.bmsad", + "cutscenes/ridley1/takes/10/actors/surfaceplatform/surfaceplatform.bmsad", + "cutscenes/ridley1/takes/20/actors/baby/baby.bmsad", + "cutscenes/ridley1/takes/20/actors/rays/rays.bmsad", + "cutscenes/ridley1/takes/20/actors/ridleystormcs1/ridleystormcs1.bmsad", + "cutscenes/ridley1/takes/20/actors/samus/samus.bmsad", + "cutscenes/ridley1/takes/30/actors/baby/baby.bmsad", + "cutscenes/ridley1/takes/30/actors/gunship/gunship.bmsad", + "cutscenes/ridley1/takes/30/actors/ridleyfloor/ridleyfloor.bmsad", + "cutscenes/ridley1/takes/30/actors/samus/samus.bmsad", + "cutscenes/ridley1/takes/30/actors/surfaceplatform/surfaceplatform.bmsad", + "cutscenes/ridley1/takes/40/actors/baby/baby.bmsad", + "cutscenes/ridley1/takes/40/actors/gunship/gunship.bmsad", + "cutscenes/ridley1/takes/40/actors/rays/rays.bmsad", + "cutscenes/ridley1/takes/40/actors/ridley/ridley.bmsad", + "cutscenes/ridley1/takes/50/actors/samus/samus.bmsad", + "cutscenes/ridley1/takes/60/actors/baby/baby.bmsad", + "cutscenes/ridley1/takes/60/actors/gunship/gunship.bmsad", + "cutscenes/ridley1/takes/60/actors/hurricane/hurricane.bmsad", + "cutscenes/ridley1/takes/60/actors/ridley/ridley.bmsad", + "cutscenes/ridley1/takes/60/actors/samus/samus.bmsad", + "cutscenes/ridley2/takes/10/actors/baby/baby.bmsad", + "cutscenes/ridley2/takes/10/actors/ridley/ridley.bmsad", + "cutscenes/ridley2/takes/10/actors/samus/samus.bmsad", + "cutscenes/ridley2/takes/100/actors/ridley/ridley.bmsad", + "cutscenes/ridley2/takes/100/actors/rockswall/rockswall.bmsad", + "cutscenes/ridley2/takes/110/actors/babysmall/babysmall.bmsad", + "cutscenes/ridley2/takes/110/actors/gunship/gunship.bmsad", + "cutscenes/ridley2/takes/110/actors/samus/samus.bmsad", + "cutscenes/ridley2/takes/115/actors/babysmall/babysmall.bmsad", + "cutscenes/ridley2/takes/115/actors/gunship/gunship.bmsad", + "cutscenes/ridley2/takes/115/actors/ridley/ridley.bmsad", + "cutscenes/ridley2/takes/115/actors/rocks/rocks.bmsad", + "cutscenes/ridley2/takes/115/actors/samus/samus.bmsad", + "cutscenes/ridley2/takes/120/actors/baby/baby.bmsad", + "cutscenes/ridley2/takes/120/actors/gunship/gunship.bmsad", + "cutscenes/ridley2/takes/120/actors/ridleyhead/ridleyhead.bmsad", + "cutscenes/ridley2/takes/120/actors/rocks/rocks.bmsad", + "cutscenes/ridley2/takes/120/actors/samus/samus.bmsad", + "cutscenes/ridley2/takes/130/actors/babysmall/babysmall.bmsad", + "cutscenes/ridley2/takes/130/actors/gunship/gunship.bmsad", + "cutscenes/ridley2/takes/130/actors/ridley/ridley.bmsad", + "cutscenes/ridley2/takes/130/actors/rocks/rocks.bmsad", + "cutscenes/ridley2/takes/130/actors/samus/samus.bmsad", + "cutscenes/ridley2/takes/140/actors/samus/samus.bmsad", + "cutscenes/ridley2/takes/150/actors/ridley/ridley.bmsad", + "cutscenes/ridley2/takes/150/actors/samus/samus.bmsad", + "cutscenes/ridley2/takes/20/actors/baby/baby.bmsad", + "cutscenes/ridley2/takes/20/actors/ridley/ridley.bmsad", + "cutscenes/ridley2/takes/20/actors/samus/samus.bmsad", + "cutscenes/ridley2/takes/30/actors/baby/baby.bmsad", + "cutscenes/ridley2/takes/30/actors/ridley/ridley.bmsad", + "cutscenes/ridley2/takes/30/actors/samus/samus.bmsad", + "cutscenes/ridley2/takes/40/actors/ridley/ridley.bmsad", + "cutscenes/ridley2/takes/50/actors/baby/baby.bmsad", + "cutscenes/ridley2/takes/50/actors/ridley/ridley.bmsad", + "cutscenes/ridley2/takes/50/actors/samus/samus.bmsad", + "cutscenes/ridley2/takes/60/actors/ridley/ridley.bmsad", + "cutscenes/ridley2/takes/70/actors/baby/baby.bmsad", + "cutscenes/ridley2/takes/70/actors/ridley/ridley.bmsad", + "cutscenes/ridley2/takes/80/actors/baby/baby.bmsad", + "cutscenes/ridley2/takes/80/actors/ridley/ridley.bmsad", + "cutscenes/ridley2/takes/80/actors/samus/samus.bmsad", + "cutscenes/ridley2/takes/90/actors/ridley/ridley.bmsad", + "cutscenes/ridley2/takes/90/actors/rockswall/rockswall.bmsad", + "cutscenes/ridley3/takes/10/actors/ridley/ridley.bmsad", + "cutscenes/ridley3/takes/100/actors/baby/baby.bmsad", + "cutscenes/ridley3/takes/100/actors/gunship/gunship.bmsad", + "cutscenes/ridley3/takes/100/actors/ridley/ridley.bmsad", + "cutscenes/ridley3/takes/100/actors/samus/samus.bmsad", + "cutscenes/ridley3/takes/110/actors/baby/baby.bmsad", + "cutscenes/ridley3/takes/110/actors/gunship/gunship.bmsad", + "cutscenes/ridley3/takes/110/actors/ridley/ridley.bmsad", + "cutscenes/ridley3/takes/110/actors/samus/samus.bmsad", + "cutscenes/ridley3/takes/120/actors/baby/baby.bmsad", + "cutscenes/ridley3/takes/120/actors/ridley/ridley.bmsad", + "cutscenes/ridley3/takes/140/actors/baby/baby.bmsad", + "cutscenes/ridley3/takes/140/actors/gunship/gunship.bmsad", + "cutscenes/ridley3/takes/140/actors/ridley/ridley.bmsad", + "cutscenes/ridley3/takes/140/actors/samus/samus.bmsad", + "cutscenes/ridley3/takes/20/actors/baby/baby.bmsad", + "cutscenes/ridley3/takes/20/actors/gunship/gunship.bmsad", + "cutscenes/ridley3/takes/20/actors/ridley/ridley.bmsad", + "cutscenes/ridley3/takes/20/actors/samus/samus.bmsad", + "cutscenes/ridley3/takes/30/actors/ridley/ridley.bmsad", + "cutscenes/ridley3/takes/30/actors/samus/samus.bmsad", + "cutscenes/ridley3/takes/40/actors/ridley/ridley.bmsad", + "cutscenes/ridley3/takes/40/actors/samus/samus.bmsad", + "cutscenes/ridley3/takes/50/actors/baby/baby.bmsad", + "cutscenes/ridley3/takes/50/actors/gunship/gunship.bmsad", + "cutscenes/ridley3/takes/50/actors/rays/rays.bmsad", + "cutscenes/ridley3/takes/50/actors/ridley/ridley.bmsad", + "cutscenes/ridley3/takes/50/actors/samus/samus.bmsad", + "cutscenes/ridley3/takes/60/actors/ridley/ridley.bmsad", + "cutscenes/ridley3/takes/60/actors/ridleyhand/ridleyhand.bmsad", + "cutscenes/ridley3/takes/60/actors/samus/samus.bmsad", + "cutscenes/ridley3/takes/70/actors/baby/baby.bmsad", + "cutscenes/ridley3/takes/70/actors/gunship/gunship.bmsad", + "cutscenes/ridley3/takes/70/actors/ridley/ridley.bmsad", + "cutscenes/ridley3/takes/70/actors/samus/samus.bmsad", + "cutscenes/ridley3/takes/80/actors/baby/baby.bmsad", + "cutscenes/ridley3/takes/80/actors/gunship/gunship.bmsad", + "cutscenes/ridley3/takes/80/actors/ridley/ridley.bmsad", + "cutscenes/ridley3/takes/90/actors/ridley/ridley.bmsad", + "cutscenes/ridley3/takes/90/actors/ridleyhand/ridleyhand.bmsad", + "cutscenes/ridley3/takes/90/actors/samus/samus.bmsad", + "cutscenes/ridley4/takes/10/actors/ridley/ridley.bmsad", + "cutscenes/ridley4/takes/10/actors/samus/samus.bmsad", + "cutscenes/ridley4/takes/20/actors/baby/baby.bmsad", + "cutscenes/ridley4/takes/20/actors/ridley/ridley.bmsad", + "cutscenes/ridley4/takes/20/actors/samus/samus.bmsad", + "cutscenes/ridley4/takes/20/actors/ship/ship.bmsad", + "cutscenes/ridley4/takes/30/actors/baby/baby.bmsad", + "cutscenes/ridley4/takes/30/actors/ridley/ridley.bmsad", + "cutscenes/ridley4/takes/30/actors/samus/samus.bmsad", + "cutscenes/ridley4/takes/30/actors/ship/ship.bmsad", + "cutscenes/ridley4/takes/40/actors/baby/baby.bmsad", + "cutscenes/ridley4/takes/40/actors/ridley/ridley.bmsad", + "cutscenes/ridley4/takes/40/actors/samus/samus.bmsad", + "cutscenes/ridley4/takes/40/actors/ship/ship.bmsad", + "cutscenes/ridley4/takes/50/actors/ship/ship.bmsad", + "cutscenes/ridley4/takes/60/actors/baby/baby.bmsad", + "cutscenes/ridley4/takes/60/actors/planet/planet.bmsad", + "cutscenes/ridley4/takes/60/actors/samus/samus.bmsad", + "cutscenes/ridley4/takes/60/actors/shipinterior/shipinterior.bmsad", + "cutscenes/ridley4/takes/70/actors/planet/planet.bmsad", + "cutscenes/ridley4/takes/70/actors/shipsmall/shipsmall.bmsad", + "cutscenes/ridleydrained/takes/01/actors/baby/baby.bmsad", + "cutscenes/ridleydrained/takes/01/actors/ridley/ridley.bmsad", + "cutscenes/ridleydrained/takes/01/actors/samus/samus.bmsad", + "cutscenes/ridleydrained/takes/02/actors/baby/baby.bmsad", + "cutscenes/ridleydrained/takes/02/actors/ridley/ridley.bmsad", + "cutscenes/ridleydrained/takes/02/actors/samus/samus.bmsad", + "cutscenes/ridleydrained/takes/03/actors/baby/baby.bmsad", + "cutscenes/ridleydrained/takes/03/actors/ridley/ridley.bmsad", + "cutscenes/ridleydrained/takes/03/actors/samus/samus.bmsad", + "cutscenes/ridleydrained/takes/04/actors/baby/baby.bmsad", + "cutscenes/ridleydrained/takes/04/actors/ridley/ridley.bmsad", + "cutscenes/ridleydrained/takes/04/actors/samus/samus.bmsad", + "cutscenes/scaningpulse/takes/01/actors/morphball/morphball.bmsad", + "cutscenes/scaningpulse/takes/01/actors/samus/samus.bmsad", + "cutscenes/scaningpulse/takes/01/actors/statue/statue.bmsad", + "cutscenes/teleporter/takes/01/actors/baby/baby.bmsad", + "cutscenes/teleporter/takes/01/actors/samus/samus.bmsad", + "cutscenes/teleporter/takes/01/actors/teleporter/teleporter.bmsad", + "cutscenes/tunel/takes/01/actors/morphball/morphball.bmsad", + "cutscenes/variasuit/takes/01/actors/planefade/planefade.bmsad", + "cutscenes/variasuit/takes/01/actors/samuspower/samuspower.bmsad", + "cutscenes/variasuit/takes/02/actors/planefade/planefade.bmsad", + "cutscenes/variasuit/takes/02/actors/samus/samus.bmsad", + "cutscenes/variasuit/takes/03/actors/samus/samus.bmsad", + "cutscenes/variasuit/takes/04/actors/samus/samus.bmsad", + "cutscenes/variasuit/takes/05/actors/samus/samus.bmsad", +] + +@pytest.mark.parametrize("bmsad_path", dread_data.all_files_ending_with(".bmsad")) def test_compare_dread_all(dread_file_tree, bmsad_path): if bmsad_path in expected_dread_failures: expectation = pytest.raises(construct.ConstructError) @@ -34,20 +367,9 @@ def test_compare_dread_all(dread_file_tree, bmsad_path): ) -@pytest.mark.parametrize("bmsad_path", all_sr_bmsad) +@pytest.mark.parametrize("bmsad_path", samus_returns_data.all_files_ending_with(".bmsad", sr_missing)) def test_compare_sr_all(samus_returns_tree, bmsad_path): - if not samus_returns_tree.does_asset_exists(bmsad_path): - return pytest.skip() - - if bmsad_path in expected_sr_failures: - expectation = pytest.raises(construct.core.ConstError) - else: - expectation = contextlib.nullcontext() - - with expectation: - parse_build_compare_editor( - Bmsad, samus_returns_tree, bmsad_path - ) + parse_build_compare_editor(Bmsad, samus_returns_tree, bmsad_path) def test_api_dread_actordef(dread_file_tree: FileTreeEditor): diff --git a/tests/formats/test_bmsas.py b/tests/formats/test_bmsas.py index 0dc4cc9a..d2357238 100644 --- a/tests/formats/test_bmsas.py +++ b/tests/formats/test_bmsas.py @@ -4,10 +4,7 @@ from mercury_engine_data_structures import dread_data from mercury_engine_data_structures.formats.bmsas import Bmsas -all_dread_bmsas = [name for name in dread_data.all_name_to_asset_id().keys() - if name.endswith(".bmsas")] - -@pytest.mark.parametrize("bmsas_path", all_dread_bmsas) +@pytest.mark.parametrize("bmsas_path", dread_data.all_files_ending_with(".bmsas")) def test_bmsas(dread_file_tree, bmsas_path): parse_build_compare_editor(Bmsas, dread_file_tree, bmsas_path) diff --git a/tests/formats/test_bmsbk.py b/tests/formats/test_bmsbk.py index edc9be57..bbc5acf5 100644 --- a/tests/formats/test_bmsbk.py +++ b/tests/formats/test_bmsbk.py @@ -4,13 +4,13 @@ from mercury_engine_data_structures import samus_returns_data from mercury_engine_data_structures.formats.bmsbk import Bmsbk -all_sr_bmsbk = [name for name in samus_returns_data.all_name_to_asset_id().keys() - if name.endswith(".bmsbk")] +sr_missing = [ + "maps/levels/c10_samus/s908_manicminerbotrun/s908_manicminerbotrun.bmsbk", + "maps/levels/c10_samus/s910_gym/s910_gym.bmsbk", + "maps/levels/c10_samus/s911_swarmgym/s911_swarmgym.bmsbk", + "maps/levels/c10_samus/s920_traininggallery/s920_traininggallery.bmsbk", +] - -@pytest.mark.parametrize("bmsbk_path", all_sr_bmsbk) +@pytest.mark.parametrize("bmsbk_path", samus_returns_data.all_files_ending_with(".bmsbk", sr_missing)) def test_bmsbk(samus_returns_tree, bmsbk_path): - try: - parse_build_compare_editor(Bmsbk, samus_returns_tree, bmsbk_path) - except FileNotFoundError: - pytest.skip(f"{bmsbk_path} does not exist") + parse_build_compare_editor(Bmsbk, samus_returns_tree, bmsbk_path) diff --git a/tests/formats/test_bmscu.py b/tests/formats/test_bmscu.py index 60f0f72b..5ec7bc83 100644 --- a/tests/formats/test_bmscu.py +++ b/tests/formats/test_bmscu.py @@ -1,10 +1,10 @@ +import pytest from tests.test_lib import parse_build_compare_editor +from mercury_engine_data_structures import dread_data from mercury_engine_data_structures.formats.bmscu import Bmscu -def test_compare_dread(dread_file_tree): - parse_build_compare_editor( - Bmscu, dread_file_tree, - "cutscenes/0037emmycaveappears/0037emmycaveappears.bmscu" - ) +@pytest.mark.parametrize("bmscu_path", dread_data.all_files_ending_with(".bmscu")) +def test_compare_dread(dread_file_tree, bmscu_path): + parse_build_compare_editor(Bmscu, dread_file_tree, bmscu_path) diff --git a/tests/formats/test_bmsem.py b/tests/formats/test_bmsem.py index 9e91de71..25a246f5 100644 --- a/tests/formats/test_bmsem.py +++ b/tests/formats/test_bmsem.py @@ -4,9 +4,7 @@ from mercury_engine_data_structures import samus_returns_data from mercury_engine_data_structures.formats.bmsem import Bmsem -all_sr_bmsmsd = [name for name in samus_returns_data.all_name_to_asset_id().keys() - if name.endswith(".bmsem")] -@pytest.mark.parametrize("bmsmsd_path", all_sr_bmsmsd) -def test_bmsem(samus_returns_tree, bmsmsd_path): - parse_build_compare_editor(Bmsem, samus_returns_tree, bmsmsd_path, print_data=True) +@pytest.mark.parametrize("bmsem_path", samus_returns_data.all_files_ending_with(".bmsem")) +def test_bmsem(samus_returns_tree, bmsem_path): + parse_build_compare_editor(Bmsem, samus_returns_tree, bmsem_path, print_data=True) diff --git a/tests/formats/test_bmses.py b/tests/formats/test_bmses.py index 880d6851..b60ba854 100644 --- a/tests/formats/test_bmses.py +++ b/tests/formats/test_bmses.py @@ -4,10 +4,7 @@ from mercury_engine_data_structures import samus_returns_data from mercury_engine_data_structures.formats.bmses import Bmses -all_sr_bmses = [name for name in samus_returns_data.all_name_to_asset_id().keys() - if name.endswith(".bmses")] - -@pytest.mark.parametrize("bmses_path", all_sr_bmses) +@pytest.mark.parametrize("bmses_path", samus_returns_data.all_files_ending_with(".bmses")) def test_bmses(samus_returns_tree, bmses_path): parse_build_compare_editor(Bmses, samus_returns_tree, bmses_path) diff --git a/tests/formats/test_bmsld.py b/tests/formats/test_bmsld.py index e672c4f2..d4f3638e 100644 --- a/tests/formats/test_bmsld.py +++ b/tests/formats/test_bmsld.py @@ -1,36 +1,30 @@ import pytest from tests.test_lib import parse_build_compare_editor +from mercury_engine_data_structures import samus_returns_data from mercury_engine_data_structures.formats.bmsld import Bmsld -all_bmsld = [ - "maps/levels/c10_samus/s000_surface/s000_surface.bmsld", - "maps/levels/c10_samus/s010_area1/s010_area1.bmsld", - "maps/levels/c10_samus/s020_area2/s020_area2.bmsld", - "maps/levels/c10_samus/s025_area2b/s025_area2b.bmsld", - "maps/levels/c10_samus/s028_area2c/s028_area2c.bmsld", - "maps/levels/c10_samus/s030_area3/s030_area3.bmsld", - "maps/levels/c10_samus/s033_area3b/s033_area3b.bmsld", - "maps/levels/c10_samus/s036_area3c/s036_area3c.bmsld", - "maps/levels/c10_samus/s040_area4/s040_area4.bmsld", - "maps/levels/c10_samus/s050_area5/s050_area5.bmsld", - "maps/levels/c10_samus/s060_area6/s060_area6.bmsld", - "maps/levels/c10_samus/s065_area6b/s065_area6b.bmsld", - "maps/levels/c10_samus/s067_area6c/s067_area6c.bmsld", - "maps/levels/c10_samus/s070_area7/s070_area7.bmsld", - "maps/levels/c10_samus/s090_area9/s090_area9.bmsld", - "maps/levels/c10_samus/s090_area9/s090_area9.bmsld", - "maps/levels/c10_samus/s100_area10/s100_area10.bmsld", - "maps/levels/c10_samus/s110_surfaceb/s110_surfaceb.bmsld", - +sr_missing = [ + "maps/levels/c10_samus/s901_alpha/s901_alpha.bmsld", + "maps/levels/c10_samus/s902_gamma/s902_gamma.bmsld", + "maps/levels/c10_samus/s903_zeta/s903_zeta.bmsld", + "maps/levels/c10_samus/s904_omega/s904_omega.bmsld", + "maps/levels/c10_samus/s905_arachnus/s905_arachnus.bmsld", + "maps/levels/c10_samus/s905_queen/s905_queen.bmsld", + "maps/levels/c10_samus/s906_metroid/s906_metroid.bmsld", + "maps/levels/c10_samus/s907_manicminerbot/s907_manicminerbot.bmsld", + "maps/levels/c10_samus/s908_manicminerbotrun/s908_manicminerbotrun.bmsld", + "maps/levels/c10_samus/s909_ridley/s909_ridley.bmsld", + "maps/levels/c10_samus/s910_gym/s910_gym.bmsld", + "maps/levels/c10_samus/s911_swarmgym/s911_swarmgym.bmsld", + "maps/levels/c10_samus/s920_traininggallery/s920_traininggallery.bmsld", ] - @pytest.fixture() def surface_bmsld(samus_returns_tree) -> Bmsld: - return samus_returns_tree.get_parsed_asset(all_bmsld[0], type_hint=Bmsld) + return samus_returns_tree.get_parsed_asset("maps/levels/c10_samus/s000_surface/s000_surface.bmsld", type_hint=Bmsld) -@pytest.mark.parametrize("bmsld_path", all_bmsld) +@pytest.mark.parametrize("bmsld_path", samus_returns_data.all_files_ending_with(".bmsld", sr_missing)) def test_bmsld(samus_returns_tree, bmsld_path): parse_build_compare_editor(Bmsld, samus_returns_tree, bmsld_path) diff --git a/tests/formats/test_bmsmd.py b/tests/formats/test_bmsmd.py index 09b9c52d..8a293e57 100644 --- a/tests/formats/test_bmsmd.py +++ b/tests/formats/test_bmsmd.py @@ -1,9 +1,10 @@ +import pytest from tests.test_lib import parse_build_compare_editor +from mercury_engine_data_structures import samus_returns_data from mercury_engine_data_structures.formats.bmsmd import Bmsmd -def test_bmsmd(samus_returns_tree): - parse_build_compare_editor( - Bmsmd, samus_returns_tree, r"gui/minimaps/c10_samus.bmsmd" - ) +@pytest.mark.parametrize("bmsmd_path", samus_returns_data.all_files_ending_with(".bmsmd")) +def test_bmsmd(samus_returns_tree, bmsmd_path): + parse_build_compare_editor(Bmsmd, samus_returns_tree, bmsmd_path) diff --git a/tests/formats/test_bmsmsd.py b/tests/formats/test_bmsmsd.py index e51e6385..8a84c8c8 100644 --- a/tests/formats/test_bmsmsd.py +++ b/tests/formats/test_bmsmsd.py @@ -4,10 +4,7 @@ from mercury_engine_data_structures import samus_returns_data from mercury_engine_data_structures.formats.bmsmsd import Bmsmsd -all_sr_bmsmsd = [name for name in samus_returns_data.all_name_to_asset_id().keys() - if name.endswith(".bmsmsd")] - -@pytest.mark.parametrize("bmsmsd_path", all_sr_bmsmsd) +@pytest.mark.parametrize("bmsmsd_path", samus_returns_data.all_files_ending_with(".bmsmsd")) def test_bmsmsd(samus_returns_tree, bmsmsd_path): parse_build_compare_editor(Bmsmsd, samus_returns_tree, bmsmsd_path) diff --git a/tests/formats/test_bmsnav.py b/tests/formats/test_bmsnav.py index 1f79f29d..2039b7ae 100644 --- a/tests/formats/test_bmsnav.py +++ b/tests/formats/test_bmsnav.py @@ -1,45 +1,29 @@ import pytest from tests.test_lib import parse_build_compare_editor +from mercury_engine_data_structures import dread_data, samus_returns_data from mercury_engine_data_structures.formats.bmsnav import Bmsnav -dread_bmsnav = [ - "maps/levels/c10_samus/s010_cave/s010_cave.bmsnav", - "maps/levels/c10_samus/s020_magma/s020_magma.bmsnav", - "maps/levels/c10_samus/s030_baselab/s030_baselab.bmsnav", - "maps/levels/c10_samus/s040_aqua/s040_aqua.bmsnav", - "maps/levels/c10_samus/s050_forest/s050_forest.bmsnav", - "maps/levels/c10_samus/s060_quarantine/s060_quarantine.bmsnav", - "maps/levels/c10_samus/s070_basesanc/s070_basesanc.bmsnav", - "maps/levels/c10_samus/s080_shipyard/s080_shipyard.bmsnav", - "maps/levels/c10_samus/s090_skybase/s090_skybase.bmsnav", +sr_missing = [ + "maps/levels/c10_samus/s901_alpha/s901_alpha.bmsnav", + "maps/levels/c10_samus/s902_gamma/s902_gamma.bmsnav", + "maps/levels/c10_samus/s903_zeta/s903_zeta.bmsnav", + "maps/levels/c10_samus/s904_omega/s904_omega.bmsnav", + "maps/levels/c10_samus/s905_arachnus/s905_arachnus.bmsnav", + "maps/levels/c10_samus/s905_queen/s905_queen.bmsnav", + "maps/levels/c10_samus/s906_metroid/s906_metroid.bmsnav", + "maps/levels/c10_samus/s907_manicminerbot/s907_manicminerbot.bmsnav", + "maps/levels/c10_samus/s908_manicminerbotrun/s908_manicminerbotrun.bmsnav", + "maps/levels/c10_samus/s909_ridley/s909_ridley.bmsnav", + "maps/levels/c10_samus/s910_gym/s910_gym.bmsnav", + "maps/levels/c10_samus/s911_swarmgym/s911_swarmgym.bmsnav", + "maps/levels/c10_samus/s920_traininggallery/s920_traininggallery.bmsnav", ] -sr_bmsnav = [ - "maps/levels/c10_samus/s000_surface/s000_surface.bmsnav", - "maps/levels/c10_samus/s010_area1/s010_area1.bmsnav", - "maps/levels/c10_samus/s020_area2/s020_area2.bmsnav", - "maps/levels/c10_samus/s025_area2b/s025_area2b.bmsnav", - "maps/levels/c10_samus/s028_area2c/s028_area2c.bmsnav", - "maps/levels/c10_samus/s030_area3/s030_area3.bmsnav", - "maps/levels/c10_samus/s033_area3b/s033_area3b.bmsnav", - "maps/levels/c10_samus/s036_area3c/s036_area3c.bmsnav", - "maps/levels/c10_samus/s040_area4/s040_area4.bmsnav", - "maps/levels/c10_samus/s050_area5/s050_area5.bmsnav", - "maps/levels/c10_samus/s060_area6/s060_area6.bmsnav", - "maps/levels/c10_samus/s065_area6b/s065_area6b.bmsnav", - "maps/levels/c10_samus/s067_area6c/s067_area6c.bmsnav", - "maps/levels/c10_samus/s070_area7/s070_area7.bmsnav", - "maps/levels/c10_samus/s090_area9/s090_area9.bmsnav", - "maps/levels/c10_samus/s100_area10/s100_area10.bmsnav", - "maps/levels/c10_samus/s110_surfaceb/s110_surfaceb.bmsnav", -] - - -@pytest.mark.parametrize("bmsnav_path", dread_bmsnav) +@pytest.mark.parametrize("bmsnav_path", dread_data.all_files_ending_with(".bmsnav")) def test_dread_bmsnav(dread_file_tree, bmsnav_path): parse_build_compare_editor(Bmsnav, dread_file_tree, bmsnav_path) -@pytest.mark.parametrize("bmsnav_path", sr_bmsnav) +@pytest.mark.parametrize("bmsnav_path", samus_returns_data.all_files_ending_with(".bmsnav", sr_missing)) def test_sr_bmsnav(samus_returns_tree, bmsnav_path): parse_build_compare_editor(Bmsnav, samus_returns_tree, bmsnav_path) diff --git a/tests/formats/test_bmssd.py b/tests/formats/test_bmssd.py index 1d4e072f..728456d3 100644 --- a/tests/formats/test_bmssd.py +++ b/tests/formats/test_bmssd.py @@ -1,15 +1,29 @@ -from tests.test_lib import parse_and_build_compare +import pytest +from tests.test_lib import parse_build_compare_editor -from mercury_engine_data_structures.formats.bmssd import BMSSD -from mercury_engine_data_structures.game_check import Game +from mercury_engine_data_structures import dread_data, samus_returns_data +from mercury_engine_data_structures.formats.bmssd import Bmssd +sr_missing = [ + "maps/levels/c10_samus/s901_alpha/s901_alpha.bmssd", + "maps/levels/c10_samus/s902_gamma/s902_gamma.bmssd", + "maps/levels/c10_samus/s903_zeta/s903_zeta.bmssd", + "maps/levels/c10_samus/s904_omega/s904_omega.bmssd", + "maps/levels/c10_samus/s905_arachnus/s905_arachnus.bmssd", + "maps/levels/c10_samus/s905_queen/s905_queen.bmssd", + "maps/levels/c10_samus/s906_metroid/s906_metroid.bmssd", + "maps/levels/c10_samus/s907_manicminerbot/s907_manicminerbot.bmssd", + "maps/levels/c10_samus/s908_manicminerbotrun/s908_manicminerbotrun.bmssd", + "maps/levels/c10_samus/s909_ridley/s909_ridley.bmssd", + "maps/levels/c10_samus/s910_gym/s910_gym.bmssd", + "maps/levels/c10_samus/s911_swarmgym/s911_swarmgym.bmssd", + "maps/levels/c10_samus/s920_traininggallery/s920_traininggallery.bmssd", +] -def test_compare_dread(dread_path): - parse_and_build_compare( - BMSSD, Game.DREAD, dread_path.joinpath("packs/maps/s060_quarantine/s060_quarantine.bmssd") - ) +@pytest.mark.parametrize("bmssd_path", dread_data.all_files_ending_with(".bmssd")) +def test_compare_dread(dread_file_tree, bmssd_path): + parse_build_compare_editor(Bmssd, dread_file_tree, bmssd_path) -def test_compare_msr(samus_returns_path): - parse_and_build_compare( - BMSSD, Game.SAMUS_RETURNS, samus_returns_path.joinpath("packs/maps/s050_area5/s050_area5.bmssd") - ) +@pytest.mark.parametrize("bmssd_path", samus_returns_data.all_files_ending_with(".bmssd", sr_missing)) +def test_compare_msr(samus_returns_tree, bmssd_path): + parse_build_compare_editor(Bmssd, samus_returns_tree, bmssd_path) diff --git a/tests/formats/test_bmtre.py b/tests/formats/test_bmtre.py index 82d7bf6c..c079e490 100644 --- a/tests/formats/test_bmtre.py +++ b/tests/formats/test_bmtre.py @@ -4,10 +4,7 @@ from mercury_engine_data_structures import dread_data from mercury_engine_data_structures.formats.bmtre import Bmtre -all_dread_bmtre = [name for name in dread_data.all_name_to_asset_id().keys() - if name.endswith(".bmtre")] - -@pytest.mark.parametrize("bmtre_path", all_dread_bmtre) +@pytest.mark.parametrize("bmtre_path", dread_data.all_files_ending_with(".bmtre")) def test_bmtre(dread_file_tree, bmtre_path): parse_build_compare_editor(Bmtre, dread_file_tree, bmtre_path) diff --git a/tests/formats/test_bmtun.py b/tests/formats/test_bmtun.py index 1491796e..f67a382e 100644 --- a/tests/formats/test_bmtun.py +++ b/tests/formats/test_bmtun.py @@ -4,10 +4,7 @@ from mercury_engine_data_structures import samus_returns_data from mercury_engine_data_structures.formats.bmtun import Bmtun -all_sr_bmtun = [name for name in samus_returns_data.all_name_to_asset_id().keys() - if name.endswith(".bmtun")] - -@pytest.mark.parametrize("bmtun_path", all_sr_bmtun) +@pytest.mark.parametrize("bmtun_path", samus_returns_data.all_files_ending_with(".bmtun")) def test_bmtun(samus_returns_tree, bmtun_path): parse_build_compare_editor(Bmtun, samus_returns_tree, bmtun_path) diff --git a/tests/formats/test_brfld.py b/tests/formats/test_brfld.py index 703209c3..a8834534 100644 --- a/tests/formats/test_brfld.py +++ b/tests/formats/test_brfld.py @@ -1,22 +1,10 @@ import pytest from tests.test_lib import parse_build_compare_editor +from mercury_engine_data_structures import dread_data from mercury_engine_data_structures.formats.brfld import Brfld -all_brfld = [ - "maps/levels/c10_samus/s010_cave/s010_cave.brfld", - "maps/levels/c10_samus/s020_magma/s020_magma.brfld", - "maps/levels/c10_samus/s030_baselab/s030_baselab.brfld", - "maps/levels/c10_samus/s040_aqua/s040_aqua.brfld", - "maps/levels/c10_samus/s050_forest/s050_forest.brfld", - "maps/levels/c10_samus/s060_quarantine/s060_quarantine.brfld", - "maps/levels/c10_samus/s070_basesanc/s070_basesanc.brfld", - "maps/levels/c10_samus/s080_shipyard/s080_shipyard.brfld", - "maps/levels/c10_samus/s090_skybase/s090_skybase.brfld", -] - - -@pytest.mark.parametrize("brfld_path", all_brfld) +@pytest.mark.parametrize("brfld_path", dread_data.all_files_ending_with(".brfld")) def test_brfld(dread_file_tree, brfld_path): parse_build_compare_editor(Brfld, dread_file_tree, brfld_path) diff --git a/tests/formats/test_bsmat.py b/tests/formats/test_bsmat.py index d3e206a7..7658e594 100644 --- a/tests/formats/test_bsmat.py +++ b/tests/formats/test_bsmat.py @@ -5,11 +5,8 @@ from mercury_engine_data_structures import dread_data from mercury_engine_data_structures.formats.bsmat import Bsmat -all_dread_bsmat = [name for name in dread_data.all_name_to_asset_id().keys() - if name.endswith(".bsmat")] - -@pytest.mark.parametrize("bsmat_path", all_dread_bsmat) +@pytest.mark.parametrize("bsmat_path", dread_data.all_files_ending_with(".bsmat")) def test_compare_dread_all(dread_file_tree, bsmat_path): parse_build_compare_editor(Bsmat, dread_file_tree, bsmat_path) diff --git a/tests/formats/test_gui.py b/tests/formats/test_gui.py index e19f2b92..72b18ed0 100644 --- a/tests/formats/test_gui.py +++ b/tests/formats/test_gui.py @@ -1,20 +1,18 @@ -from tests.test_lib import parse_and_build_compare, parse_and_build_compare_parsed +import pytest +from tests.test_lib import parse_build_compare_editor, parse_build_compare_editor_parsed -from mercury_engine_data_structures.formats.gui_files import BMSCP, BMSSK, BMSSS -from mercury_engine_data_structures.game_check import Game +from mercury_engine_data_structures import dread_data +from mercury_engine_data_structures.formats.gui_files import Bmscp, Bmssk, Bmsss -def test_compare_bmscp_dread(dread_path): - parse_and_build_compare_parsed( - BMSCP, Game.DREAD, dread_path.joinpath("gui/scripts/samusmenucomposition.bmscp"), - ) +@pytest.mark.parametrize("bmscp_path", dread_data.all_files_ending_with(".bmscp")) +def test_compare_bmscp_dread(dread_file_tree, bmscp_path): + parse_build_compare_editor_parsed(Bmscp, dread_file_tree, bmscp_path) -def test_compare_bmssk_dread(dread_path): - parse_and_build_compare( - BMSSK, Game.DREAD, dread_path.joinpath("gui/scripts/samusmenucomposition.bmssk"), - ) +@pytest.mark.parametrize("bmssk_path", dread_data.all_files_ending_with(".bmssk")) +def test_compare_bmssk_dread(dread_file_tree, bmssk_path): + parse_build_compare_editor(Bmssk, dread_file_tree, bmssk_path) -def test_compare_bmsss_dread(dread_path): - parse_and_build_compare( - BMSSS, Game.DREAD, dread_path.joinpath("gui/scripts/sprites_companylogo.bmsss") - ) +@pytest.mark.parametrize("bmsss_path", dread_data.all_files_ending_with(".bmsss")) +def test_compare_bmsss_dread(dread_file_tree, bmsss_path): + parse_build_compare_editor(Bmsss, dread_file_tree, bmsss_path) diff --git a/tests/formats/test_minimap.py b/tests/formats/test_minimap.py deleted file mode 100644 index 65a3dbd0..00000000 --- a/tests/formats/test_minimap.py +++ /dev/null @@ -1,20 +0,0 @@ -import pytest -from tests.test_lib import parse_build_compare_editor - -from mercury_engine_data_structures import dread_data -from mercury_engine_data_structures.formats.bmmap import Bmmap -from mercury_engine_data_structures.formats.bmmdef import Bmmdef - -all_dread_bmmap = [name for name in dread_data.all_name_to_asset_id().keys() - if name.endswith(".bmmap")] - - -@pytest.mark.parametrize("path", all_dread_bmmap) -def test_dread_bmsnav(dread_file_tree, path): - parse_build_compare_editor(Bmmap, dread_file_tree, path) - - -def test_compare_bmmdef_dread(dread_file_tree): - parse_build_compare_editor( - Bmmdef, dread_file_tree, "system/minimap/minimap.bmmdef" - ) diff --git a/tests/formats/test_pkg.py b/tests/formats/test_pkg.py index 98569d58..6bcb0499 100644 --- a/tests/formats/test_pkg.py +++ b/tests/formats/test_pkg.py @@ -8,12 +8,6 @@ _EMPTY_DREAD_PKG = (b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') -all_dread_pkg = [name for name in dread_data.all_name_to_asset_id().keys() - if name.endswith(".pkg")] - -all_sr_pkg = [name for name in samus_returns_data.all_name_to_asset_id().keys() - if name.endswith(".pkg")] - wrong_build_sr = [ # MSCU, no padding in vanilla "packs/cutscenes/elevator.pkg", @@ -39,13 +33,80 @@ "packs/players/common_fusion.pkg", ] -@pytest.mark.parametrize("pkg_path", all_dread_pkg) +sr_missing = [ + "packs/maps/s901_alpha/s901_alpha.pkg", + "packs/maps/s901_alpha/s901_alpha_discardables.pkg", + "packs/maps/s902_gamma/s902_gamma.pkg", + "packs/maps/s902_gamma/s902_gamma_discardables.pkg", + "packs/maps/s903_zeta/s903_zeta.pkg", + "packs/maps/s903_zeta/s903_zeta_discardables.pkg", + "packs/maps/s904_omega/s904_omega.pkg", + "packs/maps/s904_omega/s904_omega_discardables.pkg", + "packs/maps/s905_arachnus/s905_arachnus.pkg", + "packs/maps/s905_arachnus/s905_arachnus_discardables.pkg", + "packs/maps/s905_queen/s905_queen.pkg", + "packs/maps/s905_queen/s905_queen_discardables.pkg", + "packs/maps/s905_queen/subareas/subarearp0.pkg", + "packs/maps/s905_queen/subareas/subarearp0_discardables.pkg", + "packs/maps/s906_metroid/s906_metroid.pkg", + "packs/maps/s906_metroid/s906_metroid_discardables.pkg", + "packs/maps/s906_metroid/subareas/subarearp0.pkg", + "packs/maps/s906_metroid/subareas/subarearp0_discardables.pkg", + "packs/maps/s907_manicminerbot/s907_manicminerbot.pkg", + "packs/maps/s907_manicminerbot/s907_manicminerbot_discardables.pkg", + "packs/maps/s907_manicminerbot/subareas/subarearp0.pkg", + "packs/maps/s907_manicminerbot/subareas/subarearp0_discardables.pkg", + "packs/maps/s908_manicminerbotrun/s908_manicminerbotrun.pkg", + "packs/maps/s908_manicminerbotrun/s908_manicminerbotrun_discardables.pkg", + "packs/maps/s908_manicminerbotrun/subareas/subarearp0.pkg", + "packs/maps/s908_manicminerbotrun/subareas/subarearp0_discardables.pkg", + "packs/maps/s909_ridley/s909_ridley.pkg", + "packs/maps/s909_ridley/s909_ridley_discardables.pkg", + "packs/maps/s909_ridley/subareas/subarearp0.pkg", + "packs/maps/s909_ridley/subareas/subarearp0_discardables.pkg", + "packs/maps/s910_gym/s910_gym.pkg", + "packs/maps/s910_gym/s910_gym_discardables.pkg", + "packs/maps/s910_gym/subareas/subarearp0.pkg", + "packs/maps/s910_gym/subareas/subarearp0_discardables.pkg", + "packs/maps/s911_swarmgym/s911_swarmgym.pkg", + "packs/maps/s911_swarmgym/s911_swarmgym_discardables.pkg", + "packs/maps/s911_swarmgym/subareas/subarearp0.pkg", + "packs/maps/s911_swarmgym/subareas/subarearp0_discardables.pkg", + "packs/maps/s911_swarmgym/subareas/subarearp1.pkg", + "packs/maps/s911_swarmgym/subareas/subarearp1_discardables.pkg", + "packs/maps/s920_traininggallery/s920_traininggallery.pkg", + "packs/maps/s920_traininggallery/s920_traininggallery_discardables.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp0.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp0_discardables.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp1.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp10.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp10_discardables.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp1_discardables.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp2.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp2_discardables.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp3.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp3_discardables.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp4.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp4_discardables.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp5.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp5_discardables.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp6.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp6_discardables.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp7.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp7_discardables.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp8.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp8_discardables.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp9.pkg", + "packs/maps/s920_traininggallery/subareas/subarearp9_discardables.pkg", +] + +@pytest.mark.parametrize("pkg_path", dread_data.all_files_ending_with(".pkg")) def test_compare_dread(dread_path, pkg_path): parse_and_build_compare( Pkg.construct_class(Game.DREAD), Game.DREAD, dread_path.joinpath(pkg_path) ) -@pytest.mark.parametrize("pkg_path", all_sr_pkg) +@pytest.mark.parametrize("pkg_path", samus_returns_data.all_files_ending_with(".pkg", sr_missing)) def test_compare_sr(samus_returns_path, pkg_path): if pkg_path in wrong_build_sr: raw = samus_returns_path.joinpath(pkg_path).read_bytes() diff --git a/tests/formats/test_txt.py b/tests/formats/test_txt.py index 14d37c5e..23fa3d9d 100644 --- a/tests/formats/test_txt.py +++ b/tests/formats/test_txt.py @@ -1,17 +1,14 @@ -from tests.test_lib import parse_and_build_compare +import pytest +from tests.test_lib import parse_build_compare_editor -from mercury_engine_data_structures.formats.txt import TXT -from mercury_engine_data_structures.game_check import Game +from mercury_engine_data_structures import dread_data, samus_returns_data +from mercury_engine_data_structures.formats.txt import Txt -def test_compare_dread(dread_path): - file_path = dread_path.joinpath("system/localization/us_english.txt") - parse_and_build_compare( - TXT, Game.DREAD, file_path - ) +@pytest.mark.parametrize("txt_path", dread_data.all_files_ending_with(".txt")) +def test_compare_dread(dread_file_tree, txt_path): + parse_build_compare_editor(Txt, dread_file_tree, txt_path) -def test_compare_sr(samus_returns_path): - file_path = samus_returns_path.joinpath("system/localization/us_english.txt") - parse_and_build_compare( - TXT, Game.SAMUS_RETURNS, file_path - ) +@pytest.mark.parametrize("txt_path", samus_returns_data.all_files_ending_with(".txt")) +def test_compare_sr(samus_returns_tree, txt_path): + parse_build_compare_editor(Txt, samus_returns_tree, txt_path) diff --git a/tests/test_lib.py b/tests/test_lib.py index 24c70682..5b25aa17 100644 --- a/tests/test_lib.py +++ b/tests/test_lib.py @@ -3,14 +3,13 @@ import construct import pytest -from construct.lib.containers import Container from mercury_engine_data_structures.file_tree_editor import FileTreeEditor from mercury_engine_data_structures.formats import BaseResource from mercury_engine_data_structures.game_check import Game, GameSpecificStruct -def _parse_and_build_compare(module, game: Game, file_path: Path, print_data=False, save_file=None): +def parse_and_build_compare(module, game: Game, file_path: Path, print_data=False, save_file=None): if not file_path.is_file(): return pytest.skip(f"missing {file_path}") @@ -24,40 +23,37 @@ def _parse_and_build_compare(module, game: Game, file_path: Path, print_data=Fal if save_file: file_path.parent.joinpath(save_file).write_bytes(encoded) - return raw, encoded, data - - -def parse_and_build_compare(module, game: Game, file_path: Path, print_data=False, save_file=None): - raw, encoded, _ = _parse_and_build_compare(module, game, file_path, print_data, save_file) assert encoded == raw +def _parse_build_compare(module: typing.Type[BaseResource], + editor: FileTreeEditor, file_name: str, print_data=False): + construct_class = module.construct_class(editor.target_game) + raw = editor.get_raw_asset(file_name) -def parse_and_build_compare_parsed(module, game: Game, file_path: Path, print_data=False, save_file=None): - _, encoded, data = _parse_and_build_compare(module, game, file_path, print_data, save_file) - - data2 = module.parse(encoded, target_game=game) + data = construct_class.parse(raw, target_game=editor.target_game) if print_data: - print(data2) + print(data) + encoded = construct_class.build(data, target_game=editor.target_game) - assert purge_hidden(data) == purge_hidden(data2) + return raw, encoded, data +def parse_build_compare_editor(module: typing.Type[BaseResource], + editor: FileTreeEditor, file_name: str, print_data=False): + raw, encoded, _ = _parse_build_compare(module, editor, file_name, print_data) -def purge_hidden(data: Container) -> Container: - data = {k: v for k, v in data.items() if not k.startswith("_")} - return {k: purge_hidden(v) if isinstance(v, Container) else v for k, v in data.items()} + assert encoded == raw +def parse_build_compare_editor_parsed(module: typing.Type[BaseResource], + editor: FileTreeEditor, file_name: str, print_data=False): + _, encoded, data = _parse_build_compare(module, editor, file_name, print_data) -def parse_build_compare_editor(module: typing.Type[BaseResource], - editor: FileTreeEditor, file_name: str, print_data=False): construct_class = module.construct_class(editor.target_game) - raw = editor.get_raw_asset(file_name) + data2 = construct_class.parse(encoded, target_game=editor.target_game) - data = construct_class.parse(raw, target_game=editor.target_game) if print_data: - print(data) - encoded = construct_class.build(data, target_game=editor.target_game) + print(data2) - assert encoded == raw + assert data == data2 def game_compile_build(con: construct.Construct, data: construct.Container, target_game: Game) -> bytes: