From 811078fbb7010d6ab4761af2a99fa49b5207d7b3 Mon Sep 17 00:00:00 2001 From: Henrique Gemignani Passos Lima Date: Tue, 16 Jul 2024 11:35:33 +0300 Subject: [PATCH 1/5] Skip formatting on a few files --- .../formats/blsnd.py | 2 +- .../formats/bmdefs.py | 4 +-- .../formats/bmsad.py | 8 +++--- .../formats/bmsbk.py | 6 ++--- .../formats/bmsem.py | 25 ++++++++++--------- .../formats/bmses.py | 2 +- .../formats/bmsmd.py | 2 +- .../formats/bmsmsd.py | 2 +- .../formats/bmtun.py | 2 +- .../formats/txt.py | 2 +- 10 files changed, 28 insertions(+), 27 deletions(-) diff --git a/src/mercury_engine_data_structures/formats/blsnd.py b/src/mercury_engine_data_structures/formats/blsnd.py index dbebb640..233deb08 100644 --- a/src/mercury_engine_data_structures/formats/blsnd.py +++ b/src/mercury_engine_data_structures/formats/blsnd.py @@ -26,7 +26,7 @@ "value" / Int32ul, )), construct.Terminated, -) +) # fmt: skip class Blsnd(BaseResource): diff --git a/src/mercury_engine_data_structures/formats/bmdefs.py b/src/mercury_engine_data_structures/formats/bmdefs.py index 76f211dc..c837b0c0 100644 --- a/src/mercury_engine_data_structures/formats/bmdefs.py +++ b/src/mercury_engine_data_structures/formats/bmdefs.py @@ -63,7 +63,7 @@ )), )), )) -) +) # fmt: skip BMDEFS = Struct( _magic=Const(b"MDEF"), @@ -82,7 +82,7 @@ "volume" / Float32l, "unk_bool" / Flag, "environment_sfx_volume" / Float32l - )), + )), # fmt: skip unk2=Int32ul, enemies_list=make_vector(EnemyStruct), rest=construct.GreedyBytes, diff --git a/src/mercury_engine_data_structures/formats/bmsad.py b/src/mercury_engine_data_structures/formats/bmsad.py index 5c0b3307..cf3d77ab 100644 --- a/src/mercury_engine_data_structures/formats/bmsad.py +++ b/src/mercury_engine_data_structures/formats/bmsad.py @@ -155,7 +155,7 @@ def DreadDependencies(): "unk2" / make_vector(StrId), "unk3" / make_vector(StrId) ) - } + } # fmt: skip component_dependencies["CStandaloneFXComponent"] = component_dependencies["CFXComponent"] def component_type(this): @@ -215,7 +215,7 @@ def SRDependencies(): "unk2" / make_vector(StrId), "unk3" / make_vector(StrId) ), - } + } # fmt: skip for dep in [ "CTsumuriAcidDroolCollision", "CBillboardCollisionComponent", @@ -353,7 +353,7 @@ def _not_implemented(code): ), construct.Terminated, -) +) # fmt: skip BMSAD_Dread = Struct( "_magic" / Const(b"MSAD"), @@ -375,7 +375,7 @@ def _not_implemented(code): "action_sets" / make_vector(StrId), "sound_fx" / make_vector(StrId >> Byte), construct.Terminated, -) +) # fmt: skip ArgAnyType = str | float | bool | int diff --git a/src/mercury_engine_data_structures/formats/bmsbk.py b/src/mercury_engine_data_structures/formats/bmsbk.py index 082cbe37..9687250b 100644 --- a/src/mercury_engine_data_structures/formats/bmsbk.py +++ b/src/mercury_engine_data_structures/formats/bmsbk.py @@ -24,7 +24,7 @@ "respawn_time" / Float32l, "model_name" / StrId, "vignette_name" / StrId, -) +) # fmt: skip def _rebuild_blocks(ctx: Container) -> int: return sum(len(group.blocks) for group in ctx.types) @@ -40,7 +40,7 @@ def _rebuild_types(ctx: Container) -> int: "block_type" / StrId, "blocks" / make_vector(Block), )), -) +) # fmt: skip BMSBK = Struct( "magic" / Const(b"MSBK"), @@ -51,7 +51,7 @@ def _rebuild_types(ctx: Container) -> int: "entries" / make_vector(Int32ul), )), Terminated, -) +) # fmt: skip class Bmsbk(BaseResource): @classmethod diff --git a/src/mercury_engine_data_structures/formats/bmsem.py b/src/mercury_engine_data_structures/formats/bmsem.py index 0feafc62..50d02bed 100644 --- a/src/mercury_engine_data_structures/formats/bmsem.py +++ b/src/mercury_engine_data_structures/formats/bmsem.py @@ -15,21 +15,22 @@ _magic=Const(b"MSEM"), _version=VersionAdapter("1.3.0"), groups=make_vector(Struct( - "group_name" / StrId, - "layers" / make_vector(Struct( - "layer_name" / StrId, - "entries" / make_vector(Struct( - "collision_camera" / StrId, - "song" / StrId, # Is empty if cc is "default". - "unk1" / Float32l, # Always either 2.0 or 1.5 - "unk2" / Float32l, # Always same number as unk1 - "unk3" / Int32ul, # Always 1 - "unk4" / Int32ul # Always 0 - )) + "group_name" / StrId, + "layers" / make_vector(Struct( + "layer_name" / StrId, + "entries" / make_vector(Struct( + "collision_camera" / StrId, + "song" / StrId, # Is empty if cc is "default". + "unk1" / Float32l, # Always either 2.0 or 1.5 + "unk2" / Float32l, # Always same number as unk1 + "unk3" / Int32ul, # Always 1 + "unk4" / Int32ul # Always 0 )) + )) )), rest=construct.GreedyBytes, -) +) # fmt: skip + class Bmsem(BaseResource): @classmethod diff --git a/src/mercury_engine_data_structures/formats/bmses.py b/src/mercury_engine_data_structures/formats/bmses.py index 2eeb04b3..0407e7ac 100644 --- a/src/mercury_engine_data_structures/formats/bmses.py +++ b/src/mercury_engine_data_structures/formats/bmses.py @@ -36,7 +36,7 @@ ))), ))), construct.Terminated, -) +) # fmt: skip class Bmses(BaseResource): diff --git a/src/mercury_engine_data_structures/formats/bmsmd.py b/src/mercury_engine_data_structures/formats/bmsmd.py index f1966d31..ed08b3ec 100644 --- a/src/mercury_engine_data_structures/formats/bmsmd.py +++ b/src/mercury_engine_data_structures/formats/bmsmd.py @@ -40,7 +40,7 @@ )), )), )), -) +) # fmt: skip class Bmsmd(BaseResource): @classmethod diff --git a/src/mercury_engine_data_structures/formats/bmsmsd.py b/src/mercury_engine_data_structures/formats/bmsmsd.py index 5bfbbb5e..7ff3deb1 100644 --- a/src/mercury_engine_data_structures/formats/bmsmsd.py +++ b/src/mercury_engine_data_structures/formats/bmsmsd.py @@ -71,7 +71,7 @@ ) ), construct.Terminated, -) +) # fmt: skip class Bmsmsd(BaseResource): diff --git a/src/mercury_engine_data_structures/formats/bmtun.py b/src/mercury_engine_data_structures/formats/bmtun.py index 1bbf008a..2ad38de7 100644 --- a/src/mercury_engine_data_structures/formats/bmtun.py +++ b/src/mercury_engine_data_structures/formats/bmtun.py @@ -41,7 +41,7 @@ "version" / VersionAdapter("1.5.0"), "classes" / make_dict(TunableClass), construct.Terminated, -) +) # fmt: skip class Bmtun(BaseResource): diff --git a/src/mercury_engine_data_structures/formats/txt.py b/src/mercury_engine_data_structures/formats/txt.py index 789db228..41bd6f8f 100644 --- a/src/mercury_engine_data_structures/formats/txt.py +++ b/src/mercury_engine_data_structures/formats/txt.py @@ -44,7 +44,7 @@ def _parse_{n}(io, this): ), "strings" / DictAdapter(_string_range), "_end" / construct.Terminated, -) +) # fmt: skip class Txt(BaseResource): From 6990c3626931628341bcbf291f317da959491fda Mon Sep 17 00:00:00 2001 From: Henrique Gemignani Passos Lima Date: Tue, 16 Jul 2024 11:37:58 +0300 Subject: [PATCH 2/5] Fixes for formatter --- tools/ghidra_export.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/ghidra_export.py b/tools/ghidra_export.py index b3517204..799a32e5 100644 --- a/tools/ghidra_export.py +++ b/tools/ghidra_export.py @@ -49,17 +49,17 @@ known_typedefs = { "TPatterns": "base::global::CRntVector", "CCharClassRodotukAIComponent::TVAbsorbConfigs": - "base::global::CRntVector", + ("base::global::CRntVector"), "TLaunchPattern": "base::global::CRntVector", "TLaunchConfigs": "base::global::CRntVector", "TBigkranXSpitLaunchPattern": "base::global::CRntVector", "CCharClassRodomithonXAIComponent::TVFirePillarConfigs": - "base::global::CRntVector", + ("base::global::CRntVector"), "CMinimapDef::TMapLabelDefs": "base::global::CRntDictionary", "CMinimapDef::TMapIconDefs": "base::global::CRntDictionary", "CBlackboard::TSectionContainer": "base::global::CRntDictionary", "CPlaythrough::TDictCheckpointDatas": - "base::global::CRntDictionary>", + ("base::global::CRntDictionary>"), "TSoundEventRules": "base::global::CRntVector>", "CGameBlackboard::TPropDeltaValues": "base::global::CRntSmallDictionary", "CMinimapData::TOccludedIcons": "base::global::CRntVector", @@ -244,7 +244,7 @@ def convert_old_to_new(old_types: dict[str, dict[str, typing.Any]]): "&Vector_CSpawnerActorBlueprint_DAT_71729aa9d0": "base::global::CRntVector", "&Trigger_DAT_71726f4968": "base::global::CRntVector>", "&DictStr_ListStr_DAT_71726f5da0": - "base::global::CRntDictionary>", + ("base::global::CRntDictionary>"), "&VectorStrId_DAT_7101d03998": "base::global::CRntVector", "&DAT_71726f8e78": "base::global::CRntVector", "&DAT_71726fd0c0": "base::global::CRntVector", From 00678cbca4b943d25928ad9a1a1553e53531c049 Mon Sep 17 00:00:00 2001 From: Henrique Gemignani Passos Lima Date: Tue, 16 Jul 2024 11:58:47 +0300 Subject: [PATCH 3/5] Small changes to improve automatic formatting --- .../formats/bcmdl.py | 12 +++++------ .../formats/blsnd.py | 2 +- .../formats/bmsas.py | 2 +- .../formats/bmsmsd.py | 4 ++-- .../formats/bmsnav.py | 20 +++++++++---------- .../formats/bmtre.py | 8 ++++---- .../formats/bmtun.py | 4 ++-- .../formats/bsmat.py | 14 ++++++------- 8 files changed, 33 insertions(+), 33 deletions(-) diff --git a/src/mercury_engine_data_structures/formats/bcmdl.py b/src/mercury_engine_data_structures/formats/bcmdl.py index 87b02199..8f6cb51c 100644 --- a/src/mercury_engine_data_structures/formats/bcmdl.py +++ b/src/mercury_engine_data_structures/formats/bcmdl.py @@ -38,7 +38,7 @@ # pad 0xFF bytes to an offset of 8 PadTo8B = Struct( _cur_pos=Tell, - padding=construct.Padding((8 - construct.this._cur_pos) % 8, pattern=b'\xff') + padding=construct.Padding((8 - construct.this._cur_pos) % 8, pattern=b'\xff'), ) # an entry in a linked-list typically pointed to by TOC. @@ -46,7 +46,7 @@ # so we just need to break when next==0 TOC_subentry = Struct( ptr=Ptr, - next=Ptr + next=Ptr, ) # info on a section of the decompressed vertex buffer @@ -198,7 +198,7 @@ start=Hex(construct.Tell), pos=Array(3, Float), rot=Array(3, Float), - scale=Array(3, Float) + scale=Array(3, Float), ).compile() # joint TOC entry @@ -263,8 +263,8 @@ ptr=Ptr, ref=If( construct.this.ptr != 0, - Pointer(construct.this.ptr, TOC9_info) - ) + Pointer(construct.this.ptr, TOC9_info), + ), ).compile() # entry for TOC9. @@ -287,7 +287,7 @@ # Linked-list TOC. Always seems to be in sequence so we can use the "hack" of just repeating until next=0. Sub_TOC = Struct( ptr=Tell, - subtoc_entries=RepeatUntil(construct.obj_.next == 0, TOC_subentry) + subtoc_entries=RepeatUntil(construct.obj_.next == 0, TOC_subentry), ).compile() diff --git a/src/mercury_engine_data_structures/formats/blsnd.py b/src/mercury_engine_data_structures/formats/blsnd.py index 233deb08..317d173b 100644 --- a/src/mercury_engine_data_structures/formats/blsnd.py +++ b/src/mercury_engine_data_structures/formats/blsnd.py @@ -24,7 +24,7 @@ "sound_limits" / make_vector(Struct( "name" / StrId, "value" / Int32ul, - )), + )), construct.Terminated, ) # fmt: skip diff --git a/src/mercury_engine_data_structures/formats/bmsas.py b/src/mercury_engine_data_structures/formats/bmsas.py index 76845975..f024c367 100644 --- a/src/mercury_engine_data_structures/formats/bmsas.py +++ b/src/mercury_engine_data_structures/formats/bmsas.py @@ -150,7 +150,7 @@ def build_arg_list_sr(obj_data: dict, io, this): EventDread = Struct( type=PropertyEnum, unk=Int32ul, - args=ArgListDread + args=ArgListDread, ) EventSR = Struct( unk=Int32ul, diff --git a/src/mercury_engine_data_structures/formats/bmsmsd.py b/src/mercury_engine_data_structures/formats/bmsmsd.py index 7ff3deb1..f62ef095 100644 --- a/src/mercury_engine_data_structures/formats/bmsmsd.py +++ b/src/mercury_engine_data_structures/formats/bmsmsd.py @@ -24,7 +24,7 @@ HEAT=2, ACID=4, ACID_RISE=8, - ACID_FALL=12 + ACID_FALL=12, ) IconPriority = Enum( @@ -35,7 +35,7 @@ ENERGY_CLOUD=2, DOOR=3, CHOZO_SEAL=4, - HIDDEN_ITEM=5 + HIDDEN_ITEM=5, ) # BMSMSD diff --git a/src/mercury_engine_data_structures/formats/bmsnav.py b/src/mercury_engine_data_structures/formats/bmsnav.py index 403d94f8..60e0390a 100644 --- a/src/mercury_engine_data_structures/formats/bmsnav.py +++ b/src/mercury_engine_data_structures/formats/bmsnav.py @@ -30,23 +30,23 @@ Struct1 = Struct( unk0=Int32ul, unk1=CVector2D, - unk2=CVector2D + unk2=CVector2D, ) # special paths entities can take that ignore default connections (i.e. chozo robot jumps or wall-traveling enemies). # emmi's are in a separate structure. # hard-coded to specific entity's sName NavigablePath = Struct( - path=PrefixedArray(Int32ul, Int32ul) + path=PrefixedArray(Int32ul, Int32ul), ) EZ_Element = Struct( el=Int32ul, - unk1=PrefixedArray(Int32ul, Int32ul) + unk1=PrefixedArray(Int32ul, Int32ul), ) EmmyZone_inner = Struct( - elements=PrefixedArray(Int32ul, EZ_Element) + elements=PrefixedArray(Int32ul, EZ_Element), ) # reference to an "LS_EmmyZone" typically @@ -79,36 +79,36 @@ # another prefixed array with an unknown parameter. I think maybe this is done based on the area/room the emmy is in? EmmyAreaTraversal = Struct( - actions=PrefixedArray(Int32ul, Traversal) + actions=PrefixedArray(Int32ul, Traversal), ) # emmy-specific traversal (ie where they can hop up on ceilings). # includes a bmslink reference and refers to specific actions. EmmyTraversals = Struct( bmslink=StrId, - traversals=make_dict(EmmyAreaTraversal, Int32ul) + traversals=make_dict(EmmyAreaTraversal, Int32ul), ) PAction = Struct( unk0=Int32ul, - action=Traversal + action=Traversal, ) PropActions = Struct( name=StrId, bmslink=StrId, - actions=PrefixedArray(Int32ul, PAction) + actions=PrefixedArray(Int32ul, PAction), ) # actions around certain props like buttons Prop = Struct( - actions=PrefixedArray(Int32ul, PrefixedArray(Int32ul, PropActions)) + actions=PrefixedArray(Int32ul, PrefixedArray(Int32ul, PropActions)), ) # a parameter for actor. seems to be sublayers of the navmesh. Actor_unk1_param = Struct( sName=StrId, - unk=Int32ul + unk=Int32ul, ) # info on an actor diff --git a/src/mercury_engine_data_structures/formats/bmtre.py b/src/mercury_engine_data_structures/formats/bmtre.py index 8669be34..06c656d3 100644 --- a/src/mercury_engine_data_structures/formats/bmtre.py +++ b/src/mercury_engine_data_structures/formats/bmtre.py @@ -34,8 +34,8 @@ val = Switch( construct.this.key[0], ArgumentCases, - construct.Error - ) + construct.Error, + ), ) CrcKeyArgument = Struct( @@ -43,8 +43,8 @@ val = Switch( construct.this.key[0], ArgumentCases, - construct.Error - ) + construct.Error, + ), ) Behavior = Struct( diff --git a/src/mercury_engine_data_structures/formats/bmtun.py b/src/mercury_engine_data_structures/formats/bmtun.py index 2ad38de7..ea7b1d05 100644 --- a/src/mercury_engine_data_structures/formats/bmtun.py +++ b/src/mercury_engine_data_structures/formats/bmtun.py @@ -27,8 +27,8 @@ 'i': Int32sl, 'v': CVector3D }, - ErrorWithMessage(lambda ctx: f"Unknown argument type: {ctx.type}", construct.SwitchError) - ) + ErrorWithMessage(lambda ctx: f"Unknown argument type: {ctx.type}", construct.SwitchError), + ), ) TunableClass = Struct( diff --git a/src/mercury_engine_data_structures/formats/bsmat.py b/src/mercury_engine_data_structures/formats/bsmat.py index 998243e2..f6d4d076 100644 --- a/src/mercury_engine_data_structures/formats/bsmat.py +++ b/src/mercury_engine_data_structures/formats/bsmat.py @@ -31,7 +31,7 @@ TILING_CLAMPCOLOR=1, TILING_REPEAT=2, TILING_MIRROR=3, - TILING_INVALID=0xffffffff + TILING_INVALID=0xffffffff, ) # blend operation @@ -43,7 +43,7 @@ REV_SUB=2, MIN=3, MAX=4, - INVALID=0xffffffff + INVALID=0xffffffff, ) # blend mode @@ -60,7 +60,7 @@ ONE_MINUS_SRC_ALPHA=7, DST_ALPHA=8, ONE_MINUS_DST_ALPHA=9, - INVALID=0xffffffff + INVALID=0xffffffff, ) # cull command @@ -70,7 +70,7 @@ BACK = 2, FRONT = 3, OFF = 4, - INVALID = 0xffffffff + INVALID = 0xffffffff, ) # stencil operation value @@ -106,7 +106,7 @@ Int32ul, SOLID=0, WIRE=1, - INVALID=0xffffffff + INVALID=0xffffffff, ) shader_type = Enum( @@ -114,7 +114,7 @@ VERTEX=0, PIXEL=1, GEOMETRY=2, - INVALID=0xffffffff + INVALID=0xffffffff, ) # seems to be a fancier version of point/bilinear/trilinear with extra trilinear/mipmap stuff @@ -126,7 +126,7 @@ FILTER_NEAREST_MIP_LINEAR=3, FILTER_LINEAR_MIP_NEAREST=4, FILTER_LINEAR_MIP_LINEAR=5, - FILTER_INVALID=0xffffffff + FILTER_INVALID=0xffffffff, ) tile_wrap_mode = Enum( From 7451642371d638e1aedeca9ed5afe3c19e4126c6 Mon Sep 17 00:00:00 2001 From: Henrique Gemignani Passos Lima Date: Sun, 14 Jul 2024 18:00:07 +0300 Subject: [PATCH 4/5] Use ruff's formatter --- .pre-commit-config.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ae7d7ffd..8ad5cef4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,4 +7,5 @@ repos: rev: v0.6.1 hooks: - id: ruff - args: [ --fix, --exit-non-zero-on-fix ] \ No newline at end of file + args: [ --fix, --exit-non-zero-on-fix ] + - id: ruff-format From fec15d1e500c889ae7ed0fbd46a3dea4a03320ca Mon Sep 17 00:00:00 2001 From: Henrique Gemignani Passos Lima Date: Tue, 20 Aug 2024 12:15:08 +0300 Subject: [PATCH 5/5] Run the formatter --- setup.py | 29 +- .../__pyinstaller/__init__.py | 1 + .../hook-mercury_engine_data_structures.py | 2 +- .../_dread_data_construct.py | 3 +- src/mercury_engine_data_structures/cli.py | 2 +- .../common_types.py | 112 +- .../construct_extensions/alignment.py | 11 +- .../construct_extensions/enum.py | 7 +- .../construct_extensions/function_complex.py | 18 +- .../construct_extensions/strings.py | 12 +- src/mercury_engine_data_structures/crc.py | 633 +- .../dread_data.py | 14 +- .../file_tree_editor.py | 48 +- .../formats/bapd.py | 2 +- .../formats/base_resource.py | 3 +- .../formats/bcmdl.py | 53 +- .../formats/bcskla.py | 190 +- .../formats/bctex.py | 59 +- .../formats/bldef.py | 2 +- .../formats/blut.py | 7 +- .../formats/bmbls.py | 2 +- .../formats/bmdefs.py | 31 +- .../formats/bmmap.py | 2 +- .../formats/bmmdef.py | 16 +- .../formats/bmsad.py | 157 +- .../formats/bmsas.py | 131 +- .../formats/bmsbk.py | 4 + .../formats/bmscc.py | 4 +- .../formats/bmscu.py | 2 +- .../formats/bmsld.py | 147 +- .../formats/bmslgroup.py | 2 +- .../formats/bmslink.py | 63 +- .../formats/bmsmd.py | 1 + .../formats/bmsmsd.py | 3 +- .../formats/bmsnav.py | 27 +- .../formats/bmssd.py | 13 +- .../formats/bmtre.py | 67 +- .../formats/bmtun.py | 8 +- .../formats/bnvib.py | 5 +- .../formats/bpsi.py | 22 +- .../formats/bptdat.py | 6 +- .../formats/brem.py | 2 +- .../formats/bres.py | 2 +- .../formats/brev.py | 2 +- .../formats/brfld.py | 9 +- .../formats/brsa.py | 2 +- .../formats/bsmat.py | 130 +- .../formats/btunda.py | 13 +- .../formats/buct.py | 36 +- .../formats/gui_files.py | 18 +- .../formats/ini.py | 4 +- .../formats/lua.py | 2 +- .../formats/pkg.py | 35 +- .../formats/property_enum.py | 8 +- .../formats/standard_format.py | 29 +- .../game_check.py | 19 +- src/mercury_engine_data_structures/object.py | 9 +- .../pointer_set.py | 15 +- .../samus_returns_data.py | 14 +- .../type_lib.py | 83 +- tests/conftest.py | 9 +- tests/formats/test_bcmdl.py | 47 +- tests/formats/test_bcskla.py | 4 +- tests/formats/test_bctex.py | 2 + tests/formats/test_blsnd.py | 1 + tests/formats/test_bmdefs.py | 1 + tests/formats/test_bmmap.py | 1 - tests/formats/test_bmmdef.py | 4 +- tests/formats/test_bmsad.py | 21 +- tests/formats/test_bmsbk.py | 1 + tests/formats/test_bmsld.py | 35 +- tests/formats/test_bmsnav.py | 2 + tests/formats/test_bmssd.py | 2 + tests/formats/test_bpsi.py | 1 + tests/formats/test_bptdat.py | 1 + tests/formats/test_bsmat.py | 10 +- tests/formats/test_btunda.py | 5 + tests/formats/test_buct.py | 1 + tests/formats/test_collision.py | 19 +- tests/formats/test_gui.py | 3 + tests/formats/test_lua.py | 85 +- tests/formats/test_pkg.py | 29 +- tests/formats/test_txt.py | 1 + tests/test_common_types.py | 3 +- tests/test_lib.py | 16 +- tests/test_object.py | 45 +- tests/test_pointer_set.py | 76 +- tests/test_type_lib.py | 371 +- tools/create_class_definitions.py | 47 +- tools/create_sr_file_names.py | 20 +- tools/extract_pkg.py | 8 +- tools/filter_file_names.py | 26 +- tools/ghidra_export.py | 160 +- tools/list_known_paths_in_toc.py | 12 +- tools/plot_simple_map.py | 6056 ++++++++--------- tools/sr_export_rdv_database.py | 202 +- tools/update_hashes_with_field_names.py | 12 +- 97 files changed, 5082 insertions(+), 4610 deletions(-) diff --git a/setup.py b/setup.py index 11599b2d..6ff6d170 100644 --- a/setup.py +++ b/setup.py @@ -8,17 +8,22 @@ def generate_property_templates(): - subprocess.run([ - sys.executable, - os.fspath(Path(__file__).parent.joinpath("tools", "create_class_definitions.py")), - "dread", - ], check=True) - subprocess.run([ - sys.executable, - os.fspath(Path(__file__).parent.joinpath("tools", "create_class_definitions.py")), - "sr", - ], check=True) - + subprocess.run( + [ + sys.executable, + os.fspath(Path(__file__).parent.joinpath("tools", "create_class_definitions.py")), + "dread", + ], + check=True, + ) + subprocess.run( + [ + sys.executable, + os.fspath(Path(__file__).parent.joinpath("tools", "create_class_definitions.py")), + "sr", + ], + check=True, + ) class BuildPyCommand(build_py): @@ -33,6 +38,6 @@ def run(self): setup( cmdclass={ - 'build_py': BuildPyCommand, + "build_py": BuildPyCommand, }, ) diff --git a/src/mercury_engine_data_structures/__pyinstaller/__init__.py b/src/mercury_engine_data_structures/__pyinstaller/__init__.py index b232646d..2e6eb36f 100644 --- a/src/mercury_engine_data_structures/__pyinstaller/__init__.py +++ b/src/mercury_engine_data_structures/__pyinstaller/__init__.py @@ -13,5 +13,6 @@ # This function returns a list containing only the path to this # directory, which is the location of these hooks. + def get_hook_dirs(): return [os.path.dirname(__file__)] diff --git a/src/mercury_engine_data_structures/__pyinstaller/hook-mercury_engine_data_structures.py b/src/mercury_engine_data_structures/__pyinstaller/hook-mercury_engine_data_structures.py index c6626041..43b3b311 100644 --- a/src/mercury_engine_data_structures/__pyinstaller/hook-mercury_engine_data_structures.py +++ b/src/mercury_engine_data_structures/__pyinstaller/hook-mercury_engine_data_structures.py @@ -2,4 +2,4 @@ # https://pyinstaller.readthedocs.io/en/stable/hooks.html#provide-hooks-with-package -datas = collect_data_files('mercury_engine_data_structures', excludes=['__pyinstaller']) +datas = collect_data_files("mercury_engine_data_structures", excludes=["__pyinstaller"]) diff --git a/src/mercury_engine_data_structures/_dread_data_construct.py b/src/mercury_engine_data_structures/_dread_data_construct.py index 44a681a8..5030ee42 100644 --- a/src/mercury_engine_data_structures/_dread_data_construct.py +++ b/src/mercury_engine_data_structures/_dread_data_construct.py @@ -8,6 +8,7 @@ class CompressedZSTD(construct.Tunnel): def __init__(self, subcon, level: int = 3): super().__init__(subcon) import zstd + self.lib = zstd self.level = level @@ -26,7 +27,7 @@ def __init__(self): construct.Sequence( construct.PascalString(construct.Int16un, "ascii"), # key construct.Int64un, # hash - ) + ), ) def _parse(self, stream, context, path) -> typing.Dict[str, int]: diff --git a/src/mercury_engine_data_structures/cli.py b/src/mercury_engine_data_structures/cli.py index 211870bb..15b22653 100644 --- a/src/mercury_engine_data_structures/cli.py +++ b/src/mercury_engine_data_structures/cli.py @@ -177,7 +177,7 @@ def decode_encode_compare_file(file_path: Path, game: Game, file_format: str): resource = resource_class.parse(raw, target_game=game) encoded = resource.build() - if raw != encoded and raw.rstrip(b"\xFF") != encoded: + if raw != encoded and raw.rstrip(b"\xff") != encoded: return f"{file_path}: Results differ (len(raw): {len(raw)}; len(encoded): {len(encoded)})" return None diff --git a/src/mercury_engine_data_structures/common_types.py b/src/mercury_engine_data_structures/common_types.py index 341bb981..80d31a8e 100644 --- a/src/mercury_engine_data_structures/common_types.py +++ b/src/mercury_engine_data_structures/common_types.py @@ -20,22 +20,23 @@ 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""" @@ -130,8 +128,12 @@ def __init__(self, subcon, *, allow_duplicates: bool = False): super().__init__(subcon) self.allow_duplicates = allow_duplicates - def _decode(self, obj: construct.ListContainer, context: construct.Container, path: str, - ) -> construct.ListContainer | construct.Container: + def _decode( + self, + obj: construct.ListContainer, + context: construct.Container, + path: str, + ) -> construct.ListContainer | construct.Container: result = construct.Container() for item in obj: key = item.key @@ -142,14 +144,15 @@ def _decode(self, obj: construct.ListContainer, context: construct.Container, pa result[key] = item.value return result - def _encode(self, obj: construct.ListContainer | construct.Container, context: construct.Container, path: str, - ) -> list: + def _encode( + self, + obj: construct.ListContainer | construct.Container, + context: construct.Container, + path: str, + ) -> list: if self.allow_duplicates and isinstance(obj, list): return obj - return construct.ListContainer( - construct.Container(key=type_, value=item) - for type_, item in obj.items() - ) + return construct.ListContainer(construct.Container(key=type_, value=item) for type_, item in obj.items()) def _emitparse(self, code): fname = f"parse_dict_adapter_{code.allocateId()}" @@ -200,9 +203,15 @@ def __init__(self, field, key=StrId): def _parse(self, stream, context, path): context = construct.Container( - _=context, _params=context._params, _root=None, _parsing=context._parsing, - _building=context._building, _sizing=context._sizing, _io=stream, - _index=context.get("_index", None)) + _=context, + _params=context._params, + _root=None, + _parsing=context._parsing, + _building=context._building, + _sizing=context._sizing, + _io=stream, + _index=context.get("_index", None), + ) context._root = context._.get("_root", context) key = self.key._parsereport(stream, context, path) @@ -215,9 +224,15 @@ def _parse(self, stream, context, path): def _build(self, obj, stream, context, path): context = construct.Container( - _=context, _params=context._params, _root=None, _parsing=context._parsing, - _building=context._building, _sizing=context._sizing, _io=stream, - _index=context.get("_index", None)) + _=context, + _params=context._params, + _root=None, + _parsing=context._parsing, + _building=context._building, + _sizing=context._sizing, + _io=stream, + _index=context.get("_index", None), + ) context._root = context._.get("_root", context) key = self.key._build(obj.key, stream, context, path) @@ -230,9 +245,15 @@ def _build(self, obj, stream, context, path): def _sizeof(self, context, path): context = construct.Container( - _=context, _params=context._params, _root=None, _parsing=context._parsing, - _building=context._building, _sizing=context._sizing, _io=None, - _index=context.get("_index", None)) + _=context, + _params=context._params, + _root=None, + _parsing=context._parsing, + _building=context._building, + _sizing=context._sizing, + _io=None, + _index=context.get("_index", None), + ) context._root = context._.get("_root", context) key = self.key._sizeof(context, path) @@ -279,8 +300,12 @@ def {fname}(obj, io, this): class DictConstruct(construct.Construct): - def __init__(self, key_type: construct.Construct, value_type: construct.Construct, - count_type: construct.Construct = construct.Int32ul): + def __init__( + self, + key_type: construct.Construct, + value_type: construct.Construct, + count_type: construct.Construct = construct.Int32ul, + ): super().__init__() self.key_type = key_type self.value_type = value_type @@ -326,9 +351,11 @@ def {fname}(key, value, io, this): {self.value_type._compilebuild(code)} """ code.append(block) - return (f"(reuse(len(obj), " - f"lambda obj: {self.count_type._compilebuild(code)}), " - f"list({fname}(key, value, io, this) for key, value in obj.items()), obj)[2]") + return ( + f"(reuse(len(obj), " + f"lambda obj: {self.count_type._compilebuild(code)}), " + f"list({fname}(key, value, io, this) for key, value in obj.items()), obj)[2]" + ) def make_dict(value: construct.Construct, key=StrId): @@ -355,30 +382,31 @@ def make_vector(value: construct.Construct): if hasattr(value, "_emitparse_vector"): _emitparse = value._emitparse_vector else: + def _emitparse(code: construct.CodeGen) -> str: - return (f"ListContainer(({value._compileparse(code)}) " - f"for i in range({construct.Int32ul._compileparse(code)}))") + return ( + f"ListContainer(({value._compileparse(code)}) " + f"for i in range({construct.Int32ul._compileparse(code)}))" + ) result._emitparse = _emitparse def _emitbuild(code): - return (f"(reuse(len(obj), lambda obj: {construct.Int32ul._compilebuild(code)})," - f" list({value._compilebuild(code)} for obj in obj), obj)[2]") + return ( + f"(reuse(len(obj), lambda obj: {construct.Int32ul._compilebuild(code)})," + f" list({value._compilebuild(code)} for obj in obj), obj)[2]" + ) result._emitbuild = _emitbuild return result -def make_enum(values: typing.Union[typing.List[str], typing.Dict[str, int]], *, - add_invalid: bool = True): +def make_enum(values: typing.Union[typing.List[str], typing.Dict[str, int]], *, add_invalid: bool = True): if isinstance(values, dict): mapping = copy.copy(values) else: - mapping = { - name: i - for i, name in enumerate(values) - } + mapping = {name: i for i, name in enumerate(values)} if add_invalid: - mapping["Invalid"] = 0x7fffffff + mapping["Invalid"] = 0x7FFFFFFF return construct.Enum(construct.Int32ul, **mapping) diff --git a/src/mercury_engine_data_structures/construct_extensions/alignment.py b/src/mercury_engine_data_structures/construct_extensions/alignment.py index 909c0653..f15016a3 100644 --- a/src/mercury_engine_data_structures/construct_extensions/alignment.py +++ b/src/mercury_engine_data_structures/construct_extensions/alignment.py @@ -6,7 +6,7 @@ class AlignTo(Construct): - def __init__(self, modulus, pattern = b"\x00"): + def __init__(self, modulus, pattern=b"\x00"): super().__init__() self.modulus = modulus self.pattern = pattern @@ -29,7 +29,7 @@ def _build(self, obj, stream, context, path): class AlignedPrefixed(Subconstruct): - def __init__(self, length_field, subcon, modulus, length_size, pad_byte=b"\xFF"): + def __init__(self, length_field, subcon, modulus, length_size, pad_byte=b"\xff"): super().__init__(subcon) self.length_field = length_field self.modulus = modulus @@ -112,13 +112,14 @@ def PrefixedAllowZeroLen(lengthfield, subcon, includelengthfield=False): return FocusedSeq( "prefixed", "len" / Peek(lengthfield), - "prefixed" / Prefixed( + "prefixed" + / Prefixed( lengthfield, IfThenElse( construct.this._parsing, If(construct.this.len > 0, subcon), If(construct.this.prefixed, subcon), ), - includelengthfield - ) + includelengthfield, + ), ) diff --git a/src/mercury_engine_data_structures/construct_extensions/enum.py b/src/mercury_engine_data_structures/construct_extensions/enum.py index f9363a1b..6631fdd9 100644 --- a/src/mercury_engine_data_structures/construct_extensions/enum.py +++ b/src/mercury_engine_data_structures/construct_extensions/enum.py @@ -24,10 +24,7 @@ def _encode(self, obj: typing.Union[str, enum.IntEnum, int], context, path) -> i def _emitbuild(self, code: construct.CodeGen): i = code.allocateId() - mapping = ", ".join( - f"{repr(enum_entry.name)}: {enum_entry.value}" - for enum_entry in self.enum_class - ) + mapping = ", ".join(f"{repr(enum_entry.name)}: {enum_entry.value}" for enum_entry in self.enum_class) code.append(f""" _enum_name_to_value_{i} = {{{mapping}}} @@ -45,5 +42,5 @@ def _encode_enum_{i}(obj, io, this): def BitMaskEnum(enum_type: typing.Type[enum.IntEnum]): flags = {} for enumentry in enum_type: - flags[enumentry.name] = 2 ** enumentry.value + flags[enumentry.name] = 2**enumentry.value return construct.FlagsEnum(construct.Int32ul, **flags) diff --git a/src/mercury_engine_data_structures/construct_extensions/function_complex.py b/src/mercury_engine_data_structures/construct_extensions/function_complex.py index a6bf71bf..7382290a 100644 --- a/src/mercury_engine_data_structures/construct_extensions/function_complex.py +++ b/src/mercury_engine_data_structures/construct_extensions/function_complex.py @@ -15,9 +15,9 @@ def _resolve_id(type_class: Union[construct.Construct, Type[construct.Construct] def emit_switch_cases_parse( - code: construct.CodeGen, - fields: Dict[Union[str, int], Union[construct.Construct, Type[construct.Construct]]], - custom_table_name: Optional[str] = None, + code: construct.CodeGen, + fields: Dict[Union[str, int], Union[construct.Construct, Type[construct.Construct]]], + custom_table_name: Optional[str] = None, ) -> str: """Construct codegen helper for handling the switch cases dict in _emitparse.""" table_name = custom_table_name @@ -47,9 +47,9 @@ def {code_name}(io, this): def emit_switch_cases_build( - code: construct.CodeGen, - fields: Dict[Union[str, int], Union[construct.Construct, Type[construct.Construct]]], - custom_table_name: Optional[str] = None, + code: construct.CodeGen, + fields: Dict[Union[str, int], Union[construct.Construct, Type[construct.Construct]]], + custom_table_name: Optional[str] = None, ) -> str: """Construct codegen helper for handling the switch cases dict in _emitbuild.""" table_name = custom_table_name @@ -113,8 +113,10 @@ def _emitparse(self, code): ) def _emitbuild(self, code): - return (f"(({self.thensubcon._compilebuild(code)}) if (" - f"{self._insert_cond(code)}) else ({self.elsesubcon._compilebuild(code)}))") + return ( + f"(({self.thensubcon._compilebuild(code)}) if (" + f"{self._insert_cond(code)}) else ({self.elsesubcon._compilebuild(code)}))" + ) def ComplexIf(condfunc, subcon): diff --git a/src/mercury_engine_data_structures/construct_extensions/strings.py b/src/mercury_engine_data_structures/construct_extensions/strings.py index 21db7615..32e51178 100644 --- a/src/mercury_engine_data_structures/construct_extensions/strings.py +++ b/src/mercury_engine_data_structures/construct_extensions/strings.py @@ -96,8 +96,10 @@ def _emitbuild(code: construct.CodeGen): i = code.allocateId() code.append(f"def add_prefix_{i}(io, obj): return {lengthfield._compilebuild(code)}") - return (f"reuse(obj.encode({repr(encoding)})," - f" lambda encoded: (add_prefix_{i}(io, len(encoded)), io.write(encoded)))") + return ( + f"reuse(obj.encode({repr(encoding)})," + f" lambda encoded: (add_prefix_{i}(io, len(encoded)), io.write(encoded)))" + ) macro._emitbuild = _emitbuild @@ -237,8 +239,10 @@ def write_padding_to(length: int, io) -> None: io.write(b"\\x00" * length) """) - return (f"reuse(obj.encode({repr(encoding)})," - f" lambda encoded: (io.write(encoded), write_padding_to({length} - len(encoded), io), obj)[-1])") + return ( + f"reuse(obj.encode({repr(encoding)})," + f" lambda encoded: (io.write(encoded), write_padding_to({length} - len(encoded), io), obj)[-1])" + ) macro._emitparse = _emitparse macro._emitbuild = _emitbuild diff --git a/src/mercury_engine_data_structures/crc.py b/src/mercury_engine_data_structures/crc.py index 9f164ab8..88625e4a 100644 --- a/src/mercury_engine_data_structures/crc.py +++ b/src/mercury_engine_data_structures/crc.py @@ -1,127 +1,524 @@ """ Module for calculating CRC hashes with the algorithm and data used by Mercury Engine. """ + import typing _crc32_constants = [ - 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, - 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, - 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, - 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, - 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, - 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, - 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, - 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, - 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, - 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, - 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, - 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, - 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, - 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, - 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, - 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, - 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, - 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, - 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, - 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, - 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, - 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, - 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, - 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, - 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, - 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, - 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, - 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, - 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, - 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, - 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, - 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, - 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, - 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, - 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, - 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, - 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, - 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, - 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, - 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, - 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, - 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, - 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, - 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, - 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, - 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, - 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, - 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, - 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, - 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, - 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, - 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, - 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, - 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, - 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, - 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, - 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, - 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, - 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, - 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, - 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, - 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, - 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, - 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D, + 0x00000000, + 0x77073096, + 0xEE0E612C, + 0x990951BA, + 0x076DC419, + 0x706AF48F, + 0xE963A535, + 0x9E6495A3, + 0x0EDB8832, + 0x79DCB8A4, + 0xE0D5E91E, + 0x97D2D988, + 0x09B64C2B, + 0x7EB17CBD, + 0xE7B82D07, + 0x90BF1D91, + 0x1DB71064, + 0x6AB020F2, + 0xF3B97148, + 0x84BE41DE, + 0x1ADAD47D, + 0x6DDDE4EB, + 0xF4D4B551, + 0x83D385C7, + 0x136C9856, + 0x646BA8C0, + 0xFD62F97A, + 0x8A65C9EC, + 0x14015C4F, + 0x63066CD9, + 0xFA0F3D63, + 0x8D080DF5, + 0x3B6E20C8, + 0x4C69105E, + 0xD56041E4, + 0xA2677172, + 0x3C03E4D1, + 0x4B04D447, + 0xD20D85FD, + 0xA50AB56B, + 0x35B5A8FA, + 0x42B2986C, + 0xDBBBC9D6, + 0xACBCF940, + 0x32D86CE3, + 0x45DF5C75, + 0xDCD60DCF, + 0xABD13D59, + 0x26D930AC, + 0x51DE003A, + 0xC8D75180, + 0xBFD06116, + 0x21B4F4B5, + 0x56B3C423, + 0xCFBA9599, + 0xB8BDA50F, + 0x2802B89E, + 0x5F058808, + 0xC60CD9B2, + 0xB10BE924, + 0x2F6F7C87, + 0x58684C11, + 0xC1611DAB, + 0xB6662D3D, + 0x76DC4190, + 0x01DB7106, + 0x98D220BC, + 0xEFD5102A, + 0x71B18589, + 0x06B6B51F, + 0x9FBFE4A5, + 0xE8B8D433, + 0x7807C9A2, + 0x0F00F934, + 0x9609A88E, + 0xE10E9818, + 0x7F6A0DBB, + 0x086D3D2D, + 0x91646C97, + 0xE6635C01, + 0x6B6B51F4, + 0x1C6C6162, + 0x856530D8, + 0xF262004E, + 0x6C0695ED, + 0x1B01A57B, + 0x8208F4C1, + 0xF50FC457, + 0x65B0D9C6, + 0x12B7E950, + 0x8BBEB8EA, + 0xFCB9887C, + 0x62DD1DDF, + 0x15DA2D49, + 0x8CD37CF3, + 0xFBD44C65, + 0x4DB26158, + 0x3AB551CE, + 0xA3BC0074, + 0xD4BB30E2, + 0x4ADFA541, + 0x3DD895D7, + 0xA4D1C46D, + 0xD3D6F4FB, + 0x4369E96A, + 0x346ED9FC, + 0xAD678846, + 0xDA60B8D0, + 0x44042D73, + 0x33031DE5, + 0xAA0A4C5F, + 0xDD0D7CC9, + 0x5005713C, + 0x270241AA, + 0xBE0B1010, + 0xC90C2086, + 0x5768B525, + 0x206F85B3, + 0xB966D409, + 0xCE61E49F, + 0x5EDEF90E, + 0x29D9C998, + 0xB0D09822, + 0xC7D7A8B4, + 0x59B33D17, + 0x2EB40D81, + 0xB7BD5C3B, + 0xC0BA6CAD, + 0xEDB88320, + 0x9ABFB3B6, + 0x03B6E20C, + 0x74B1D29A, + 0xEAD54739, + 0x9DD277AF, + 0x04DB2615, + 0x73DC1683, + 0xE3630B12, + 0x94643B84, + 0x0D6D6A3E, + 0x7A6A5AA8, + 0xE40ECF0B, + 0x9309FF9D, + 0x0A00AE27, + 0x7D079EB1, + 0xF00F9344, + 0x8708A3D2, + 0x1E01F268, + 0x6906C2FE, + 0xF762575D, + 0x806567CB, + 0x196C3671, + 0x6E6B06E7, + 0xFED41B76, + 0x89D32BE0, + 0x10DA7A5A, + 0x67DD4ACC, + 0xF9B9DF6F, + 0x8EBEEFF9, + 0x17B7BE43, + 0x60B08ED5, + 0xD6D6A3E8, + 0xA1D1937E, + 0x38D8C2C4, + 0x4FDFF252, + 0xD1BB67F1, + 0xA6BC5767, + 0x3FB506DD, + 0x48B2364B, + 0xD80D2BDA, + 0xAF0A1B4C, + 0x36034AF6, + 0x41047A60, + 0xDF60EFC3, + 0xA867DF55, + 0x316E8EEF, + 0x4669BE79, + 0xCB61B38C, + 0xBC66831A, + 0x256FD2A0, + 0x5268E236, + 0xCC0C7795, + 0xBB0B4703, + 0x220216B9, + 0x5505262F, + 0xC5BA3BBE, + 0xB2BD0B28, + 0x2BB45A92, + 0x5CB36A04, + 0xC2D7FFA7, + 0xB5D0CF31, + 0x2CD99E8B, + 0x5BDEAE1D, + 0x9B64C2B0, + 0xEC63F226, + 0x756AA39C, + 0x026D930A, + 0x9C0906A9, + 0xEB0E363F, + 0x72076785, + 0x05005713, + 0x95BF4A82, + 0xE2B87A14, + 0x7BB12BAE, + 0x0CB61B38, + 0x92D28E9B, + 0xE5D5BE0D, + 0x7CDCEFB7, + 0x0BDBDF21, + 0x86D3D2D4, + 0xF1D4E242, + 0x68DDB3F8, + 0x1FDA836E, + 0x81BE16CD, + 0xF6B9265B, + 0x6FB077E1, + 0x18B74777, + 0x88085AE6, + 0xFF0F6A70, + 0x66063BCA, + 0x11010B5C, + 0x8F659EFF, + 0xF862AE69, + 0x616BFFD3, + 0x166CCF45, + 0xA00AE278, + 0xD70DD2EE, + 0x4E048354, + 0x3903B3C2, + 0xA7672661, + 0xD06016F7, + 0x4969474D, + 0x3E6E77DB, + 0xAED16A4A, + 0xD9D65ADC, + 0x40DF0B66, + 0x37D83BF0, + 0xA9BCAE53, + 0xDEBB9EC5, + 0x47B2CF7F, + 0x30B5FFE9, + 0xBDBDF21C, + 0xCABAC28A, + 0x53B39330, + 0x24B4A3A6, + 0xBAD03605, + 0xCDD70693, + 0x54DE5729, + 0x23D967BF, + 0xB3667A2E, + 0xC4614AB8, + 0x5D681B02, + 0x2A6F2B94, + 0xB40BBE37, + 0xC30C8EA1, + 0x5A05DF1B, + 0x2D02EF8D, ] _crc64_constants = [ - 0x0000000000000000, 0xB32E4CBE03A75F6F, 0xF4843657A840A05B, 0x47AA7AE9ABE7FF34, 0x7BD0C384FF8F5E33, - 0xC8FE8F3AFC28015C, 0x8F54F5D357CFFE68, 0x3C7AB96D5468A107, 0xF7A18709FF1EBC66, 0x448FCBB7FCB9E309, - 0x0325B15E575E1C3D, 0xB00BFDE054F94352, 0x8C71448D0091E255, 0x3F5F08330336BD3A, 0x78F572DAA8D1420E, - 0xCBDB3E64AB761D61, 0x7D9BA13851336649, 0xCEB5ED8652943926, 0x891F976FF973C612, 0x3A31DBD1FAD4997D, - 0x064B62BCAEBC387A, 0xB5652E02AD1B6715, 0xF2CF54EB06FC9821, 0x41E11855055BC74E, 0x8A3A2631AE2DDA2F, - 0x39146A8FAD8A8540, 0x7EBE1066066D7A74, 0xCD905CD805CA251B, 0xF1EAE5B551A2841C, 0x42C4A90B5205DB73, - 0x056ED3E2F9E22447, 0xB6409F5CFA457B28, 0xFB374270A266CC92, 0x48190ECEA1C193FD, 0x0FB374270A266CC9, - 0xBC9D3899098133A6, 0x80E781F45DE992A1, 0x33C9CD4A5E4ECDCE, 0x7463B7A3F5A932FA, 0xC74DFB1DF60E6D95, - 0x0C96C5795D7870F4, 0xBFB889C75EDF2F9B, 0xF812F32EF538D0AF, 0x4B3CBF90F69F8FC0, 0x774606FDA2F72EC7, - 0xC4684A43A15071A8, 0x83C230AA0AB78E9C, 0x30EC7C140910D1F3, 0x86ACE348F355AADB, 0x3582AFF6F0F2F5B4, - 0x7228D51F5B150A80, 0xC10699A158B255EF, 0xFD7C20CC0CDAF4E8, 0x4E526C720F7DAB87, 0x09F8169BA49A54B3, - 0xBAD65A25A73D0BDC, 0x710D64410C4B16BD, 0xC22328FF0FEC49D2, 0x85895216A40BB6E6, 0x36A71EA8A7ACE989, - 0x0ADDA7C5F3C4488E, 0xB9F3EB7BF06317E1, 0xFE5991925B84E8D5, 0x4D77DD2C5823B7BA, 0x64B62BCAEBC387A1, - 0xD7986774E864D8CE, 0x90321D9D438327FA, 0x231C512340247895, 0x1F66E84E144CD992, 0xAC48A4F017EB86FD, - 0xEBE2DE19BC0C79C9, 0x58CC92A7BFAB26A6, 0x9317ACC314DD3BC7, 0x2039E07D177A64A8, 0x67939A94BC9D9B9C, - 0xD4BDD62ABF3AC4F3, 0xE8C76F47EB5265F4, 0x5BE923F9E8F53A9B, 0x1C4359104312C5AF, 0xAF6D15AE40B59AC0, - 0x192D8AF2BAF0E1E8, 0xAA03C64CB957BE87, 0xEDA9BCA512B041B3, 0x5E87F01B11171EDC, 0x62FD4976457FBFDB, - 0xD1D305C846D8E0B4, 0x96797F21ED3F1F80, 0x2557339FEE9840EF, 0xEE8C0DFB45EE5D8E, 0x5DA24145464902E1, - 0x1A083BACEDAEFDD5, 0xA9267712EE09A2BA, 0x955CCE7FBA6103BD, 0x267282C1B9C65CD2, 0x61D8F8281221A3E6, - 0xD2F6B4961186FC89, 0x9F8169BA49A54B33, 0x2CAF25044A02145C, 0x6B055FEDE1E5EB68, 0xD82B1353E242B407, - 0xE451AA3EB62A1500, 0x577FE680B58D4A6F, 0x10D59C691E6AB55B, 0xA3FBD0D71DCDEA34, 0x6820EEB3B6BBF755, - 0xDB0EA20DB51CA83A, 0x9CA4D8E41EFB570E, 0x2F8A945A1D5C0861, 0x13F02D374934A966, 0xA0DE61894A93F609, - 0xE7741B60E174093D, 0x545A57DEE2D35652, 0xE21AC88218962D7A, 0x5134843C1B317215, 0x169EFED5B0D68D21, - 0xA5B0B26BB371D24E, 0x99CA0B06E7197349, 0x2AE447B8E4BE2C26, 0x6D4E3D514F59D312, 0xDE6071EF4CFE8C7D, - 0x15BB4F8BE788911C, 0xA6950335E42FCE73, 0xE13F79DC4FC83147, 0x521135624C6F6E28, 0x6E6B8C0F1807CF2F, - 0xDD45C0B11BA09040, 0x9AEFBA58B0476F74, 0x29C1F6E6B3E0301B, 0xC96C5795D7870F42, 0x7A421B2BD420502D, - 0x3DE861C27FC7AF19, 0x8EC62D7C7C60F076, 0xB2BC941128085171, 0x0192D8AF2BAF0E1E, 0x4638A2468048F12A, - 0xF516EEF883EFAE45, 0x3ECDD09C2899B324, 0x8DE39C222B3EEC4B, 0xCA49E6CB80D9137F, 0x7967AA75837E4C10, - 0x451D1318D716ED17, 0xF6335FA6D4B1B278, 0xB199254F7F564D4C, 0x02B769F17CF11223, 0xB4F7F6AD86B4690B, - 0x07D9BA1385133664, 0x4073C0FA2EF4C950, 0xF35D8C442D53963F, 0xCF273529793B3738, 0x7C0979977A9C6857, - 0x3BA3037ED17B9763, 0x888D4FC0D2DCC80C, 0x435671A479AAD56D, 0xF0783D1A7A0D8A02, 0xB7D247F3D1EA7536, - 0x04FC0B4DD24D2A59, 0x3886B22086258B5E, 0x8BA8FE9E8582D431, 0xCC0284772E652B05, 0x7F2CC8C92DC2746A, - 0x325B15E575E1C3D0, 0x8175595B76469CBF, 0xC6DF23B2DDA1638B, 0x75F16F0CDE063CE4, 0x498BD6618A6E9DE3, - 0xFAA59ADF89C9C28C, 0xBD0FE036222E3DB8, 0x0E21AC88218962D7, 0xC5FA92EC8AFF7FB6, 0x76D4DE52895820D9, - 0x317EA4BB22BFDFED, 0x8250E80521188082, 0xBE2A516875702185, 0x0D041DD676D77EEA, 0x4AAE673FDD3081DE, - 0xF9802B81DE97DEB1, 0x4FC0B4DD24D2A599, 0xFCEEF8632775FAF6, 0xBB44828A8C9205C2, 0x086ACE348F355AAD, - 0x34107759DB5DFBAA, 0x873E3BE7D8FAA4C5, 0xC094410E731D5BF1, 0x73BA0DB070BA049E, 0xB86133D4DBCC19FF, - 0x0B4F7F6AD86B4690, 0x4CE50583738CB9A4, 0xFFCB493D702BE6CB, 0xC3B1F050244347CC, 0x709FBCEE27E418A3, - 0x3735C6078C03E797, 0x841B8AB98FA4B8F8, 0xADDA7C5F3C4488E3, 0x1EF430E13FE3D78C, 0x595E4A08940428B8, - 0xEA7006B697A377D7, 0xD60ABFDBC3CBD6D0, 0x6524F365C06C89BF, 0x228E898C6B8B768B, 0x91A0C532682C29E4, - 0x5A7BFB56C35A3485, 0xE955B7E8C0FD6BEA, 0xAEFFCD016B1A94DE, 0x1DD181BF68BDCBB1, 0x21AB38D23CD56AB6, - 0x9285746C3F7235D9, 0xD52F0E859495CAED, 0x6601423B97329582, 0xD041DD676D77EEAA, 0x636F91D96ED0B1C5, - 0x24C5EB30C5374EF1, 0x97EBA78EC690119E, 0xAB911EE392F8B099, 0x18BF525D915FEFF6, 0x5F1528B43AB810C2, - 0xEC3B640A391F4FAD, 0x27E05A6E926952CC, 0x94CE16D091CE0DA3, 0xD3646C393A29F297, 0x604A2087398EADF8, - 0x5C3099EA6DE60CFF, 0xEF1ED5546E415390, 0xA8B4AFBDC5A6ACA4, 0x1B9AE303C601F3CB, 0x56ED3E2F9E224471, - 0xE5C372919D851B1E, 0xA26908783662E42A, 0x114744C635C5BB45, 0x2D3DFDAB61AD1A42, 0x9E13B115620A452D, - 0xD9B9CBFCC9EDBA19, 0x6A978742CA4AE576, 0xA14CB926613CF817, 0x1262F598629BA778, 0x55C88F71C97C584C, - 0xE6E6C3CFCADB0723, 0xDA9C7AA29EB3A624, 0x69B2361C9D14F94B, 0x2E184CF536F3067F, 0x9D36004B35545910, - 0x2B769F17CF112238, 0x9858D3A9CCB67D57, 0xDFF2A94067518263, 0x6CDCE5FE64F6DD0C, 0x50A65C93309E7C0B, - 0xE388102D33392364, 0xA4226AC498DEDC50, 0x170C267A9B79833F, 0xDCD7181E300F9E5E, 0x6FF954A033A8C131, - 0x28532E49984F3E05, 0x9B7D62F79BE8616A, 0xA707DB9ACF80C06D, 0x14299724CC279F02, 0x5383EDCD67C06036, + 0x0000000000000000, + 0xB32E4CBE03A75F6F, + 0xF4843657A840A05B, + 0x47AA7AE9ABE7FF34, + 0x7BD0C384FF8F5E33, + 0xC8FE8F3AFC28015C, + 0x8F54F5D357CFFE68, + 0x3C7AB96D5468A107, + 0xF7A18709FF1EBC66, + 0x448FCBB7FCB9E309, + 0x0325B15E575E1C3D, + 0xB00BFDE054F94352, + 0x8C71448D0091E255, + 0x3F5F08330336BD3A, + 0x78F572DAA8D1420E, + 0xCBDB3E64AB761D61, + 0x7D9BA13851336649, + 0xCEB5ED8652943926, + 0x891F976FF973C612, + 0x3A31DBD1FAD4997D, + 0x064B62BCAEBC387A, + 0xB5652E02AD1B6715, + 0xF2CF54EB06FC9821, + 0x41E11855055BC74E, + 0x8A3A2631AE2DDA2F, + 0x39146A8FAD8A8540, + 0x7EBE1066066D7A74, + 0xCD905CD805CA251B, + 0xF1EAE5B551A2841C, + 0x42C4A90B5205DB73, + 0x056ED3E2F9E22447, + 0xB6409F5CFA457B28, + 0xFB374270A266CC92, + 0x48190ECEA1C193FD, + 0x0FB374270A266CC9, + 0xBC9D3899098133A6, + 0x80E781F45DE992A1, + 0x33C9CD4A5E4ECDCE, + 0x7463B7A3F5A932FA, + 0xC74DFB1DF60E6D95, + 0x0C96C5795D7870F4, + 0xBFB889C75EDF2F9B, + 0xF812F32EF538D0AF, + 0x4B3CBF90F69F8FC0, + 0x774606FDA2F72EC7, + 0xC4684A43A15071A8, + 0x83C230AA0AB78E9C, + 0x30EC7C140910D1F3, + 0x86ACE348F355AADB, + 0x3582AFF6F0F2F5B4, + 0x7228D51F5B150A80, + 0xC10699A158B255EF, + 0xFD7C20CC0CDAF4E8, + 0x4E526C720F7DAB87, + 0x09F8169BA49A54B3, + 0xBAD65A25A73D0BDC, + 0x710D64410C4B16BD, + 0xC22328FF0FEC49D2, + 0x85895216A40BB6E6, + 0x36A71EA8A7ACE989, + 0x0ADDA7C5F3C4488E, + 0xB9F3EB7BF06317E1, + 0xFE5991925B84E8D5, + 0x4D77DD2C5823B7BA, + 0x64B62BCAEBC387A1, + 0xD7986774E864D8CE, + 0x90321D9D438327FA, + 0x231C512340247895, + 0x1F66E84E144CD992, + 0xAC48A4F017EB86FD, + 0xEBE2DE19BC0C79C9, + 0x58CC92A7BFAB26A6, + 0x9317ACC314DD3BC7, + 0x2039E07D177A64A8, + 0x67939A94BC9D9B9C, + 0xD4BDD62ABF3AC4F3, + 0xE8C76F47EB5265F4, + 0x5BE923F9E8F53A9B, + 0x1C4359104312C5AF, + 0xAF6D15AE40B59AC0, + 0x192D8AF2BAF0E1E8, + 0xAA03C64CB957BE87, + 0xEDA9BCA512B041B3, + 0x5E87F01B11171EDC, + 0x62FD4976457FBFDB, + 0xD1D305C846D8E0B4, + 0x96797F21ED3F1F80, + 0x2557339FEE9840EF, + 0xEE8C0DFB45EE5D8E, + 0x5DA24145464902E1, + 0x1A083BACEDAEFDD5, + 0xA9267712EE09A2BA, + 0x955CCE7FBA6103BD, + 0x267282C1B9C65CD2, + 0x61D8F8281221A3E6, + 0xD2F6B4961186FC89, + 0x9F8169BA49A54B33, + 0x2CAF25044A02145C, + 0x6B055FEDE1E5EB68, + 0xD82B1353E242B407, + 0xE451AA3EB62A1500, + 0x577FE680B58D4A6F, + 0x10D59C691E6AB55B, + 0xA3FBD0D71DCDEA34, + 0x6820EEB3B6BBF755, + 0xDB0EA20DB51CA83A, + 0x9CA4D8E41EFB570E, + 0x2F8A945A1D5C0861, + 0x13F02D374934A966, + 0xA0DE61894A93F609, + 0xE7741B60E174093D, + 0x545A57DEE2D35652, + 0xE21AC88218962D7A, + 0x5134843C1B317215, + 0x169EFED5B0D68D21, + 0xA5B0B26BB371D24E, + 0x99CA0B06E7197349, + 0x2AE447B8E4BE2C26, + 0x6D4E3D514F59D312, + 0xDE6071EF4CFE8C7D, + 0x15BB4F8BE788911C, + 0xA6950335E42FCE73, + 0xE13F79DC4FC83147, + 0x521135624C6F6E28, + 0x6E6B8C0F1807CF2F, + 0xDD45C0B11BA09040, + 0x9AEFBA58B0476F74, + 0x29C1F6E6B3E0301B, + 0xC96C5795D7870F42, + 0x7A421B2BD420502D, + 0x3DE861C27FC7AF19, + 0x8EC62D7C7C60F076, + 0xB2BC941128085171, + 0x0192D8AF2BAF0E1E, + 0x4638A2468048F12A, + 0xF516EEF883EFAE45, + 0x3ECDD09C2899B324, + 0x8DE39C222B3EEC4B, + 0xCA49E6CB80D9137F, + 0x7967AA75837E4C10, + 0x451D1318D716ED17, + 0xF6335FA6D4B1B278, + 0xB199254F7F564D4C, + 0x02B769F17CF11223, + 0xB4F7F6AD86B4690B, + 0x07D9BA1385133664, + 0x4073C0FA2EF4C950, + 0xF35D8C442D53963F, + 0xCF273529793B3738, + 0x7C0979977A9C6857, + 0x3BA3037ED17B9763, + 0x888D4FC0D2DCC80C, + 0x435671A479AAD56D, + 0xF0783D1A7A0D8A02, + 0xB7D247F3D1EA7536, + 0x04FC0B4DD24D2A59, + 0x3886B22086258B5E, + 0x8BA8FE9E8582D431, + 0xCC0284772E652B05, + 0x7F2CC8C92DC2746A, + 0x325B15E575E1C3D0, + 0x8175595B76469CBF, + 0xC6DF23B2DDA1638B, + 0x75F16F0CDE063CE4, + 0x498BD6618A6E9DE3, + 0xFAA59ADF89C9C28C, + 0xBD0FE036222E3DB8, + 0x0E21AC88218962D7, + 0xC5FA92EC8AFF7FB6, + 0x76D4DE52895820D9, + 0x317EA4BB22BFDFED, + 0x8250E80521188082, + 0xBE2A516875702185, + 0x0D041DD676D77EEA, + 0x4AAE673FDD3081DE, + 0xF9802B81DE97DEB1, + 0x4FC0B4DD24D2A599, + 0xFCEEF8632775FAF6, + 0xBB44828A8C9205C2, + 0x086ACE348F355AAD, + 0x34107759DB5DFBAA, + 0x873E3BE7D8FAA4C5, + 0xC094410E731D5BF1, + 0x73BA0DB070BA049E, + 0xB86133D4DBCC19FF, + 0x0B4F7F6AD86B4690, + 0x4CE50583738CB9A4, + 0xFFCB493D702BE6CB, + 0xC3B1F050244347CC, + 0x709FBCEE27E418A3, + 0x3735C6078C03E797, + 0x841B8AB98FA4B8F8, + 0xADDA7C5F3C4488E3, + 0x1EF430E13FE3D78C, + 0x595E4A08940428B8, + 0xEA7006B697A377D7, + 0xD60ABFDBC3CBD6D0, + 0x6524F365C06C89BF, + 0x228E898C6B8B768B, + 0x91A0C532682C29E4, + 0x5A7BFB56C35A3485, + 0xE955B7E8C0FD6BEA, + 0xAEFFCD016B1A94DE, + 0x1DD181BF68BDCBB1, + 0x21AB38D23CD56AB6, + 0x9285746C3F7235D9, + 0xD52F0E859495CAED, + 0x6601423B97329582, + 0xD041DD676D77EEAA, + 0x636F91D96ED0B1C5, + 0x24C5EB30C5374EF1, + 0x97EBA78EC690119E, + 0xAB911EE392F8B099, + 0x18BF525D915FEFF6, + 0x5F1528B43AB810C2, + 0xEC3B640A391F4FAD, + 0x27E05A6E926952CC, + 0x94CE16D091CE0DA3, + 0xD3646C393A29F297, + 0x604A2087398EADF8, + 0x5C3099EA6DE60CFF, + 0xEF1ED5546E415390, + 0xA8B4AFBDC5A6ACA4, + 0x1B9AE303C601F3CB, + 0x56ED3E2F9E224471, + 0xE5C372919D851B1E, + 0xA26908783662E42A, + 0x114744C635C5BB45, + 0x2D3DFDAB61AD1A42, + 0x9E13B115620A452D, + 0xD9B9CBFCC9EDBA19, + 0x6A978742CA4AE576, + 0xA14CB926613CF817, + 0x1262F598629BA778, + 0x55C88F71C97C584C, + 0xE6E6C3CFCADB0723, + 0xDA9C7AA29EB3A624, + 0x69B2361C9D14F94B, + 0x2E184CF536F3067F, + 0x9D36004B35545910, + 0x2B769F17CF112238, + 0x9858D3A9CCB67D57, + 0xDFF2A94067518263, + 0x6CDCE5FE64F6DD0C, + 0x50A65C93309E7C0B, + 0xE388102D33392364, + 0xA4226AC498DEDC50, + 0x170C267A9B79833F, + 0xDCD7181E300F9E5E, + 0x6FF954A033A8C131, + 0x28532E49984F3E05, + 0x9B7D62F79BE8616A, + 0xA707DB9ACF80C06D, + 0x14299724CC279F02, + 0x5383EDCD67C06036, 0xE0ADA17364673F59, ] @@ -131,7 +528,7 @@ def _algorithm(data: typing.Union[bytes, str], constants: typing.List[int], chec data = data.encode("utf-8") for it in data: - checksum = constants[(checksum & 0xff) ^ it] ^ (checksum >> 8) + checksum = constants[(checksum & 0xFF) ^ it] ^ (checksum >> 8) return checksum @@ -140,7 +537,7 @@ def crc32(data: typing.Union[bytes, str]) -> int: return _algorithm( data, _crc32_constants, - 0xffffffff, + 0xFFFFFFFF, ) @@ -148,5 +545,5 @@ def crc64(data: typing.Union[bytes, str]) -> int: return _algorithm( data, _crc64_constants, - 0xffffffffffffffff, + 0xFFFFFFFFFFFFFFFF, ) diff --git a/src/mercury_engine_data_structures/dread_data.py b/src/mercury_engine_data_structures/dread_data.py index 55cb20fb..b7a15be2 100644 --- a/src/mercury_engine_data_structures/dread_data.py +++ b/src/mercury_engine_data_structures/dread_data.py @@ -29,10 +29,7 @@ def all_name_to_asset_id() -> Dict[str, int]: @functools.lru_cache def all_asset_id_to_name() -> Dict[int, str]: - return { - asset_id: name - for name, asset_id in all_name_to_asset_id().items() - } + return {asset_id: name for name, asset_id in all_name_to_asset_id().items()} def name_for_asset_id(asset_id: int) -> Optional[str]: @@ -54,10 +51,8 @@ def all_name_to_property_id() -> Dict[str, int]: def all_property_id_to_name() -> Dict[int, str]: names = all_name_to_property_id() - return { - asset_id: name - for name, asset_id in names.items() - } + return {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("."): @@ -66,5 +61,4 @@ def all_files_ending_with(ext: str, exclusions: Optional[list[str]] = None) -> l 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] + 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/file_tree_editor.py b/src/mercury_engine_data_structures/file_tree_editor.py index cd5e187c..88ecd862 100644 --- a/src/mercury_engine_data_structures/file_tree_editor.py +++ b/src/mercury_engine_data_structures/file_tree_editor.py @@ -59,6 +59,7 @@ class FileTreeEditor: _ensured_asset_ids: mapping of pkg name to assets we'll copy into it when saving _modified_resources: mapping of asset id to bytes. When saving, these asset ids are replaced """ + headers: Dict[str, construct.Container] _files_for_asset_id: Dict[AssetId, Set[Optional[str]]] _ensured_asset_ids: Dict[str, Set[AssetId]] @@ -88,15 +89,11 @@ def _update_headers(self): self._files_for_asset_id = {} self._name_for_asset_id = copy.copy(_all_asset_id_for_game(self.target_game)) - self._toc = Toc.parse(self.root.joinpath(Toc.system_files_name()).read_bytes(), - target_game=self.target_game) + self._toc = Toc.parse(self.root.joinpath(Toc.system_files_name()).read_bytes(), target_game=self.target_game) custom_names = self.root.joinpath("custom_names.json") if custom_names.is_file(): with custom_names.open() as f: - self._name_for_asset_id.update({ - asset_id: name - for name, asset_id in json.load(f).items() - }) + self._name_for_asset_id.update({asset_id: name for name, asset_id in json.load(f).items()}) for f in self.root.rglob("*.*"): name = f.relative_to(self.root).as_posix() @@ -122,8 +119,9 @@ def _update_headers(self): self.headers[name].entries_by_id = {} for entry in self.headers[name].file_entries: if self._toc.get_size_for(entry.asset_id) is None: - logger.warning("File with asset id 0x%016x in pkg %s does not have an entry in the TOC", - entry.asset_id, name) + logger.warning( + "File with asset id 0x%016x in pkg %s does not have an entry in the TOC", entry.asset_id, name + ) self._add_pkg_name_for_asset_id(entry.asset_id, name) self.headers[name].entries_by_id[entry.asset_id] = entry @@ -191,8 +189,9 @@ def get_raw_asset(self, asset_id: NameOrAssetId, *, in_pkg: Optional[str] = None raise ValueError(f"Unknown asset_id: {original_name}") - def get_parsed_asset(self, name: str, *, in_pkg: Optional[str] = None, - type_hint: typing.Type[_T] = BaseResource) -> _T: + def get_parsed_asset( + self, name: str, *, in_pkg: Optional[str] = None, type_hint: typing.Type[_T] = BaseResource + ) -> _T: """ Gets the resource with the given name and decodes it based on the extension. """ @@ -215,8 +214,7 @@ def get_file(self, path: str, type_hint: type[_T] = BaseResource) -> _T: """ return self.get_parsed_asset(path, type_hint=type_hint) - def add_new_asset(self, name: str, new_data: typing.Union[bytes, BaseResource], - in_pkgs: typing.Iterable[str]): + def add_new_asset(self, name: str, new_data: typing.Union[bytes, BaseResource], in_pkgs: typing.Iterable[str]): """ Adds an asset that doesn't already exist. """ @@ -225,10 +223,12 @@ def add_new_asset(self, name: str, new_data: typing.Union[bytes, BaseResource], if asset_id in self._modified_resources: raise ValueError(f"{name} was already modified") else: - raise ValueError("Asset already exists in:\n" + "\n".join( - pkg if pkg is not None else "In the RomFS" - for pkg in self._files_for_asset_id[asset_id] - )) + raise ValueError( + "Asset already exists in:\n" + + "\n".join( + pkg if pkg is not None else "In the RomFS" for pkg in self._files_for_asset_id[asset_id] + ) + ) in_pkgs = list(in_pkgs) files_set = set() @@ -328,8 +328,7 @@ def save_modifications(self, output_path: Path, output_format: OutputFormat, *, # We keep system.pkg because .bmmaps don't read properly with exlaunch and it's only 4MB # We keep MSR's "_discardables.pkg" as the files are not read from RomFS without the pkg modified_pkgs = list( - filter(lambda pkg: pkg == "packs/system/system.pkg" or pkg.endswith("discardables.pkg"), - modified_pkgs) + filter(lambda pkg: pkg == "packs/system/system.pkg" or pkg.endswith("discardables.pkg"), modified_pkgs) ) # Ensure all pkgs we'll modify is in memory already. @@ -360,9 +359,9 @@ def save_modifications(self, output_path: Path, output_format: OutputFormat, *, if self._files_for_asset_id[asset_id] - {None}: replacements.append(path) if ( - output_format == OutputFormat.ROMFS and - asset_id in asset_ids_to_copy and - self.target_game != Game.SAMUS_RETURNS + output_format == OutputFormat.ROMFS + and asset_id in asset_ids_to_copy + and self.target_game != Game.SAMUS_RETURNS ): del asset_ids_to_copy[asset_id] else: @@ -371,8 +370,7 @@ def save_modifications(self, output_path: Path, output_format: OutputFormat, *, # Update the Toc's own entry and then write logger.debug("Updating the system/files.toc") self._toc.add_file(Toc.system_files_name(), len(self._toc.build())) - _write_to_path(output_path.joinpath(Toc.system_files_name()), - self._toc.build()) + _write_to_path(output_path.joinpath(Toc.system_files_name()), self._toc.build()) if output_format == OutputFormat.ROMFS: logger.debug("Copying to romfs the ensured files") @@ -382,9 +380,7 @@ def save_modifications(self, output_path: Path, output_format: OutputFormat, *, _write_to_path(output_path.joinpath(path), data) # dread_depackager format - replacement_json = json.dumps({ - "replacements": replacements - }, indent=4) + replacement_json = json.dumps({"replacements": replacements}, indent=4) output_path.joinpath("replacements.json").write_text(replacement_json, "utf-8") # Update the PKGs diff --git a/src/mercury_engine_data_structures/formats/bapd.py b/src/mercury_engine_data_structures/formats/bapd.py index 996157ec..936607bc 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', "2.3.2") +BAPD = game_model("sound::CAudioPresets", "2.3.2") class Bapd(BaseResource): diff --git a/src/mercury_engine_data_structures/formats/base_resource.py b/src/mercury_engine_data_structures/formats/base_resource.py index 9f8d34e5..d07dcaa5 100644 --- a/src/mercury_engine_data_structures/formats/base_resource.py +++ b/src/mercury_engine_data_structures/formats/base_resource.py @@ -28,8 +28,7 @@ def construct_class(cls, target_game: Game) -> Construct: @classmethod def parse(cls, data: bytes, target_game: Game, editor: FileTreeEditor | None = None) -> typing_extensions.Self: - return cls(cls.construct_class(target_game).parse(data, target_game=target_game), - target_game, editor) + return cls(cls.construct_class(target_game).parse(data, target_game=target_game), target_game, editor) def build(self) -> bytes: return self.construct_class(self.target_game).build(self._raw, target_game=self.target_game) diff --git a/src/mercury_engine_data_structures/formats/bcmdl.py b/src/mercury_engine_data_structures/formats/bcmdl.py index 8f6cb51c..be629545 100644 --- a/src/mercury_engine_data_structures/formats/bcmdl.py +++ b/src/mercury_engine_data_structures/formats/bcmdl.py @@ -38,7 +38,7 @@ # pad 0xFF bytes to an offset of 8 PadTo8B = Struct( _cur_pos=Tell, - padding=construct.Padding((8 - construct.this._cur_pos) % 8, pattern=b'\xff'), + padding=construct.Padding((8 - construct.this._cur_pos) % 8, pattern=b"\xff"), ) # an entry in a linked-list typically pointed to by TOC. @@ -58,7 +58,7 @@ offset=Int32ul, # the offset from the start of decompressed Vert_Buffer data_type=Int16ul, # always 3? count=Int16ul, # number of entries - unk=Int32ul + unk=Int32ul, ).compile() # vertex buffer @@ -67,9 +67,9 @@ buf=IfThenElse( construct.this._gzip_header != 559903, # gzip header Bytes(construct.this._.buffer_size), - Bytes(construct.this._.comp_size) # TODO inflate this and have it correctly deflate + Bytes(construct.this._.comp_size), # TODO inflate this and have it correctly deflate ), - _padding=PadTo8B + _padding=PadTo8B, ) # vertex info and buffer ptr @@ -83,7 +83,7 @@ info_count=Int32ul, const0=Const(-1, Int32sl), infos=Array(construct.this.info_count, Vertex_Info_entry), - verts=Pointer(construct.this.buffer_offset, Vert_Buffer) + verts=Pointer(construct.this.buffer_offset, Vert_Buffer), ).compile() # triangle(?) buffer @@ -92,9 +92,9 @@ buf=IfThenElse( construct.this._gzip_header != 559903, Bytes(construct.this._.idx_count * 2), - Bytes(construct.this._.comp_size) # TODO inflate and have it correctly deflate + Bytes(construct.this._.comp_size), # TODO inflate and have it correctly deflate ), - _padding=PadTo8B + _padding=PadTo8B, ) # Triangle info(?) and buffer ptr @@ -107,7 +107,7 @@ comp_size=Int32ul, # if compressed, buffer size comp_size const1=Const(-1, Int32sl), _tri_buffer_offset=Ptr, - tri_buffer_offset=Pointer(construct.this._tri_buffer_offset, Tri_Buffer) + tri_buffer_offset=Pointer(construct.this._tri_buffer_offset, Tri_Buffer), ).compile() # submesh info(?) pointed to by TOC2_entry._submesh_info_offsets_ptr @@ -118,7 +118,7 @@ index_count=Int32ul, jMapEntryCount=Int32ul, jMapOffset=Ptr, - jMap=Pointer(construct.this.jMapOffset, Array(construct.this.jMapEntryCount, Int32ul)) + jMap=Pointer(construct.this.jMapOffset, Array(construct.this.jMapEntryCount, Int32ul)), ).compile() # TOC2 entry, noe plugin thinks its submesh @@ -132,14 +132,14 @@ const1=Const(-1, Int32sl), _submesh_info_offsets_ptr=Ptr, # submeshInfoOffsets in noe plugin transform=Array(3, Float), - const2=Const(-1, Int32sl) + const2=Const(-1, Int32sl), ).compile() # string padded with 0xFF bytes until an offset of 8 Padded_String = Struct( str=StrId, _cur_pos=Tell, - _padding=construct.Padding((8 - construct.this._cur_pos) % 8, pattern=b'\xff'), + _padding=construct.Padding((8 - construct.this._cur_pos) % 8, pattern=b"\xff"), ) # material entry @@ -174,7 +174,7 @@ MAT_ptr=Ptr, # points to MAT_entry MESHNAME_ptr=Ptr, # points to MESHNAME_entry visible=Flag, - _remainder=Array(7, Byte) + _remainder=Array(7, Byte), ).compile() # mesh name, also controls whether mesh is visible @@ -209,11 +209,8 @@ _parent_name_ptr=Ptr, _unk=Int64ul, name=Pointer(construct.this._name_ptr, Padded_String), - parent=If( - construct.this._parent_name_ptr != 0, - Pointer(construct.this._parent_name_ptr, Padded_String) - ), - transform=Pointer(construct.this._transform, transform) + parent=If(construct.this._parent_name_ptr != 0, Pointer(construct.this._parent_name_ptr, Padded_String)), + transform=Pointer(construct.this._transform, transform), ).compile() # joints TOC since it's not a linked-list @@ -247,15 +244,9 @@ # BUG: either pointer can be null, and size can be one or two. TOC9_info = Struct( ptr0=Ptr, - ptr0_ref=If( - construct.this.ptr0 != 0, - Pointer(construct.this.ptr0, toc9_subinfo) - ), + ptr0_ref=If(construct.this.ptr0 != 0, Pointer(construct.this.ptr0, toc9_subinfo)), ptr1=Ptr, - ptr1_ref=If( - construct.this.ptr1 != 0, - Pointer(construct.this.ptr1, toc9_subinfo) - ) + ptr1_ref=If(construct.this.ptr1 != 0, Pointer(construct.this.ptr1, toc9_subinfo)), ).compile() # wrapper struct that takes a pointer and parses a TOC9_info if it's nonzero @@ -308,7 +299,6 @@ Header = Struct( _magic=Const(b"MMDL"), _ver=Const(0x003A0001, Hex(Int32ul)), - toc=TOC, ).compile() @@ -401,8 +391,9 @@ def _parse(self, stream, context, path): smit.submesh_infos = ListContainer() for cont in smit.subtoc_entries: stream_seek(stream, cont.ptr, 0, path) - smit.submesh_infos.append(submesh_info._parsereport(stream, context, - f"{path} -> submeshes -> TOC -> infos")) + smit.submesh_infos.append( + submesh_info._parsereport(stream, context, f"{path} -> submeshes -> TOC -> infos") + ) # materials materials = ListContainer() @@ -606,5 +597,7 @@ def change_material_path(self, mat_name: str, new_path: str) -> None: return else: raise ValueError(f"Material path {new_path} is longer than original path {mat.path}!") - raise ValueError(f"Material name {mat_name} not found in model! " - "Ensure you are using the material's name rather than its path.") + raise ValueError( + f"Material name {mat_name} not found in model! " + "Ensure you are using the material's name rather than its path." + ) diff --git a/src/mercury_engine_data_structures/formats/bcskla.py b/src/mercury_engine_data_structures/formats/bcskla.py index 1a8d80ef..7fd43e05 100644 --- a/src/mercury_engine_data_structures/formats/bcskla.py +++ b/src/mercury_engine_data_structures/formats/bcskla.py @@ -33,17 +33,15 @@ class TimingTypeEnum(Enum): ONE_BYTE = 8 TWO_BYTE = 0 + + class DreadKFVAdapter(Adapter): SUBCON = Struct( - timing_type = EnumAdapter(TimingTypeEnum, Int16ul), - count = Int16ul, - timings = IfThenElse( - this.timing_type == TimingTypeEnum.TWO_BYTE, - Int16ul[this.count], - Int8ul[this.count] - ), - _padding=AlignTo(4, b"\xFF"), - values = Array(this.count, Struct(value=Float, derivative=Float)), + timing_type=EnumAdapter(TimingTypeEnum, Int16ul), + count=Int16ul, + timings=IfThenElse(this.timing_type == TimingTypeEnum.TWO_BYTE, Int16ul[this.count], Int8ul[this.count]), + _padding=AlignTo(4, b"\xff"), + values=Array(this.count, Struct(value=Float, derivative=Float)), ) def __init__(self): @@ -54,9 +52,9 @@ def _decode(self, obj, context, path): for i in range(obj.count): res.append( Container( - time = obj.timings[i], - value = obj["values"][i].value, - derivative = obj["values"][i].derivative, + time=obj.timings[i], + value=obj["values"][i].value, + derivative=obj["values"][i].derivative, ) ) @@ -64,141 +62,137 @@ def _decode(self, obj, context, path): def _encode(self, obj, context, path): res = Container( - timing_type = TimingTypeEnum.TWO_BYTE if obj[-1].time > 0xFF else TimingTypeEnum.ONE_BYTE, - count = len(obj), - timings = ListContainer([v.time for v in obj]), - values = ListContainer([Container(value=v.value, derivative=v.derivative) for v in obj]) + timing_type=TimingTypeEnum.TWO_BYTE if obj[-1].time > 0xFF else TimingTypeEnum.ONE_BYTE, + count=len(obj), + timings=ListContainer([v.time for v in obj]), + values=ListContainer([Container(value=v.value, derivative=v.derivative) for v in obj]), ) return res + def _update_next_kfv(ctx): ctx._._._._next_kfv_offset = ctx._new_eof -KeyFramedValues_Dread = FocusedSeq( - "data", - data = DreadKFVAdapter(), - _new_eof=Tell, - _new_kfv=Computed(_update_next_kfv) -) + +KeyFramedValues_Dread = FocusedSeq("data", data=DreadKFVAdapter(), _new_eof=Tell, _new_kfv=Computed(_update_next_kfv)) # if data is keyframed, it builds to { count = c, data = [ { timing = t, values = [a, b, c] }, ... ] } # if data is constant, it builds to { count = 0, data = { value = x } } KeyFramedValues_SR = Struct( count=Rebuild(Int16ul, lambda ctx: 0 if isinstance(ctx.data, float) else len(ctx.data)), - _data_type = Const(2, Int16ul), - data = IfThenElse( + _data_type=Const(2, Int16ul), + data=IfThenElse( this.count == 0, - FocusedSeq( - "value", - timing = Const(0, Int32ul), - value = Float - ), + FocusedSeq("value", timing=Const(0, Int32ul), value=Float), # guessing on left/right_derivative. they are almost always the same value. - Array(this.count, Struct(timing=Float, value=Float, left_derivative=Float, right_derivative=Float)) + Array(this.count, Struct(timing=Float, value=Float, left_derivative=Float, right_derivative=Float)), ), _new_eof=Tell, - _new_kfv=Computed(_update_next_kfv) - + _new_kfv=Computed(_update_next_kfv), ) + def _rebuild_flags(ctx): flags = 0 for i, val in enumerate(ctx.data): if isinstance(val, ListContainer): - flags += 2 ** i + flags += 2**i return flags + class TrackDataAdapter(Adapter): def _decode(self, obj, context, path): return Container( bone_name=obj.bone_name, - position=Container( - x=obj.data[0], - y=obj.data[1], - z=obj.data[2] - ), - rotation=Container( - x=obj.data[3], - y=obj.data[4], - z=obj.data[5] - ), - scale=Container( - x=obj.data[6], - y=obj.data[7], - z=obj.data[8] - ) + position=Container(x=obj.data[0], y=obj.data[1], z=obj.data[2]), + rotation=Container(x=obj.data[3], y=obj.data[4], z=obj.data[5]), + scale=Container(x=obj.data[6], y=obj.data[7], z=obj.data[8]), ) def _encode(self, obj, context, path): return Container( bone_name=obj.bone_name, - data=ListContainer([ - obj.position.x, - obj.position.y, - obj.position.z, - obj.rotation.x, - obj.rotation.y, - obj.rotation.z, - obj.scale.x, - obj.scale.y, - obj.scale.z - ]) + data=ListContainer( + [ + obj.position.x, + obj.position.y, + obj.position.z, + obj.rotation.x, + obj.rotation.y, + obj.rotation.z, + obj.scale.x, + obj.scale.y, + obj.scale.z, + ] + ), ) -BoneTrack_Dread = TrackDataAdapter(Struct( - # guess. almost always the bone names but some values still don't parse after dumping all model data >:( - bone_name=PropertyEnumDoubleUnsafe, - flags=Rebuild(Int32ul, _rebuild_flags), - _offset=Tell, - data=Array(9, IfThenElse( - # if the flag for an index is zero, the value is keyframed - 2 ** this._index & this.flags == 0, - Float, - FocusedSeq( - "kfv", - # offsets are relative to immediately after the flag field - off = Rebuild(Int32ul, lambda ctx: ctx._._._next_kfv_offset - ctx._._offset), - kfv = Pointer(this.off + this._._offset, KeyFramedValues_Dread) - ) - )) -)) - -BoneTrack_SR = TrackDataAdapter(Struct( - bone_name=PropertyEnumDoubleUnsafe, - data=Array(9, FocusedSeq( - "kfv", - off = Rebuild(Int32ul, lambda ctx: 0 if isinstance(ctx.kfv, float) else ctx._._._next_kfv_offset), - kfv = IfThenElse( - this.off > 0, - Pointer(this.off, KeyFramedValues_SR), - # if offset is 0, this is the default value pos/rot=0, scale=1 - IfThenElse(lambda ctx: ctx._index < 6, Computed(0.0), Computed(1.0)) - ) - )) -)) + +BoneTrack_Dread = TrackDataAdapter( + Struct( + # guess. almost always the bone names but some values still don't parse after dumping all model data >:( + bone_name=PropertyEnumDoubleUnsafe, + flags=Rebuild(Int32ul, _rebuild_flags), + _offset=Tell, + data=Array( + 9, + IfThenElse( + # if the flag for an index is zero, the value is keyframed + 2**this._index & this.flags == 0, + Float, + FocusedSeq( + "kfv", + # offsets are relative to immediately after the flag field + off=Rebuild(Int32ul, lambda ctx: ctx._._._next_kfv_offset - ctx._._offset), + kfv=Pointer(this.off + this._._offset, KeyFramedValues_Dread), + ), + ), + ), + ) +) + +BoneTrack_SR = TrackDataAdapter( + Struct( + bone_name=PropertyEnumDoubleUnsafe, + data=Array( + 9, + FocusedSeq( + "kfv", + off=Rebuild(Int32ul, lambda ctx: 0 if isinstance(ctx.kfv, float) else ctx._._._next_kfv_offset), + kfv=IfThenElse( + this.off > 0, + Pointer(this.off, KeyFramedValues_SR), + # if offset is 0, this is the default value pos/rot=0, scale=1 + IfThenElse(lambda ctx: ctx._index < 6, Computed(0.0), Computed(1.0)), + ), + ), + ), + ) +) BCSKLA_DREAD = Struct( - _magic = Const(b"MANM"), + _magic=Const(b"MANM"), ver=VersionAdapter("1.10.0"), - unk=Int32ul, # seems to be 0 or 1, possibly determines if anim is looping? + unk=Int32ul, # seems to be 0 or 1, possibly determines if anim is looping? frame_count=Float, track_count=Rebuild(Int32ul, construct.len_(this.tracks)), _padding=If(this.track_count > 0, AlignTo(8, b"\xff")), - _next_kfv_offset=Computed(this.track_count * 0x30 + 0x18), # end of BoneTracks, used to rebuild - tracks=Array(this.track_count, BoneTrack_Dread) + _next_kfv_offset=Computed(this.track_count * 0x30 + 0x18), # end of BoneTracks, used to rebuild + tracks=Array(this.track_count, BoneTrack_Dread), ) BCSKLA_SR = Struct( - _magic = Const(b"MANM"), - ver = VersionAdapter("1.6.0"), - unk = Int32ul, + _magic=Const(b"MANM"), + ver=VersionAdapter("1.6.0"), + unk=Int32ul, frame_count=Float, track_count=Rebuild(Int32ul, construct.len_(this.tracks)), _next_kfv_offset=Computed(this.track_count * 0x28 + 0x14), - tracks = Array(this.track_count, BoneTrack_SR) + tracks=Array(this.track_count, BoneTrack_SR), ) + class Bcskla(BaseResource): @classmethod def construct_class(cls, target_game: Game) -> Construct: diff --git a/src/mercury_engine_data_structures/formats/bctex.py b/src/mercury_engine_data_structures/formats/bctex.py index 6568b7b2..080b381b 100644 --- a/src/mercury_engine_data_structures/formats/bctex.py +++ b/src/mercury_engine_data_structures/formats/bctex.py @@ -39,7 +39,6 @@ block_type=BlockType, global_block_index=UInt, inc_block_type_index=UInt, - _data_seek=construct.Seek(construct.this._start + construct.this.data_offset), data=construct.FixedSized( construct.this.data_size, @@ -49,8 +48,8 @@ BlockType.texture: XTX_TextureBlock, }, construct.GreedyBytes, - ) - ) + ), + ), ) XTX = construct.Struct( @@ -74,16 +73,17 @@ mip_count=UInt, texture_flag=UInt, # unk name_offset=UInt, - name=construct.Peek(construct.FocusedSeq( - "value", - construct.Seek(construct.this._.name_offset - 8), - value=StrId, - )), + name=construct.Peek( + construct.FocusedSeq( + "value", + construct.Seek(construct.this._.name_offset - 8), + value=StrId, + ) + ), unk_2=UInt, texture_offset=UInt, # texture xtx offset unk_3=UInt, texture_size=UInt, # texture xtx size - _xtx_bytes_seek=construct.Seek(construct.this.texture_offset - 8), xtx=construct.FixedSized(construct.this.texture_size, XTX), rest=construct.GreedyBytes, @@ -93,6 +93,7 @@ ), ) + class PICATextureFormat(Enum): L8 = 0 A8 = 1 @@ -109,29 +110,30 @@ class PICATextureFormat(Enum): L4 = 12 A4 = 13 + BCTEXFormat = construct.Enum( UInt, - RGB8_0 = 0x10001, # 65537 - RGBA8_0 = 0x20001, # 65538, - L8_0 = 0x40001, # 65540 - LA8_0 = 0x50001, # 65541 - ETC1_0 = 0x10003, # 196609 - ETC1a4_0 = 0x20003 # 196610 + RGB8_0=0x10001, # 65537 + RGBA8_0=0x20001, # 65538, + L8_0=0x40001, # 65540 + LA8_0=0x50001, # 65541 + ETC1_0=0x10003, # 196609 + ETC1a4_0=0x20003, # 196610 ) CTPK = construct.Struct( _start=construct.Tell, _magic=construct.Const(b"CTPK"), - file_header = construct.Struct( + file_header=construct.Struct( version=construct.Int16ul, textures_count=construct.Int16ul, texture_data_offset=UInt, texture_data_size=UInt, hash_list_offset=UInt, mipmap_entries_offset=UInt, - _padding=construct.Int64ul + _padding=construct.Int64ul, ), - image_header= construct.Struct( + image_header=construct.Struct( name_offset=UInt, image_size=UInt, data_offset=UInt, @@ -145,17 +147,17 @@ class PICATextureFormat(Enum): unix_time_stamp=UInt, ), mip_map_sizes=construct.Array(construct.this.image_header.mip_count, UInt), - name = StrId, + name=StrId, _hashlist_begin=construct.Seek(construct.this._start + construct.this.file_header.hash_list_offset), - hash = UInt, + hash=UInt, _mip_map_entries_begin=construct.Seek(construct.this._start + construct.this.file_header.mipmap_entries_offset), - mip_map_entry= construct.Struct( - texture_format = construct.Enum(construct.Byte, PICATextureFormat), - mip_count = construct.Byte, - compressed = construct.Byte, - etc1_quality = construct.Byte, + mip_map_entry=construct.Struct( + texture_format=construct.Enum(construct.Byte, PICATextureFormat), + mip_count=construct.Byte, + compressed=construct.Byte, + etc1_quality=construct.Byte, ), - image_data = construct.Bytes(construct.this.file_header.texture_data_size) + image_data=construct.Bytes(construct.this.file_header.texture_data_size), ) # this and all related structures is a mixture of some own work + most parts taken from: @@ -174,11 +176,12 @@ class PICATextureFormat(Enum): data_offset=UInt, ctpk_size=UInt, _ctpk_start=construct.Seek(construct.this.data_offset), - ctpk = construct.FixedSized(construct.this.ctpk_size, CTPK), - name = StrId, + ctpk=construct.FixedSized(construct.this.ctpk_size, CTPK), + name=StrId, _terminated=construct.Terminated, ) + class Bctex(BaseResource): @classmethod def construct_class(cls, target_game: Game) -> construct.Construct: diff --git a/src/mercury_engine_data_structures/formats/bldef.py b/src/mercury_engine_data_structures/formats/bldef.py index 92cbc4a4..15177b01 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', "1.0.2") + return standard_format.game_model("CLightManager", "1.0.2") @property def lightdefs(self) -> Container: diff --git a/src/mercury_engine_data_structures/formats/blut.py b/src/mercury_engine_data_structures/formats/blut.py index 23e81867..5187183a 100644 --- a/src/mercury_engine_data_structures/formats/blut.py +++ b/src/mercury_engine_data_structures/formats/blut.py @@ -4,11 +4,8 @@ from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game -BLUT = Struct( - magic=Const(b"LUT"), - ver=VersionAdapter("1.1.0"), - data=PrefixedArray(Int32ul, Float) -) +BLUT = Struct(magic=Const(b"LUT"), ver=VersionAdapter("1.1.0"), data=PrefixedArray(Int32ul, Float)) + class Blut(BaseResource): @classmethod diff --git a/src/mercury_engine_data_structures/formats/bmbls.py b/src/mercury_engine_data_structures/formats/bmbls.py index 03b4372d..fc78942e 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', "1.2.2") +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 c837b0c0..ac3173b9 100644 --- a/src/mercury_engine_data_structures/formats/bmdefs.py +++ b/src/mercury_engine_data_structures/formats/bmdefs.py @@ -69,25 +69,28 @@ _magic=Const(b"MDEF"), version=VersionAdapter("1.5.0"), unk1=Int32ul, - sounds=make_vector(Struct( - "sound_name" / StrId, - "unk1" / Int32ul, - "priority" / Int32ul, - "file_path" / StrId, - "unk2" / Int32ul, - "unk3" / Int32ul, - "unk4" / Int32ul, - "fade_in" / Float32l, - "fade_out" / Float32l, - "volume" / Float32l, - "unk_bool" / Flag, - "environment_sfx_volume" / Float32l - )), # fmt: skip + sounds=make_vector( + Struct( + "sound_name" / StrId, + "unk1" / Int32ul, + "priority" / Int32ul, + "file_path" / StrId, + "unk2" / Int32ul, + "unk3" / Int32ul, + "unk4" / Int32ul, + "fade_in" / Float32l, + "fade_out" / Float32l, + "volume" / Float32l, + "unk_bool" / Flag, + "environment_sfx_volume" / Float32l, + ) + ), # fmt: skip unk2=Int32ul, enemies_list=make_vector(EnemyStruct), rest=construct.GreedyBytes, ) + class Bmdefs(BaseResource): @classmethod def construct_class(cls, target_game: Game) -> Construct: diff --git a/src/mercury_engine_data_structures/formats/bmmap.py b/src/mercury_engine_data_structures/formats/bmmap.py index 66a870fc..26319173 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', "1.0.2") +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 fcf1a9e6..aeef731c 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', "1.0.2") +BMMDEF = standard_format.create("CMinimapDef", "1.0.2") class Bmmdef(BaseResource): @@ -18,9 +18,17 @@ def construct_class(cls, target_game: Game) -> Construct: def icons(self) -> Container: return self.raw.Root.mapIconDefs - def add_icon(self, icon_id: str, uSpriteRow: int, uSpriteCol: int, - sInspectorLabel: str, sDisabledIconId: str = '', - vAnchorOffset: Tuple[int, int] = (0, 0), bAutoScale: bool = True, **kwargs): + def add_icon( + self, + icon_id: str, + uSpriteRow: int, + uSpriteCol: int, + sInspectorLabel: str, + sDisabledIconId: str = "", + vAnchorOffset: Tuple[int, int] = (0, 0), + bAutoScale: bool = True, + **kwargs, + ): icon = Container() icon.uSpriteRow = uSpriteRow icon.uSpriteCol = uSpriteCol diff --git a/src/mercury_engine_data_structures/formats/bmsad.py b/src/mercury_engine_data_structures/formats/bmsad.py index cf3d77ab..ce61e2ba 100644 --- a/src/mercury_engine_data_structures/formats/bmsad.py +++ b/src/mercury_engine_data_structures/formats/bmsad.py @@ -46,44 +46,53 @@ value=Switch( construct.this.type, { - 's': StrId, - 'f': Float, - 'b': Flag, - 'i': Int32sl, + "s": StrId, + "f": Float, + "b": Flag, + "i": Int32sl, }, - ErrorWithMessage(lambda ctx: f"Unknown argument type: {ctx.type}", construct.SwitchError) + ErrorWithMessage(lambda ctx: f"Unknown argument type: {ctx.type}", construct.SwitchError), + ), +) +Functions = make_vector( + Struct( + name=StrId, + unk1=Flag, + unk2=Flag, + params=common_types.DictAdapter( + common_types.make_vector( + common_types.DictElement( + FunctionArgument, + key=PropertyEnum, + ) + ) + ), ) ) -Functions = make_vector(Struct( - name=StrId, - unk1=Flag, - unk2=Flag, - params=common_types.DictAdapter(common_types.make_vector( - common_types.DictElement( - FunctionArgument, - key=PropertyEnum, - ) - )), -)) # Fields -ExtraFields = common_types.DictAdapter(make_vector( - common_types.DictElement(Struct( - "type" / StrId, - "value" / Switch( - construct.this.type, - { - "bool": Flag, - "string": StrId, - "float": Float, - - "int": Int32sl, - "vec3": CVector3D, - }, - ErrorWithMessage(lambda ctx: f"Unknown argument type: {ctx.type}", construct.SwitchError) +ExtraFields = common_types.DictAdapter( + make_vector( + common_types.DictElement( + Struct( + "type" / StrId, + "value" + / Switch( + construct.this.type, + { + "bool": Flag, + "string": StrId, + "float": Float, + "int": Int32sl, + "vec3": CVector3D, + }, + ErrorWithMessage(lambda ctx: f"Unknown argument type: {ctx.type}", construct.SwitchError), + ), + ) ) - )) -), allow_duplicates=True) + ), + allow_duplicates=True, +) @functools.cache @@ -235,7 +244,7 @@ def SRDependencies(): FieldsSwitch = construct.Switch( lambda ctx: find_charclass_for_type(ctx._._.type), fieldtypes(Game.DREAD), - ErrorWithMessage(lambda ctx: f"Unknown component type: {ctx._._.type}", construct.SwitchError) + ErrorWithMessage(lambda ctx: f"Unknown component type: {ctx._._.type}", construct.SwitchError), ) @@ -257,7 +266,7 @@ def _not_implemented(code): empty_string=PropertyEnum, root=PropertyEnum, fields=FieldsSwitch, - ) + ), ), extra_fields=ComplexIf( lambda this: get_type_lib_dread().is_child_of(this.type, "CComponent"), @@ -385,17 +394,13 @@ def __init__(self, raw: dict) -> None: self._raw = raw @classmethod - def new(cls, - name: str, - unk1: bool = True, - unk2: bool = False, - ): - return cls(Container( - name=name, - unk1=unk1, - unk2=unk2, - params=Container() - )) + def new( + cls, + name: str, + unk1: bool = True, + unk2: bool = False, + ): + return cls(Container(name=name, unk1=unk1, unk2=unk2, params=Container())) def __eq__(self, __value: object) -> bool: if not isinstance(__value, ActorDefFunc): @@ -449,10 +454,10 @@ def set_param(self, param_name: int | str, value: ArgAnyType): param = self._param(param_name) types = { - str: 's', - float: 'f', - bool: 'b', - int: 'i', + str: "s", + float: "f", + bool: "b", + int: "i", } for t, s in types.items(): if isinstance(value, t): @@ -462,7 +467,7 @@ def set_param(self, param_name: int | str, value: ArgAnyType): param.value = value -T = typing.TypeVar('T', bound=ArgAnyType) +T = typing.TypeVar("T", bound=ArgAnyType) class ActorDefFuncParam(typing.Generic[T]): @@ -517,10 +522,7 @@ def __getattr__(self, __name: str) -> typing.Any: if __name in self.parent.raw.extra_fields: return self._get_extra_field(self.parent.raw.extra_fields, __name) - if ( - self.parent.raw.fields is not None - and __name in self.parent.raw.fields.fields - ): + if self.parent.raw.fields is not None and __name in self.parent.raw.fields.fields: return self.parent.raw.fields.fields[__name] cctype = self.parent.get_component_type_class() @@ -568,8 +570,7 @@ def __setattr__(self, __name: str, __value: typing.Any) -> None: def _get_attr_error(self, __name: str) -> AttributeError: return AttributeError( - f"'{self.parent.get_component_type()}' object has no field '{__name}'", - name=__name, obj=self + f"'{self.parent.get_component_type()}' object has no field '{__name}'", name=__name, obj=self ) @@ -618,9 +619,7 @@ def functions(self) -> Sequence[ActorDefFunc]: @functions.setter def functions(self, value: Sequence[ActorDefFunc]): - self.raw.functions = ListContainer( - Container(func.raw) for func in value - ) + self.raw.functions = ListContainer(Container(func.raw) for func in value) @property def dependencies(self) -> Container | ListContainer | None: @@ -635,10 +634,13 @@ class Bmsad(BaseResource): @classmethod @functools.lru_cache def construct_class(cls, target_game: Game) -> Construct: - return GameSpecificStruct({ - Game.SAMUS_RETURNS: BMSAD_SR, - Game.DREAD: BMSAD_Dread, - }[target_game], target_game).compile() + return GameSpecificStruct( + { + Game.SAMUS_RETURNS: BMSAD_SR, + Game.DREAD: BMSAD_Dread, + }[target_game], + target_game, + ).compile() @property def name(self) -> str: @@ -670,40 +672,25 @@ def sub_actors(self, value: typing.Iterable[str]): @property def components(self) -> dict[str, Component]: - return { - name: Component(raw, self.target_game) - for name, raw in self.raw.components.items() - } + return {name: Component(raw, self.target_game) for name, raw in self.raw.components.items()} @components.setter def components(self, value: dict[str, Component]): - self.raw.components = Container({ - name: component.raw - for name, component in value.items() - }) + self.raw.components = Container({name: component.raw for name, component in value.items()}) @property def action_sets(self) -> list[Bmsas]: if self.target_game == Game.DREAD: - return [ - self.editor.get_file(ref, Bmsas) - for ref in self.action_set_refs - ] + return [self.editor.get_file(ref, Bmsas) for ref in self.action_set_refs] if self.target_game == Game.SAMUS_RETURNS: - return [ - Bmsas(action_set, Game.SAMUS_RETURNS) - for action_set in self.raw.action_sets - ] + return [Bmsas(action_set, Game.SAMUS_RETURNS) for action_set in self.raw.action_sets] @action_sets.setter def action_sets(self, value: typing.Iterable[Bmsas]): if self.target_game == Game.DREAD: raise AttributeError(name="action_sets", obj=self) if self.target_game == Game.SAMUS_RETURNS: - self.raw.action_sets = ListContainer([ - action_set.raw - for action_set in value - ]) + self.raw.action_sets = ListContainer([action_set.raw for action_set in value]) @property def action_set_refs(self) -> list[str]: @@ -727,8 +714,6 @@ def sound_fx(self) -> list[tuple[str, int]]: @sound_fx.setter def sound_fx(self, value: typing.Iterable[tuple[str, int]]): - self.raw.sound_fx = ListContainer( - ListContainer(sfx) for sfx in value - ) + self.raw.sound_fx = ListContainer(ListContainer(sfx) for sfx in value) if self.target_game == Game.SAMUS_RETURNS and not self.raw.sound_fx: self.raw.sound_fx = None diff --git a/src/mercury_engine_data_structures/formats/bmsas.py b/src/mercury_engine_data_structures/formats/bmsas.py index f024c367..27db89dd 100644 --- a/src/mercury_engine_data_structures/formats/bmsas.py +++ b/src/mercury_engine_data_structures/formats/bmsas.py @@ -52,56 +52,53 @@ def _emitbuild(self, code: construct.CodeGen): f"({self.str_subcon._compilebuild(code)})" ) + ArgTypes = { - 'f': Float, - 'b': Flag, - 'u': Int32ul, - 'i': Int32sl, - 'e': Int32ul, - 'o': Int32ul, - 't': Int32ul, + "f": Float, + "b": Flag, + "u": Int32ul, + "i": Int32sl, + "e": Int32ul, + "o": Int32ul, + "t": Int32ul, } ArgTypesDread = { **ArgTypes, - 's': StrIdOrInt(StrId, Int64ul), - 'v': Switch( + "s": StrIdOrInt(StrId, Int64ul), + "v": Switch( construct.this.key, { - 'vColorStart': Int32ul, - 'vColorEnd': Int32ul, + "vColorStart": Int32ul, + "vColorEnd": Int32ul, }, - default=CVector3D + default=CVector3D, ), } ArgTypesSR = { **ArgTypes, - 's': StrIdOrInt(StrIdSR, Int32ul), + "s": StrIdOrInt(StrIdSR, Int32ul), } -ArgListDread = DictAdapter(make_vector(Struct( - key=PropertyEnum, - value=Switch( - construct.this.key[0], - ArgTypesDread, - default=construct.Error, +ArgListDread = DictAdapter( + make_vector( + Struct( + key=PropertyEnum, + value=Switch( + construct.this.key[0], + ArgTypesDread, + default=construct.Error, + ), + ) ) -))) +) -ArgListValueSR = Switch( - construct.this.type, - ArgTypesSR, - default=construct.Error +ArgListValueSR = Switch(construct.this.type, ArgTypesSR, default=construct.Error) +ArgListSR = DictAdapter( + make_vector(Struct(key=PropertyEnumDoubleUnsafe, value=Struct(type=Char, value=ArgListValueSR))) ) -ArgListSR = DictAdapter(make_vector(Struct( - key=PropertyEnumDoubleUnsafe, - value=Struct( - type=Char, - value=ArgListValueSR - ) -))) def _arglist_sr_emitparse(code: construct.CodeGen): @@ -121,6 +118,7 @@ def parse_arg_list_sr(io, this): """) return "parse_arg_list_sr(io, this)" + def _arglist_sr_emitbuild(code: construct.CodeGen): PropertyEnumDoubleUnsafe._compilebuild(code) @@ -159,10 +157,13 @@ def build_arg_list_sr(obj_data: dict, io, this): EventListDread = Struct( counts=Array(5, Int16ul), - events0=Array(construct.this.counts[0], Struct( - unk=Int32ul, - event=EventDread, - )), + events0=Array( + construct.this.counts[0], + Struct( + unk=Int32ul, + event=EventDread, + ), + ), events1=Array(construct.this.counts[1], EventDread), events2=Array(construct.this.counts[2], EventDread), events3=Array(construct.this.counts[3], EventDread), @@ -194,28 +195,36 @@ def build_arg_list_sr(obj_data: dict, io, this): unk9=Float, unk10=If(construct.this.unk0 & 32, Hex(Int64ul)), unk11=If(construct.this.unk0 & 64, StrId), - unk12=make_vector(Struct( - unk1=Float, - unk2=Float, - unk3=Float, - )), - unk13=make_vector(Struct( - name=StrId, - unk0=make_vector(Struct( - unk0=Array(3, Hex(Int64ul)), - unk1=StrId, - )), - tracks=TrackList, - events=EventListDread, - )), + unk12=make_vector( + Struct( + unk1=Float, + unk2=Float, + unk3=Float, + ) + ), + unk13=make_vector( + Struct( + name=StrId, + unk0=make_vector( + Struct( + unk0=Array(3, Hex(Int64ul)), + unk1=StrId, + ) + ), + tracks=TrackList, + events=EventListDread, + ) + ), tracks=TrackList, events=EventListDread, - unk14=make_vector(Struct( - unk0=Int64ul, - curve=StrId, - unk1=make_vector(Hex(Int64ul)), - unk2=Int32ul, - )), + unk14=make_vector( + Struct( + unk0=Int64ul, + curve=StrId, + unk1=make_vector(Hex(Int64ul)), + unk2=Int32ul, + ) + ), ) Action = Struct( @@ -245,9 +254,9 @@ def build_arg_list_sr(obj_data: dict, io, this): unk1=Int32ul, unk2=Int32ul, args=ArgListSR, - ) - ) - ) + ), + ), + ), ), events0=construct.Array( construct.this.event_counts[0], @@ -256,7 +265,7 @@ def build_arg_list_sr(obj_data: dict, io, this): unk2=Int32ul, unk3=Byte, args=ArgListSR, - ) + ), ), events1=construct.Array(construct.this.event_counts[1], EventSR), events2=construct.Array(construct.this.event_counts[2], EventSR), @@ -278,9 +287,9 @@ def build_arg_list_sr(obj_data: dict, io, this): name=StrIdSR, animations=make_vector(AnimationSR), ) -''' +""" `.bmsas` files don't exist in Samus Returns. The format is instead embedded in `.bmsad`. -''' +""" class Bmsas(BaseResource): diff --git a/src/mercury_engine_data_structures/formats/bmsbk.py b/src/mercury_engine_data_structures/formats/bmsbk.py index 9687250b..241cfb45 100644 --- a/src/mercury_engine_data_structures/formats/bmsbk.py +++ b/src/mercury_engine_data_structures/formats/bmsbk.py @@ -26,12 +26,15 @@ "vignette_name" / StrId, ) # fmt: skip + def _rebuild_blocks(ctx: Container) -> int: return sum(len(group.blocks) for group in ctx.types) + def _rebuild_types(ctx: Container) -> int: return len(ctx.types) + BlockGroup = Struct( "_num_blocks" / Rebuild(Int32ul, _rebuild_blocks), "_num_types" / Rebuild(Int32ul, _rebuild_types), @@ -53,6 +56,7 @@ def _rebuild_types(ctx: Container) -> int: Terminated, ) # fmt: skip + class Bmsbk(BaseResource): @classmethod @functools.lru_cache diff --git a/src/mercury_engine_data_structures/formats/bmscc.py b/src/mercury_engine_data_structures/formats/bmscc.py index 8d8b7e84..f93e7374 100644 --- a/src/mercury_engine_data_structures/formats/bmscc.py +++ b/src/mercury_engine_data_structures/formats/bmscc.py @@ -31,9 +31,7 @@ data=Switch( construct.this.type, collision_formats, - ErrorWithMessage( - lambda ctx: f"Type {ctx.type} not known, valid types are {list(collision_formats.keys())}." - ) + ErrorWithMessage(lambda ctx: f"Type {ctx.type} not known, valid types are {list(collision_formats.keys())}."), ), ) diff --git a/src/mercury_engine_data_structures/formats/bmscu.py b/src/mercury_engine_data_structures/formats/bmscu.py index 3ff63cd2..09fe40f3 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', "8.3.2") +BMSCU = standard_format.create("CCutSceneDef", "8.3.2") class Bmscu(BaseResource): diff --git a/src/mercury_engine_data_structures/formats/bmsld.py b/src/mercury_engine_data_structures/formats/bmsld.py index 5d75e952..ea624b87 100644 --- a/src/mercury_engine_data_structures/formats/bmsld.py +++ b/src/mercury_engine_data_structures/formats/bmsld.py @@ -15,17 +15,17 @@ logger = logging.getLogger(__name__) FunctionArgument = Struct( - type=StaticPaddedString(4, 'ascii'), + type=StaticPaddedString(4, "ascii"), value=construct.Switch( construct.this.type, { - 's': StrId, - 'f': Float, - 'b': Flag, - 'i': Int32ul, + "s": StrId, + "f": Float, + "b": Flag, + "i": Int32ul, }, - ErrorWithMessage(lambda ctx: f"Unknown argument type: {ctx.type}", construct.SwitchError) - ) + ErrorWithMessage(lambda ctx: f"Unknown argument type: {ctx.type}", construct.SwitchError), + ), ) Components = { @@ -53,19 +53,20 @@ ProperActor = Struct( type=StrId, - position=CVector3D, rotation=CVector3D, - components=make_vector(Struct( - component_type=StrId, - command=StrId, - arguments=make_vector(FunctionArgument), - # data=construct.Switch( - # construct.this.component_type, - # Components, - # ErrorWithMessage(lambda ctx: f"Unknown component type: {ctx.component_type}", construct.SwitchError), - # ), - )), + components=make_vector( + Struct( + component_type=StrId, + command=StrId, + arguments=make_vector(FunctionArgument), + # data=construct.Switch( + # construct.this.component_type, + # Components, + # ErrorWithMessage(lambda ctx: f"Unknown component type: {ctx.component_type}", construct.SwitchError), + # ), + ) + ), ) CollisionObject = Struct( @@ -73,70 +74,68 @@ data=Switch( construct.this.object_type, collision_formats, - ErrorWithMessage( - lambda ctx: f"Type {ctx.type} not known, valid types are {list(collision_formats.keys())}." - ) + ErrorWithMessage(lambda ctx: f"Type {ctx.type} not known, valid types are {list(collision_formats.keys())}."), ), ) BMSLD = Struct( _magic=Const(b"MSLD"), version=VersionAdapter("1.20.0"), - unk1=Int32ul, unk2=Int32ul, unk3=Int32ul, unk4=Int32ul, - - objects_a=make_vector(Struct( - name=StrId, - unk1=Hex(Int32ul), - unk2=Hex(Int32ul), - unk3=Hex(Int32ul), - unk4=Hex(Int32ul), - unk5=Hex(Int32ul), - unk6=Hex(Int32ul), - )), - - object_b=make_vector(Struct( - name=StrId, - unk01=Hex(Int32ul), - unk02=make_vector(Struct( - x=Float32l, - y=Float32l, - z=Float32l, - )), - )), - + objects_a=make_vector( + Struct( + name=StrId, + unk1=Hex(Int32ul), + unk2=Hex(Int32ul), + unk3=Hex(Int32ul), + unk4=Hex(Int32ul), + unk5=Hex(Int32ul), + unk6=Hex(Int32ul), + ) + ), + object_b=make_vector( + Struct( + name=StrId, + unk01=Hex(Int32ul), + unk02=make_vector( + Struct( + x=Float32l, + y=Float32l, + z=Float32l, + ) + ), + ) + ), objects_c=make_dict(CollisionObject), - objects_d=make_dict(CollisionObject), - - objects_e=make_vector(Struct( - name=StrId, - unk01=StrId, - unk02=Hex(Int32ul), - unk03=Hex(Int32ul), - unk04=Hex(Int32ul), - unk05=Hex(Int32ul), - unk06=Hex(Int32ul), - unk07=Hex(Int32ul), - unk08=Hex(Int32ul), - unk09=Float, - unk10=Float, - unk11=Hex(Int32ul), - - unk13=StrId, - unk14=Hex(Int32ul), - )), - + objects_e=make_vector( + Struct( + name=StrId, + unk01=StrId, + unk02=Hex(Int32ul), + unk03=Hex(Int32ul), + unk04=Hex(Int32ul), + unk05=Hex(Int32ul), + unk06=Hex(Int32ul), + unk07=Hex(Int32ul), + unk08=Hex(Int32ul), + unk09=Float, + unk10=Float, + unk11=Hex(Int32ul), + unk13=StrId, + unk14=Hex(Int32ul), + ) + ), actors=make_dict(ProperActor)[18], - - sub_areas=make_vector(Struct( - name=StrId, - names=make_vector(StrId), - )), - + sub_areas=make_vector( + Struct( + name=StrId, + names=make_vector(StrId), + ) + ), rest=construct.GreedyBytes, ).compile() @@ -163,9 +162,7 @@ def is_actor_in_group(self, group_name: str, actor_name: str) -> bool: def get_actor_group(self, group_name: str) -> Container: group = next( - (sub_area for sub_area_name, sub_area in self.all_actor_groups() - if sub_area_name == group_name), - None + (sub_area for sub_area_name, sub_area in self.all_actor_groups() if sub_area_name == group_name), None ) if group is None: raise KeyError(f"No group found with name for {group_name}") @@ -199,14 +196,16 @@ def add_actor_to_entity_groups(self, collision_camera_name: str, actor_name: str all_groups: A boolean which defines if the actor should be added to all entity groups starting with the name pattern or just to one entity group matching the name pattern exactly """ + def compare_func(first: str, second: str) -> bool: if all_groups: return first.startswith(f"eg_SubArea_{second}") else: return first == f"eg_SubArea_{second}" - collision_camera_groups = [group for group_name, group in self.all_actor_groups() - if compare_func(group_name, collision_camera_name)] + collision_camera_groups = [ + group for group_name, group in self.all_actor_groups() if compare_func(group_name, collision_camera_name) + ] if len(collision_camera_groups) == 0: raise Exception(f"No entity group found for {collision_camera_name}") for group in collision_camera_groups: diff --git a/src/mercury_engine_data_structures/formats/bmslgroup.py b/src/mercury_engine_data_structures/formats/bmslgroup.py index 80ea19c4..d2a21dc3 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', "1.0.2") +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 2edf0405..4afc0352 100644 --- a/src/mercury_engine_data_structures/formats/bmslink.py +++ b/src/mercury_engine_data_structures/formats/bmslink.py @@ -14,51 +14,48 @@ from mercury_engine_data_structures.game_check import Game UnkStruct = Struct( - unk1 = StrId, - unk2 = Byte, - unk3 = Float, - unk4 = StrId, - unk5 = StrId, - unk6 = Float, - unk7 = Byte, - unk8 = construct.core.If( + unk1=StrId, + unk2=Byte, + unk3=Float, + unk4=StrId, + unk5=StrId, + unk6=Float, + unk7=Byte, + unk8=construct.core.If( construct.this.unk5 != "Portal", StrId, ), - children = PrefixedArray(Int32ul, LazyBound(lambda: UnkStruct)) + children=PrefixedArray(Int32ul, LazyBound(lambda: UnkStruct)), ) Item = Struct( - name = StrId, - type = StrId, - unk1 = StrId, - unk2 = Float, - unk3 = StrId, - unk4 = Float, - unk5 = StrId, - unk6 = Byte, - unk7 = Byte, - unk8 = StrId, - unk9 = Byte, - unk10 = Byte, - unk11 = Byte, - unk12 = Float, - unk13 = UnkStruct, + name=StrId, + type=StrId, + unk1=StrId, + unk2=Float, + unk3=StrId, + unk4=Float, + unk5=StrId, + unk6=Byte, + unk7=Byte, + unk8=StrId, + unk9=Byte, + unk10=Byte, + unk11=Byte, + unk12=Float, + unk13=UnkStruct, ) -LocationStruct = Struct( - name = StrId, - items = PrefixedArray(Int32ul, Item) -) +LocationStruct = Struct(name=StrId, items=PrefixedArray(Int32ul, Item)) BMSLINK = Struct( - _magic = Const(b"LINK"), - version = VersionAdapter("1.31.0"), - - unk_bool = Byte, - location = LocationStruct, + _magic=Const(b"LINK"), + version=VersionAdapter("1.31.0"), + unk_bool=Byte, + location=LocationStruct, ) + class Bmslink(BaseResource): @classmethod def construct_class(cls, target_game: Game) -> Construct: diff --git a/src/mercury_engine_data_structures/formats/bmsmd.py b/src/mercury_engine_data_structures/formats/bmsmd.py index ed08b3ec..9ae10592 100644 --- a/src/mercury_engine_data_structures/formats/bmsmd.py +++ b/src/mercury_engine_data_structures/formats/bmsmd.py @@ -42,6 +42,7 @@ )), ) # fmt: skip + class Bmsmd(BaseResource): @classmethod @functools.lru_cache diff --git a/src/mercury_engine_data_structures/formats/bmsmsd.py b/src/mercury_engine_data_structures/formats/bmsmsd.py index f62ef095..7d767666 100644 --- a/src/mercury_engine_data_structures/formats/bmsmsd.py +++ b/src/mercury_engine_data_structures/formats/bmsmsd.py @@ -7,7 +7,8 @@ from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game -TileBorders = FlagsEnum(Int32sl, +TileBorders = FlagsEnum( + Int32sl, TOP=1, BOTTOM=2, LEFT=4, diff --git a/src/mercury_engine_data_structures/formats/bmsnav.py b/src/mercury_engine_data_structures/formats/bmsnav.py index 60e0390a..2a75dd39 100644 --- a/src/mercury_engine_data_structures/formats/bmsnav.py +++ b/src/mercury_engine_data_structures/formats/bmsnav.py @@ -10,7 +10,7 @@ geo_connection = Struct( initial_direction=Int32ul, # 0-4, up-right-down-left typically. i.e. geo(0.0, 0.0).direction(1) = geo(100.0, 0.0) destination_geo=Int32ul, - destination_direction=Int32ul # see initial_direction + destination_direction=Int32ul, # see initial_direction ) # a list of connections for a geo (essentially, the allowed directions of travel) @@ -22,8 +22,8 @@ geo_connections_sr = Struct( unk0=Byte, unk1=Byte, - unk2=Byte, # 0? - gcs = geo_connections + unk2=Byte, # 0? + gcs=geo_connections, ) # idk @@ -142,26 +142,21 @@ ) sr_unk_struct = Struct( - bound_start = CVector2D, - bound_end = CVector2D, - unk1 = Int32ul, - const0 = Int32ul, - unk2 = Int32ul, - unk3 = Int32ul + bound_start=CVector2D, bound_end=CVector2D, unk1=Int32ul, const0=Int32ul, unk2=Int32ul, unk3=Int32ul ) BMSNAV_SR = Struct( - _magic=Const(b'MNAV'), + _magic=Const(b"MNAV"), version=Const(0x000C0001, Hex(Int32ul)), - aNavmeshGeos = PrefixedArray(Int32ul, CVector2D), - geo_connections = PrefixedArray(Int32ul, geo_connections_sr), + aNavmeshGeos=PrefixedArray(Int32ul, CVector2D), + geo_connections=PrefixedArray(Int32ul, geo_connections_sr), unk1=PrefixedArray(Int32ul, Struct1), navigable_paths=make_dict(NavigablePath), # contains additional paths for certain enemies (ie chozo soldiers) - unk2 = make_dict(PrefixedArray(Int32ul, sr_unk_struct)), - _eof = Terminated + unk2=make_dict(PrefixedArray(Int32ul, sr_unk_struct)), + _eof=Terminated, ) BMSNAV = Struct( - _magic=Const(b'MNAV'), + _magic=Const(b"MNAV"), 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. @@ -175,7 +170,7 @@ # seems to contain additional emmi navigation methods, and links to bmslink. props=make_dict(Prop), # seems to change emmi animations around specific props (ie water button) actors=make_dict(Actor), # info on actors' navmeshes - unk2=PrefixedArray(Int32ul, Struct2) # idk on this one + unk2=PrefixedArray(Int32ul, Struct2), # idk on this one ).compile() diff --git a/src/mercury_engine_data_structures/formats/bmssd.py b/src/mercury_engine_data_structures/formats/bmssd.py index 91db9b6f..b07eaa60 100644 --- a/src/mercury_engine_data_structures/formats/bmssd.py +++ b/src/mercury_engine_data_structures/formats/bmssd.py @@ -55,7 +55,7 @@ float2=CVector3D, float3=CVector3D, ) - ) + ), ) ), strings_a=make_vector(StrId), @@ -97,7 +97,7 @@ int16=Int32ul, float17=CVector3D, ) - ) + ), ), strings_b=make_vector( StrId, @@ -115,9 +115,9 @@ Struct( model_id=Int32ul, ) - ) + ), ) - ) + ), ) ), make_vector( @@ -129,13 +129,14 @@ int1=Int32ul, long3=make_vector(Int64ul), ) - ) + ), ) - ) + ), ), rest=construct.GreedyBytes, ).compile() + class Bmssd(BaseResource): @classmethod def construct_class(cls, target_game: Game) -> Construct: diff --git a/src/mercury_engine_data_structures/formats/bmtre.py b/src/mercury_engine_data_structures/formats/bmtre.py index 06c656d3..7fcdaede 100644 --- a/src/mercury_engine_data_structures/formats/bmtre.py +++ b/src/mercury_engine_data_structures/formats/bmtre.py @@ -19,19 +19,19 @@ from mercury_engine_data_structures.game_check import Game ArgumentCases = { - 'b': Flag, - 's': StrId, - 'f': Float, - 'u': Int32ul, - 'i': Int32sl, - 'e': StrId, - 'o': Int32ul, - 'v': Array(3, Float) + "b": Flag, + "s": StrId, + "f": Float, + "u": Int32ul, + "i": Int32sl, + "e": StrId, + "o": Int32ul, + "v": Array(3, Float), } StrKeyArgument = Struct( - key = StrId, - val = Switch( + key=StrId, + val=Switch( construct.this.key[0], ArgumentCases, construct.Error, @@ -39,8 +39,8 @@ ) CrcKeyArgument = Struct( - key = PropertyEnum, - val = Switch( + key=PropertyEnum, + val=Switch( construct.this.key[0], ArgumentCases, construct.Error, @@ -48,20 +48,19 @@ ) Behavior = Struct( - type = PropertyEnum, - args = PrefixedArray(Int32ul, CrcKeyArgument), - children = PrefixedArray(Int32ul, LazyBound(lambda: Behavior)), + type=PropertyEnum, + args=PrefixedArray(Int32ul, CrcKeyArgument), + children=PrefixedArray(Int32ul, LazyBound(lambda: Behavior)), ) BMTRE = Struct( - _magic = Const(b"BTRE"), - version = VersionAdapter("1.5.0"), - args = PrefixedArray(Int32ul, StrKeyArgument), - behavior = Behavior, + _magic=Const(b"BTRE"), + version=VersionAdapter("1.5.0"), + args=PrefixedArray(Int32ul, StrKeyArgument), + behavior=Behavior, ) - class Bmtre(BaseResource): @classmethod def construct_class(cls, target_game: Game) -> Construct: @@ -69,7 +68,7 @@ def construct_class(cls, target_game: Game) -> Construct: # private func to print a line in the pretty printer def _pretty_print_line(self, text: str, depth: int) -> None: - print(' ' * depth + text) + print(" " * depth + text) # private func to print a string's type and args def _type_and_args_string(self, behavior: Container) -> str: @@ -78,9 +77,9 @@ def _type_and_args_string(self, behavior: Container) -> str: res += " (" for arg in behavior.args: res += f"{arg.key}={arg.val}, " - res = res[:-2] # remove the last comma + res = res[:-2] # remove the last comma res += ")" - res = res[14:] # remove "behaviortree::" from start + res = res[14:] # remove "behaviortree::" from start return res # private func to pretty-print a behaviortree element @@ -88,35 +87,35 @@ def _pretty_print_behavior(self, behavior: Container, depth: int) -> None: # Repeats the behavior of its child regardless of success or failure if behavior.type == "behaviortree::CRepeat": self._pretty_print_line("Repeat behavior:", depth) - self._pretty_print_behavior(behavior.children[0], depth+1) + self._pretty_print_behavior(behavior.children[0], depth + 1) # if the first child returns success, runs the second child. otherwise runs the third child. - elif behavior.type == "behaviortree::CIf": + elif behavior.type == "behaviortree::CIf": self._pretty_print_line("If:", depth) - self._pretty_print_behavior(behavior.children[0], depth+1) + self._pretty_print_behavior(behavior.children[0], depth + 1) self._pretty_print_line("Then:", depth) - self._pretty_print_behavior(behavior.children[1], depth+1) + self._pretty_print_behavior(behavior.children[1], depth + 1) self._pretty_print_line("Else:", depth) - self._pretty_print_behavior(behavior.children[2], depth+1) + self._pretty_print_behavior(behavior.children[2], depth + 1) # runs children in sequence until one fails, then returns to parent - elif behavior.type == "behaviortree::CSequence": + elif behavior.type == "behaviortree::CSequence": self._pretty_print_line("Sequence:", depth) for child in behavior.children: - self._pretty_print_behavior(child, depth+1) + self._pretty_print_behavior(child, depth + 1) # runs children in sequence until one succeeds, then returns to parent - elif behavior.type == "behaviortree::CSelector": + elif behavior.type == "behaviortree::CSelector": self._pretty_print_line("Selector:", depth) for child in behavior.children: - self._pretty_print_behavior(child, depth+1) + self._pretty_print_behavior(child, depth + 1) # runs *all* children in parallel until all succeed or one fails. # if one fails, it terminates all other children and returns to parent - elif behavior.type == "behaviortree::CParallel": + elif behavior.type == "behaviortree::CParallel": self._pretty_print_line("Parallel:", depth) for child in behavior.children: - self._pretty_print_behavior(child, depth+1) + self._pretty_print_behavior(child, depth + 1) else: self._pretty_print_line(self._type_and_args_string(behavior), depth) diff --git a/src/mercury_engine_data_structures/formats/bmtun.py b/src/mercury_engine_data_structures/formats/bmtun.py index ea7b1d05..0aa060bf 100644 --- a/src/mercury_engine_data_structures/formats/bmtun.py +++ b/src/mercury_engine_data_structures/formats/bmtun.py @@ -20,13 +20,7 @@ type=Char, value=Switch( construct.this.type, - { - 's': StrId, - 'f': Float, - 'b': Flag, - 'i': Int32sl, - 'v': CVector3D - }, + {"s": StrId, "f": Float, "b": Flag, "i": Int32sl, "v": CVector3D}, ErrorWithMessage(lambda ctx: f"Unknown argument type: {ctx.type}", construct.SwitchError), ), ) diff --git a/src/mercury_engine_data_structures/formats/bnvib.py b/src/mercury_engine_data_structures/formats/bnvib.py index ea3ea6b7..5981ce1e 100644 --- a/src/mercury_engine_data_structures/formats/bnvib.py +++ b/src/mercury_engine_data_structures/formats/bnvib.py @@ -18,11 +18,13 @@ # Standard switch format. https://switchbrew.org/wiki/BNVIB#Normal_Vibration + class VibrationType(Enum): NORMAL = 4 LOOP = 12 LOOPWAIT = 16 + BNVIB = Struct( "vibration_type" / EnumAdapter(VibrationType, Int32ul), "_magic" / Const(3, Int16ul), @@ -30,9 +32,10 @@ class VibrationType(Enum): "loop_start" / If(construct.this.vibration_type != VibrationType.NORMAL, Int32ul), "loop_end" / If(construct.this.vibration_type != VibrationType.NORMAL, Int32ul), "loop_wait" / If(construct.this.vibration_type == VibrationType.LOOPWAIT, Int32ul), - "data" / PrefixedArray(Int32ul, Byte) + "data" / PrefixedArray(Int32ul, Byte), ) + class Bnvib(BaseResource): @classmethod def construct_class(cls, target_game: Game) -> Construct: diff --git a/src/mercury_engine_data_structures/formats/bpsi.py b/src/mercury_engine_data_structures/formats/bpsi.py index 06adf11f..bfcc4ece 100644 --- a/src/mercury_engine_data_structures/formats/bpsi.py +++ b/src/mercury_engine_data_structures/formats/bpsi.py @@ -6,19 +6,21 @@ from mercury_engine_data_structures.formats.base_resource import BaseResource BPSI = Struct( - _magic = Const(b"MPSI"), - version = IfThenElse( - game_check.current_game_at_most(game_check.Game.SAMUS_RETURNS), - VersionAdapter("1.2.0"), - VersionAdapter("1.3.0") + _magic=Const(b"MPSI"), + version=IfThenElse( + game_check.current_game_at_most(game_check.Game.SAMUS_RETURNS), VersionAdapter("1.2.0"), VersionAdapter("1.3.0") ), - files = PrefixedArray(Int32ul, Struct( - file = PascalStringRobust(Int32ul, "utf-8"), - in_packages = PrefixedArray(Int32ul, PascalStringRobust(Int32ul, "utf-8")) - )), - _eof=Terminated + files=PrefixedArray( + Int32ul, + Struct( + file=PascalStringRobust(Int32ul, "utf-8"), + in_packages=PrefixedArray(Int32ul, PascalStringRobust(Int32ul, "utf-8")), + ), + ), + _eof=Terminated, ) + class Bpsi(BaseResource): @classmethod def construct_class(cls, target_game: game_check.Game) -> Construct: diff --git a/src/mercury_engine_data_structures/formats/bptdat.py b/src/mercury_engine_data_structures/formats/bptdat.py index 7569b591..b1540e2f 100644 --- a/src/mercury_engine_data_structures/formats/bptdat.py +++ b/src/mercury_engine_data_structures/formats/bptdat.py @@ -4,14 +4,16 @@ from mercury_engine_data_structures.formats.base_resource import BaseResource from mercury_engine_data_structures.game_check import Game -BPTDAT = standard_format.create('CPlaythrough', "1.0.2") -BPTDEF = standard_format.create('CPlaythroughDef', "1.0.2") +BPTDAT = standard_format.create("CPlaythrough", "1.0.2") +BPTDEF = standard_format.create("CPlaythroughDef", "1.0.2") + class Bptdat(BaseResource): @classmethod def construct_class(cls, target_game: Game) -> construct.Construct: return BPTDAT + class Bptdef(BaseResource): @classmethod def construct_class(cls, target_game: Game) -> construct.Construct: diff --git a/src/mercury_engine_data_structures/formats/brem.py b/src/mercury_engine_data_structures/formats/brem.py index 568725b3..29346fab 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', "4.0.2") + 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 f4af7700..90d9660f 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', "1.2.2") + 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 a46389bb..a0b048bd 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', "4.2.2") + 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 a898291b..57575b0e 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', "49.0.2") + 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 @@ -29,7 +29,7 @@ def all_actors(self) -> Iterator[Tuple[str, str, construct.Container]]: yield layer_name, actor_name, actor def follow_link(self, link: str): - if link != '{EMPTY}': + if link != "{EMPTY}": result = self.raw for part in link.split(":"): result = result[part] @@ -68,8 +68,9 @@ def add_actor_to_entity_groups(self, collision_camera_name: str, actor_name: str param actor_name: name of the actor to add to the group param layer_name: name of the layer the actor belongs to """ - collision_camera_groups = [group for group in self.all_actor_groups() - if group.startswith(f"eg_{collision_camera_name}")] + collision_camera_groups = [ + group for group in self.all_actor_groups() if group.startswith(f"eg_{collision_camera_name}") + ] for group in collision_camera_groups: logger.debug("Add actor %s to group %s", actor_name, group) self.add_actor_to_group(group, actor_name, layer_name) diff --git a/src/mercury_engine_data_structures/formats/brsa.py b/src/mercury_engine_data_structures/formats/brsa.py index 23b574c9..75beefc9 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', "2.1.2") + 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 f6d4d076..d579c76a 100644 --- a/src/mercury_engine_data_structures/formats/bsmat.py +++ b/src/mercury_engine_data_structures/formats/bsmat.py @@ -31,7 +31,7 @@ TILING_CLAMPCOLOR=1, TILING_REPEAT=2, TILING_MIRROR=3, - TILING_INVALID=0xffffffff, + TILING_INVALID=0xFFFFFFFF, ) # blend operation @@ -43,7 +43,7 @@ REV_SUB=2, MIN=3, MAX=4, - INVALID=0xffffffff, + INVALID=0xFFFFFFFF, ) # blend mode @@ -60,32 +60,23 @@ ONE_MINUS_SRC_ALPHA=7, DST_ALPHA=8, ONE_MINUS_DST_ALPHA=9, - INVALID=0xffffffff, + INVALID=0xFFFFFFFF, ) # cull command # https://docs.unity3d.com/Manual/SL-Cull.html polygon_cull_mode = Enum( Int32ul, - BACK = 2, - FRONT = 3, - OFF = 4, - INVALID = 0xffffffff, + BACK=2, + FRONT=3, + OFF=4, + INVALID=0xFFFFFFFF, ) # stencil operation value # https://docs.unity3d.com/Manual/SL-Stencil.html#stencil-operation-values stencil_op = Enum( - Int32ul, - KEEP=0, - ZERO=1, - REPLACE=2, - INCR_SAT=3, - DECR_SAT=4, - INVERT=5, - INCR_WRAP=6, - DECR_WRAP=7, - INVALID=0xffffffff + Int32ul, KEEP=0, ZERO=1, REPLACE=2, INCR_SAT=3, DECR_SAT=4, INVERT=5, INCR_WRAP=6, DECR_WRAP=7, INVALID=0xFFFFFFFF ) compare_mode = Enum( @@ -99,14 +90,14 @@ CMPMODE_GREATER=6, CMPMODE_GREATEREQUAL=7, CMPMODE_MAX_COUNT=8, - CMPMODE_INVALID=0xffffffff + CMPMODE_INVALID=0xFFFFFFFF, ) fill_mode = Enum( Int32ul, SOLID=0, WIRE=1, - INVALID=0xffffffff, + INVALID=0xFFFFFFFF, ) shader_type = Enum( @@ -114,7 +105,7 @@ VERTEX=0, PIXEL=1, GEOMETRY=2, - INVALID=0xffffffff, + INVALID=0xFFFFFFFF, ) # seems to be a fancier version of point/bilinear/trilinear with extra trilinear/mipmap stuff @@ -126,57 +117,38 @@ FILTER_NEAREST_MIP_LINEAR=3, FILTER_LINEAR_MIP_NEAREST=4, FILTER_LINEAR_MIP_LINEAR=5, - FILTER_INVALID=0xffffffff, + FILTER_INVALID=0xFFFFFFFF, ) tile_wrap_mode = Enum( - Int32ul, - TILING_CLAMP=0, - TILING_CLAMP_COLOR=1, - TILING_REPEAT=2, - TILING_MIRROR=3, - TILING_INVALID=0xffffffff + Int32ul, TILING_CLAMP=0, TILING_CLAMP_COLOR=1, TILING_REPEAT=2, TILING_MIRROR=3, TILING_INVALID=0xFFFFFFFF ) # === STRUCTS === # seems to be a combo of Blend and BlendOp # ie "Blend source dest && BlendOp operation" -blend_state = Struct( - enabled = Flag, - operation = blend_op, - source = blend_mode, - dest = blend_mode -) +blend_state = Struct(enabled=Flag, operation=blend_op, source=blend_mode, dest=blend_mode) # Stencil test # https://docs.unity3d.com/Manual/SL-Stencil.html stencil_test = Struct( - enabled = Flag, - mask = Int32ul, - ref = Int32ul, - fail = stencil_op, - success = stencil_op, # "pass" is from gist, but keywords exist :P - depth_fail = stencil_op, - depth_success = stencil_op, - cmp_mode = compare_mode + enabled=Flag, + mask=Int32ul, + ref=Int32ul, + fail=stencil_op, + success=stencil_op, # "pass" is from gist, but keywords exist :P + depth_fail=stencil_op, + depth_success=stencil_op, + cmp_mode=compare_mode, ) # alpha test, seems to be deprecated/not exist in HLSL # https://docs.unity3d.com/Manual/SL-AlphaTest.html -alpha_test = Struct( - enabled=Flag, - function=compare_mode, - ref=Float -) +alpha_test = Struct(enabled=Flag, function=compare_mode, ref=Float) # depth test -depth_state = Struct( - depth_test=Byte, - depth_write=Byte, - depth_mode=compare_mode, - z_prepass=Byte -) +depth_state = Struct(depth_test=Byte, depth_write=Byte, depth_mode=compare_mode, z_prepass=Byte) # uniform params, stuff like "vConstant0" or "fAlbedoEmissiveMultiplier" uniform_param = Struct( @@ -187,9 +159,9 @@ { "f": PrefixedArray(Int32ul, Float), "i": PrefixedArray(Int32ul, Int32sl), - "u": PrefixedArray(Int32ul, Int32ul) - } - ) + "u": PrefixedArray(Int32ul, Int32ul), + }, + ), ) # sampler params, imports texture files typically @@ -210,46 +182,42 @@ lod_bias=Float, anisotropic=Float, max_mip_level=Float, - max_anisotropy=Float + max_anisotropy=Float, ) shader_stage = Struct( # there was a Int32ul "type" param in the gist here, that seems to be gone now. uniform_params=PrefixedArray(Int32ul, uniform_param), - sampler_params=PrefixedArray(Int32ul, sampler_param) + sampler_params=PrefixedArray(Int32ul, sampler_param), ) BSMAT = Struct( - _magic = Const(b"MSUR"), - _ver = VersionAdapter("2.17.0"), - name = StrId, - + _magic=Const(b"MSUR"), + _ver=VersionAdapter("2.17.0"), + name=StrId, # Binary shader data - type = translucency_type, - render_layer = Int32ul, - shader_path = StrId, - blendstate = blend_state, - cullstate = polygon_cull_mode, - stencilstate = stencil_test, - alphastate = alpha_test, - fillmode = fill_mode, - depth = depth_state, - + type=translucency_type, + render_layer=Int32ul, + shader_path=StrId, + blendstate=blend_state, + cullstate=polygon_cull_mode, + stencilstate=stencil_test, + alphastate=alpha_test, + fillmode=fill_mode, + depth=depth_state, # differs from the gist but its const across all files - _const0 = Const(0, Int32ul), # 0 - _const1 = Const(2, Int32ul), # 2 - _const2 = Const(0, Int32ul), # 0 - + _const0=Const(0, Int32ul), # 0 + _const1=Const(2, Int32ul), # 2 + _const2=Const(0, Int32ul), # 0 # these also differ from gist and mostly are only in system shaders, from what I can tell - extra_uniforms = PrefixedArray(Int32ul, uniform_param), - extra_samplers = PrefixedArray(Int32ul, sampler_param), - + extra_uniforms=PrefixedArray(Int32ul, uniform_param), + extra_samplers=PrefixedArray(Int32ul, sampler_param), # important stuff here! - shader_stages = PrefixedArray(Int32ul, shader_stage), - - _end = construct.Terminated + shader_stages=PrefixedArray(Int32ul, shader_stage), + _end=construct.Terminated, ) + class Bsmat(BaseResource): @classmethod def construct_class(cls, target_game: Game) -> Construct: diff --git a/src/mercury_engine_data_structures/formats/btunda.py b/src/mercury_engine_data_structures/formats/btunda.py index d608736b..062eb89c 100644 --- a/src/mercury_engine_data_structures/formats/btunda.py +++ b/src/mercury_engine_data_structures/formats/btunda.py @@ -10,17 +10,17 @@ from mercury_engine_data_structures.game_check import Game VALID_BTUNDA_VERSIONS = [ - "119.0.2", # 1.0.0 - "128.0.2", # 2.1.0 + "119.0.2", # 1.0.0 + "128.0.2", # 2.1.0 ] BTUNDA = Struct( - _class_crc=construct.Const('base::tunable::CTunableManager', PropertyEnum), + _class_crc=construct.Const("base::tunable::CTunableManager", PropertyEnum), version=VersionAdapter(), _version_check=construct.Check(lambda ctx: ctx.version in VALID_BTUNDA_VERSIONS), - root_type=construct.Const('Root', PropertyEnum), - Root=type_lib.get_type_lib_dread().get_type('base::tunable::CTunableManager').construct, - _end=construct.Terminated + root_type=construct.Const("Root", PropertyEnum), + Root=type_lib.get_type_lib_dread().get_type("base::tunable::CTunableManager").construct, + _end=construct.Terminated, ) PLAYER_TUNABLE_LATEST_ONLY = [ @@ -59,6 +59,7 @@ "fEasyModeKraidBouncingCreatureLifeFactor", ] + class Btunda(BaseResource): """ /!\\ /!\\ /!\\ READ THIS WHEN USING!!! /!\\ /!\\ /!\\ diff --git a/src/mercury_engine_data_structures/formats/buct.py b/src/mercury_engine_data_structures/formats/buct.py index 5b7ebeb9..57d2a407 100644 --- a/src/mercury_engine_data_structures/formats/buct.py +++ b/src/mercury_engine_data_structures/formats/buct.py @@ -17,28 +17,26 @@ from mercury_engine_data_structures.formats.base_resource import BaseResource BUCT = Struct( - _magic = Const(b"MUCT"), - version = game_check.is_sr_or_else( - VersionAdapter("1.3.0"), - VersionAdapter("1.4.0") - ), - size = Rebuild(Int32ul, construct.len_(construct.this.data)), - _padding = If(game_check.current_game_at_least(game_check.Game.DREAD), Const(0xFFFFFFFF, Int32ul)), - _data_start = game_check.is_sr_or_else( - Const(0x10, Int32ul), - Const(0x18, Int64ul) - ), - data=Array(construct.this.size, Struct( - char_maybe = Int16ul, # I think this could be utf8 chars? - _padding = game_check.is_sr_or_else( - Const(0x0000, Int16ul), - Const(0xFFFF, Int16ul), + _magic=Const(b"MUCT"), + version=game_check.is_sr_or_else(VersionAdapter("1.3.0"), VersionAdapter("1.4.0")), + size=Rebuild(Int32ul, construct.len_(construct.this.data)), + _padding=If(game_check.current_game_at_least(game_check.Game.DREAD), Const(0xFFFFFFFF, Int32ul)), + _data_start=game_check.is_sr_or_else(Const(0x10, Int32ul), Const(0x18, Int64ul)), + data=Array( + construct.this.size, + Struct( + char_maybe=Int16ul, # I think this could be utf8 chars? + _padding=game_check.is_sr_or_else( + Const(0x0000, Int16ul), + Const(0xFFFF, Int16ul), + ), + index=Int32ul, ), - index = Int32ul - )), - _eof=Terminated + ), + _eof=Terminated, ) + class Buct(BaseResource): @classmethod def construct_class(cls, target_game: game_check.Game) -> Construct: diff --git a/src/mercury_engine_data_structures/formats/gui_files.py b/src/mercury_engine_data_structures/formats/gui_files.py index ee6e09af..e50d472a 100644 --- a/src/mercury_engine_data_structures/formats/gui_files.py +++ b/src/mercury_engine_data_structures/formats/gui_files.py @@ -4,10 +4,11 @@ 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', "1.2.2", explicit_root=True) -BMSSH = standard_format.create('GUI::CGUIManager::ShapeContainer', "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) +BMSCP = standard_format.create("GUI::CDisplayObjectContainer", "1.2.2", explicit_root=True) +BMSSH = standard_format.create("GUI::CGUIManager::ShapeContainer", "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): @classmethod @@ -15,20 +16,19 @@ def construct_class(cls, target_game: Game) -> Construct: return BMSCP def get_child(self, path: str) -> Container: - hier = path.split('.') + hier = path.split(".") root = self.raw.Root for child in hier: - root = next( - item for item in root.lstChildren - if item.sID == child - ) + root = next(item for item in root.lstChildren if item.sID == child) return root + class Bmssh(BaseResource): @classmethod def construct_class(cls, target_game: Game) -> Construct: return BMSSH + class Bmssk(BaseResource): @classmethod def construct_class(cls, target_game: Game) -> Construct: diff --git a/src/mercury_engine_data_structures/formats/ini.py b/src/mercury_engine_data_structures/formats/ini.py index 879b6c07..a81b8c6c 100644 --- a/src/mercury_engine_data_structures/formats/ini.py +++ b/src/mercury_engine_data_structures/formats/ini.py @@ -13,7 +13,7 @@ if typing.TYPE_CHECKING: from mercury_engine_data_structures.file_tree_editor import FileTreeEditor -INI = Struct('text' / GreedyString('utf-8')) +INI = Struct("text" / GreedyString("utf-8")) class Ini(BaseResource): @@ -40,7 +40,7 @@ def config(self) -> ConfigParser: if self._config is None: self._config = ConfigParser(strict=False) self._config.optionxform = lambda option: option - self._config.read_string(self.raw.text, source='config.ini') + self._config.read_string(self.raw.text, source="config.ini") return self._config def build(self) -> bytes: diff --git a/src/mercury_engine_data_structures/formats/lua.py b/src/mercury_engine_data_structures/formats/lua.py index 911a2109..2a6abbe8 100644 --- a/src/mercury_engine_data_structures/formats/lua.py +++ b/src/mercury_engine_data_structures/formats/lua.py @@ -14,7 +14,7 @@ from mercury_engine_data_structures.file_tree_editor import FileTreeEditor LUA = construct.Struct( - lua_text = StrId, + lua_text=StrId, ) diff --git a/src/mercury_engine_data_structures/formats/pkg.py b/src/mercury_engine_data_structures/formats/pkg.py index b1d8f6b2..c861e2a2 100644 --- a/src/mercury_engine_data_structures/formats/pkg.py +++ b/src/mercury_engine_data_structures/formats/pkg.py @@ -82,10 +82,12 @@ def _parse(self, stream, context, path) -> construct.Container: for i, header in enumerate(file_headers): file_path = f"{path} -> file {i}" construct.stream_seek(stream, header.start_offset, 0, file_path) - files.append(construct.Container( - asset_id=header.asset_id, - data=construct.stream_read(stream, header.end_offset - header.start_offset, file_path) - )) + files.append( + construct.Container( + asset_id=header.asset_id, + data=construct.stream_read(stream, header.end_offset - header.start_offset, file_path), + ) + ) return construct.Container(files=files) @@ -124,11 +126,13 @@ def _build(self, obj: construct.Container, stream, context, path): start_offset = construct.stream_tell(stream, path) construct.stream_write(stream, file.data, len(file.data), field_path) end_offset = construct.stream_tell(stream, path) - file_headers.append(construct.Container( - asset_id=file.asset_id, - start_offset=start_offset, - end_offset=end_offset, - )) + file_headers.append( + construct.Container( + asset_id=file.asset_id, + start_offset=start_offset, + end_offset=end_offset, + ) + ) # Dread aligns to 8 bytes, Samus Returns randomly(???) if self.game == Game.DREAD: pad = -(end_offset - start_offset) % 8 @@ -185,8 +189,7 @@ def header_class(cls, target_game: Game) -> Construct: @classmethod def parse_stream(cls, stream: typing.BinaryIO, target_game: Game) -> Pkg: - return cls(cls.construct_class(target_game).parse_stream(stream, target_game=target_game), - target_game) + return cls(cls.construct_class(target_game).parse_stream(stream, target_game=target_game), target_game) def build_stream(self, stream: typing.BinaryIO) -> bytes: return self.construct_class(self.target_game).build_stream(self._raw, stream, target_game=self.target_game) @@ -219,10 +222,12 @@ def add_asset(self, asset_id: NameOrAssetId, new_file: bytes): if self.get_asset(asset_id) is not None: raise ValueError(f"Asset id already exists: {asset_id}") - self.raw.files.append(construct.Container( - asset_id=asset_id, - data=new_file, - )) + self.raw.files.append( + construct.Container( + asset_id=asset_id, + data=new_file, + ) + ) def remove_asset(self, asset_id: NameOrAssetId): asset_id = resolve_asset_id(asset_id, self.target_game) diff --git a/src/mercury_engine_data_structures/formats/property_enum.py b/src/mercury_engine_data_structures/formats/property_enum.py index 47ba5f6d..ca19719f 100644 --- a/src/mercury_engine_data_structures/formats/property_enum.py +++ b/src/mercury_engine_data_structures/formats/property_enum.py @@ -57,8 +57,7 @@ def _decode(self, obj: int, context, path) -> HashedName: return self.hash_set.inverted_hashes(context)[obj] except KeyError: msg = "no mapping for 0x{:08X} ({})".format( - obj, obj.to_bytes(self._raw_subcon.sizeof(target_game=context._params.target_game), - "little") + obj, obj.to_bytes(self._raw_subcon.sizeof(target_game=context._params.target_game), "little") ) if self.allow_unknowns: if self.display_warnings: @@ -83,10 +82,7 @@ def _encode(self, obj: HashedName, context, path): game: Game = context._params.target_game return game.hash_asset(obj) - raise construct.MappingError( - "building failed, " + msg, - path=path - ) + raise construct.MappingError("building failed, " + msg, path=path) def _emitparse(self, code: construct.CodeGen): n = self.hash_set.name diff --git a/src/mercury_engine_data_structures/formats/standard_format.py b/src/mercury_engine_data_structures/formats/standard_format.py index ca23ec62..c5c5b933 100644 --- a/src/mercury_engine_data_structures/formats/standard_format.py +++ b/src/mercury_engine_data_structures/formats/standard_format.py @@ -14,8 +14,12 @@ 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 | str | tuple[int, int, 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: @@ -25,20 +29,21 @@ def create(name: Optional[str], version: Optional[int | str | tuple[int, int, in root = construct.FocusedSeq( "root", "type" / construct.Rebuild(PropertyEnum, name), - "root" / type_lib.GetTypeConstruct(lambda this: this._.type) + "root" / type_lib.GetTypeConstruct(lambda this: this._.type), ) else: root = type_lib.get_type(root_name).construct - result = GameSpecificStruct(construct.Struct( - _class_crc=_const_if_present(PropertyEnum, name), - _version=VersionAdapter(version), - - root_type=construct.Const('Root', PropertyEnum), - Root=root, - - _end=construct.Terminated, - ), Game.DREAD) + result = GameSpecificStruct( + construct.Struct( + _class_crc=_const_if_present(PropertyEnum, name), + _version=VersionAdapter(version), + root_type=construct.Const("Root", PropertyEnum), + Root=root, + _end=construct.Terminated, + ), + Game.DREAD, + ) result.name = name return result diff --git a/src/mercury_engine_data_structures/game_check.py b/src/mercury_engine_data_structures/game_check.py index b9c8bd92..4deb060b 100644 --- a/src/mercury_engine_data_structures/game_check.py +++ b/src/mercury_engine_data_structures/game_check.py @@ -1,6 +1,7 @@ """ For checking which game is being parsed """ + from enum import Enum from functools import cached_property from typing import Any, Callable @@ -60,9 +61,11 @@ def hash_asset(self, msg: str) -> int: def known_hashes_table(self): if self == Game.DREAD: from mercury_engine_data_structures import dread_data + return dread_data.all_name_to_asset_id() elif self == Game.SAMUS_RETURNS: from mercury_engine_data_structures import samus_returns_data + return samus_returns_data.all_name_to_asset_id() else: raise ValueError(f"Unsupported game: {self}") @@ -107,9 +110,11 @@ def is_at_most(target: Game, subcon_true, subcon_false) -> IfThenElse: def _emitbuild(code: construct.CodeGen): code.append("from mercury_engine_data_structures.game_check import Game") - return (f"(({result.thensubcon._compilebuild(code)}) " - f"if ({result.condfunc}) " - f"else ({result.elsesubcon._compilebuild(code)}))") + return ( + f"(({result.thensubcon._compilebuild(code)}) " + f"if ({result.condfunc}) " + f"else ({result.elsesubcon._compilebuild(code)}))" + ) result._emitbuild = _emitbuild @@ -123,17 +128,13 @@ def __init__(self, subcon, game: Game): def _parse(self, stream, context, path): if get_current_game(context) != self.target_game: - raise construct.ExplicitError( - f"Expected {self.target_game}, got {get_current_game(context)}", path=path - ) + raise construct.ExplicitError(f"Expected {self.target_game}, got {get_current_game(context)}", path=path) return super()._parse(stream, context, path) def _build(self, obj, stream, context, path): if get_current_game(context) != self.target_game: - raise construct.ExplicitError( - f"Expected {self.target_game}, got {get_current_game(context)}", path=path - ) + raise construct.ExplicitError(f"Expected {self.target_game}, got {get_current_game(context)}", path=path) return super()._build(obj, stream, context, path) diff --git a/src/mercury_engine_data_structures/object.py b/src/mercury_engine_data_structures/object.py index 0695ac06..b2f913dd 100644 --- a/src/mercury_engine_data_structures/object.py +++ b/src/mercury_engine_data_structures/object.py @@ -27,15 +27,15 @@ def _parse(self, stream, context, path) -> typing.Union[construct.Container, con try: field_construct = self.fields[field_type] except KeyError: - raise construct.ExplicitError(f"Type {field_type} not known, valid types are {list(self.fields)}.", - path=field_path) + raise construct.ExplicitError( + f"Type {field_type} not known, valid types are {list(self.fields)}.", path=field_path + ) field_value = field_construct._parsereport(stream, context, field_path) if array_response or field_type in result: if not array_response: result = construct.ListContainer( - construct.Container(type=name, item=value) - for name, value in result.items() + construct.Container(type=name, item=value) for name, value in result.items() ) array_response = True result.append(construct.Container(type=field_type, item=field_value)) @@ -48,6 +48,7 @@ def _build(self, obj: typing.Union[construct.Container, construct.ListContainer] construct.Int32ul._build(len(obj), stream, context, path) if isinstance(obj, list): + def list_iter(): for it in obj: yield it["type"], it["item"] diff --git a/src/mercury_engine_data_structures/pointer_set.py b/src/mercury_engine_data_structures/pointer_set.py index 0426282f..2d0a2a87 100644 --- a/src/mercury_engine_data_structures/pointer_set.py +++ b/src/mercury_engine_data_structures/pointer_set.py @@ -1,6 +1,7 @@ """ Helper class to handle objects that contain a pointer to objects of varied types, usually all with the same base type. """ + import copy import struct from typing import Dict, Type, Union @@ -24,14 +25,14 @@ def __init__(self, types: Dict[int, Union[Construct, Type[Construct]]], category self.switch_con = Switch( construct.this.type, types, - ErrorWithMessage(lambda ctx: ( - f"Property {ctx.type} ({get_name(ctx.type)}) without assigned type" - )), + ErrorWithMessage(lambda ctx: (f"Property {ctx.type} ({get_name(ctx.type)}) without assigned type")), + ) + super().__init__( + Struct( + type=Hex(Int64ul), + ptr=self.switch_con, + ) ) - super().__init__(Struct( - type=Hex(Int64ul), - ptr=self.switch_con, - )) self.types = types self.category = category diff --git a/src/mercury_engine_data_structures/samus_returns_data.py b/src/mercury_engine_data_structures/samus_returns_data.py index 33a4eac3..d34d120d 100644 --- a/src/mercury_engine_data_structures/samus_returns_data.py +++ b/src/mercury_engine_data_structures/samus_returns_data.py @@ -30,10 +30,7 @@ def all_name_to_asset_id() -> Dict[str, int]: @functools.lru_cache def all_asset_id_to_name() -> Dict[int, str]: - return { - asset_id: name - for name, asset_id in all_name_to_asset_id().items() - } + return {asset_id: name for name, asset_id in all_name_to_asset_id().items()} def name_for_asset_id(asset_id: int) -> Optional[str]: @@ -55,10 +52,8 @@ def all_name_to_property_id() -> Dict[str, int]: def all_property_id_to_name() -> Dict[int, str]: names = all_name_to_property_id() - return { - asset_id: name - for name, asset_id in names.items() - } + return {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("."): @@ -67,5 +62,4 @@ def all_files_ending_with(ext: str, exclusions: Optional[list[str]] = None) -> l 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] + 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/type_lib.py b/src/mercury_engine_data_structures/type_lib.py index e0ec9775..aa63c824 100644 --- a/src/mercury_engine_data_structures/type_lib.py +++ b/src/mercury_engine_data_structures/type_lib.py @@ -33,12 +33,19 @@ def from_json(cls, name: str, data: dict, target_game: Game) -> BaseType: @property def name_as_python_identifier(self) -> str: - return self.name.replace("::", "_").replace(" ", "_").replace("<", "_").replace( - ">", "_").replace(",", "_").replace("*", "Ptr") + return ( + self.name.replace("::", "_") + .replace(" ", "_") + .replace("<", "_") + .replace(">", "_") + .replace(",", "_") + .replace("*", "Ptr") + ) @property def construct(self) -> construct.Construct: from mercury_engine_data_structures.formats import dread_types + return getattr(dread_types, self.name_as_python_identifier) @property @@ -102,6 +109,7 @@ class PrimitiveKind(Enum): BYTES = "bytes" PROPERTY = "property" + primitive_to_type = { PrimitiveKind.STRING: str, PrimitiveKind.BOOL: bool, @@ -118,11 +126,11 @@ class PrimitiveKind(Enum): } primitive_int_bounds = { - PrimitiveKind.INT: (-2**31, 2**31 - 1), - PrimitiveKind.UINT_16: (0, 2**16 - 1), - PrimitiveKind.UINT: (0, 2**32 - 1), - PrimitiveKind.UINT_64: (0, 2**64 - 1), - PrimitiveKind.PROPERTY: (0, 2**64 - 1), + PrimitiveKind.INT: (-(2**31), 2**31 - 1), + PrimitiveKind.UINT_16: (0, 2**16 - 1), + PrimitiveKind.UINT: (0, 2**32 - 1), + PrimitiveKind.UINT_64: (0, 2**64 - 1), + PrimitiveKind.PROPERTY: (0, 2**64 - 1), } primitive_vector_lengths = { @@ -147,6 +155,7 @@ def from_json(cls, name: str, data: dict, target_game: Game) -> PrimitiveType: @property def construct(self) -> construct.Construct: from mercury_engine_data_structures.formats import dread_types + return dread_types.primitive_to_construct[self.primitive_kind.value] def _find_type_errors(self, __value: typing.Any) -> BaseException | None: @@ -164,15 +173,13 @@ def _find_type_errors(self, __value: typing.Any) -> BaseException | None: if self.primitive_kind in primitive_vector_lengths: length = primitive_vector_lengths[self.primitive_kind] - if ( - len(__value) == length - and all(isinstance(v, float) for v in __value) - ): + if len(__value) == length and all(isinstance(v, float) for v in __value): return None return ValueError(f"Invalid CVector{length}D: {__value}") return None + @dataclasses.dataclass(frozen=True) class StructType(BaseType): parent: str | None @@ -231,9 +238,12 @@ def from_json(cls, name: str, data: dict, target_game: Game) -> EnumType: def enum_class(self) -> type[enum.IntEnum]: from mercury_engine_data_structures.game_check import Game + if self.target_game == Game.DREAD: - return getattr(importlib.import_module("mercury_engine_data_structures.formats.dread_types"), - self.name_as_python_identifier) + return getattr( + importlib.import_module("mercury_engine_data_structures.formats.dread_types"), + self.name_as_python_identifier, + ) raise NotImplementedError def _find_type_errors(self, __value: typing.Any) -> BaseException | None: @@ -287,14 +297,11 @@ def _find_type_errors(self, __value: typing.Any) -> BaseException | None: names = {v.name for v in expected} if isinstance(__value, dict): - if not all( - isinstance(k, str) and isinstance(v, bool) - for k, v in __value.items() - ): + if not all(isinstance(k, str) and isinstance(v, bool) for k, v in __value.items()): return TypeError(f"Expected dict[str, bool]; got {__value}") invalid = [k for k in __value if k not in names] elif isinstance(__value, str): - invalid = [v for v in __value.split('|') if v not in names] + invalid = [v for v in __value.split("|") if v not in names] else: return TypeError(f"Expected {self.name}; got {type(__value).__name__}") @@ -335,6 +342,7 @@ def from_json(cls, name: str, data: dict, target_game: Game) -> PointerType: @property def pointer_set(self) -> PointerSet: from mercury_engine_data_structures.formats import dread_types + target = self.type_lib.get_type(self.target) return getattr(dread_types, f"Pointer_{target.name_as_python_identifier}") @@ -381,10 +389,7 @@ def from_json(cls, name: str, data: dict, target_game: Game) -> VectorType: def _find_type_errors(self, __value: typing.Any) -> BaseException | None: if not isinstance(__value, typing.Iterable): return TypeError(f"{type(__value).__name__} is not iterable") - errors = { - i: self.type_lib.get_type(self.value_type)._find_type_errors(v) - for i, v in enumerate(__value) - } + errors = {i: self.type_lib.get_type(self.value_type)._find_type_errors(v) for i, v in enumerate(__value)} errors = {i: v for i, v in errors.items() if v is not None} if errors: return TypeError(*errors.items()) @@ -408,15 +413,11 @@ def _find_type_errors(self, __value: typing.Any) -> BaseException | None: if not isinstance(__value, dict): return TypeError(f"Expected dict[{self.key_type}, {self.value_type}]; got {type(__value).__name__}") - key_errors = { - key: self.type_lib.get_type(self.key_type)._find_type_errors(key) - for key in __value.keys() - } + key_errors = {key: self.type_lib.get_type(self.key_type)._find_type_errors(key) for key in __value.keys()} key_errors = {k: v for k, v in key_errors.items() if v is not None} value_errors = { - key: self.type_lib.get_type(self.value_type)._find_type_errors(value) - for key, value in __value.items() + key: self.type_lib.get_type(self.value_type)._find_type_errors(value) for key, value in __value.items() } value_errors = {k: v for k, v in value_errors.items() if v is not None} @@ -443,18 +444,11 @@ def __init__(self, types_dict: dict[str, typing.Any], target_game: Game): @functools.lru_cache def all_types(self) -> dict[str, BaseType]: - return { - name: decode_type(name, data, self.target_game) - for name, data in self.types_dict.items() - } + return {name: decode_type(name, data, self.target_game) for name, data in self.types_dict.items()} @functools.lru_cache def all_constructs(self) -> dict[str, construct.Construct]: - return { - name: type.construct - for name, type in self.all_types().items() - } - + return {name: type.construct for name, type in self.all_types().items()} def get_type(self, type_name: str, *, follow_typedef: bool = True) -> BaseType: result = self.all_types()[type_name] @@ -465,21 +459,20 @@ def get_type(self, type_name: str, *, follow_typedef: bool = True) -> BaseType: return result - def GetTypeConstruct(self, keyfunc, follow_typedef: bool = True) -> construct.Construct: return construct.FocusedSeq( "switch", "key" / construct.Computed(keyfunc), "type" / construct.Computed(lambda this: self.get_type(this.key, follow_typedef=follow_typedef).name), - "switch" / construct.Switch( + "switch" + / construct.Switch( lambda this: this.type, self.all_constructs(), - construct.Error + construct.Error, # ErrorWithMessage(lambda this: f"Unknown type: {this.type}", construct.SwitchError) - ) + ), ) - def get_parent_for(self, type_name: str) -> str | None: data = self.get_type(type_name) @@ -489,7 +482,6 @@ def get_parent_for(self, type_name: str) -> str | None: return None - def is_child_of(self, type_name: str | None, parent_name: str) -> bool: """ Checks if the type_name is a direct or indirect child of the type parent_name @@ -502,7 +494,6 @@ def is_child_of(self, type_name: str | None, parent_name: str) -> bool: return self.is_child_of(self.get_parent_for(type_name), parent_name) - @functools.lru_cache def all_direct_children(self) -> dict[str, set[str]]: """ @@ -516,7 +507,6 @@ def all_direct_children(self) -> dict[str, set[str]]: return dict(result) - def get_all_children_for(self, type_name: str) -> set[str]: """ Get all direct and indirect children for a given type. @@ -540,6 +530,7 @@ def get_all_children_for(self, type_name: str) -> set[str]: def get_type_lib_dread(): from mercury_engine_data_structures import dread_data from mercury_engine_data_structures.game_check import Game + return TypeLib(dread_data.get_raw_types(), Game.DREAD) @@ -547,12 +538,14 @@ def get_type_lib_dread(): def get_type_lib_samus_returns(): from mercury_engine_data_structures import samus_returns_data from mercury_engine_data_structures.game_check import Game + return TypeLib(samus_returns_data.get_raw_types(), Game.SAMUS_RETURNS) @functools.lru_cache def get_type_lib_for_game(game: Game): from mercury_engine_data_structures.game_check import Game + if game == Game.DREAD: return get_type_lib_dread() if game == Game.SAMUS_RETURNS: diff --git a/tests/conftest.py b/tests/conftest.py index 2c218240..9707fc0e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -39,8 +39,13 @@ def dread_file_tree(dread_path): def pytest_addoption(parser): - parser.addoption('--fail-if-missing', action='store_true', dest="fail_if_missing", - default=False, help="Fails tests instead of skipping, in case any asset is missing") + parser.addoption( + "--fail-if-missing", + action="store_true", + dest="fail_if_missing", + default=False, + help="Fails tests instead of skipping, in case any asset is missing", + ) def pytest_configure(config: pytest.Config): diff --git a/tests/formats/test_bcmdl.py b/tests/formats/test_bcmdl.py index 47ebf7fe..4fdcee04 100644 --- a/tests/formats/test_bcmdl.py +++ b/tests/formats/test_bcmdl.py @@ -7,20 +7,20 @@ from mercury_engine_data_structures.formats.bcmdl import Bcmdl dread_bcmdl_expected_failure = [ - 'actors/characters/morphball/models/labase.bcmdl', - 'actors/characters/morphball/models/ladamage.bcmdl', - 'actors/characters/samus/models/phasedisplacement_new.bcmdl', - 'actors/items/powerup_sonar/models/powerup_sonar.bcmdl', - 'actors/props/teleporter/models/samusaura.bcmdl', - 'actors/props/teleporter/models/teleporttunnel.bcmdl', - 'actors/weapons/grapplebeam/models/grapplelightning_1.bcmdl', - 'actors/weapons/weaponboost/models/weaponboost.bcmdl', - 'actors/weapons/weaponboost/models/weaponboostmorphball.bcmdl', - 'system/engine/models/immune.bcmdl', - 'system/engine/models/sedisolve.bcmdl', - 'system/engine/models/sedisolver.bcmdl', - 'system/engine/models/selected_hi.bcmdl', - 'system/engine/models/selected_lo.bcmdl', + "actors/characters/morphball/models/labase.bcmdl", + "actors/characters/morphball/models/ladamage.bcmdl", + "actors/characters/samus/models/phasedisplacement_new.bcmdl", + "actors/items/powerup_sonar/models/powerup_sonar.bcmdl", + "actors/props/teleporter/models/samusaura.bcmdl", + "actors/props/teleporter/models/teleporttunnel.bcmdl", + "actors/weapons/grapplebeam/models/grapplelightning_1.bcmdl", + "actors/weapons/weaponboost/models/weaponboost.bcmdl", + "actors/weapons/weaponboost/models/weaponboostmorphball.bcmdl", + "system/engine/models/immune.bcmdl", + "system/engine/models/sedisolve.bcmdl", + "system/engine/models/sedisolver.bcmdl", + "system/engine/models/selected_hi.bcmdl", + "system/engine/models/selected_lo.bcmdl", ] @@ -32,31 +32,32 @@ def test_compare_dread_all(dread_file_tree, bcmdl_path): expectation = contextlib.nullcontext() with expectation: - parse_build_compare_editor( - Bcmdl, dread_file_tree, bcmdl_path - ) + parse_build_compare_editor(Bcmdl, dread_file_tree, bcmdl_path) def test_change_material(dread_file_tree): construct_class = Bcmdl.construct_class(dread_file_tree.target_game) - model = dread_file_tree.get_parsed_asset("actors/props/doorshieldsupermissile/models/doorshieldsupermissile.bcmdl", - type_hint=Bcmdl) + model = dread_file_tree.get_parsed_asset( + "actors/props/doorshieldsupermissile/models/doorshieldsupermissile.bcmdl", type_hint=Bcmdl + ) # ensure replacing it with the exact length works replace = "actors/props/doorshieldsupermissile/models/imats/doorshieldsupermissile_mp_opaque_69.bsmat" model.change_material_path("mp_opaque_01", replace) encoded = construct_class.build(model.raw, target_game=dread_file_tree.target_game) - assert encoded[0x5845:0x58A0] == (b"actors/props/doorshieldsupermissile/models/imats/" - b"doorshieldsupermissile_mp_opaque_69.bsmat\0") + assert encoded[0x5845:0x58A0] == ( + b"actors/props/doorshieldsupermissile/models/imats/" b"doorshieldsupermissile_mp_opaque_69.bsmat\0" + ) # ensure replacing it with a shorter length works replace = "actors/props/doorshieldsupermiss/models/imats/doorshieldsupermiss_mp_opaque_01.bsmat" model.change_material_path("mp_opaque_01", replace) encoded2 = construct_class.build(model.raw, target_game=dread_file_tree.target_game) - assert encoded2[0x5845:0x58A0] == (b"actors/props/doorshieldsupermiss/models/imats/" - b"doorshieldsupermiss_mp_opaque_01.bsmat\0\0\0\0\0\0\0") + assert encoded2[0x5845:0x58A0] == ( + b"actors/props/doorshieldsupermiss/models/imats/" b"doorshieldsupermiss_mp_opaque_01.bsmat\0\0\0\0\0\0\0" + ) long_path = "actors/props/doorshieldsupermissile/models/imats/doorshieldsupermissile_mp_opaque_420.bsmat" expectation = pytest.raises(ValueError) diff --git a/tests/formats/test_bcskla.py b/tests/formats/test_bcskla.py index e699a6b2..b1de720b 100644 --- a/tests/formats/test_bcskla.py +++ b/tests/formats/test_bcskla.py @@ -1199,13 +1199,15 @@ "actors/props/menu_samus/animations/menurelax.bcskla", "actors/props/planet/animations/relax.bcskla", "maps/objects/animadorn1002/animadorn1002.bcskla", - "maps/objects/animplant0602b/animplant0602b.bcskla" + "maps/objects/animplant0602b/animplant0602b.bcskla", ] + @pytest.mark.parametrize("bcskla_path", dread_data.all_files_ending_with(".bcskla")) def test_bcskla_dread(dread_file_tree, bcskla_path): parse_build_compare_editor(Bcskla, dread_file_tree, bcskla_path) + @pytest.mark.parametrize("bcskla_path", samus_returns_data.all_files_ending_with(".bcskla", sr_missing)) def test_bcskla_sr(samus_returns_tree, bcskla_path): parse_build_compare_editor(Bcskla, samus_returns_tree, bcskla_path) diff --git a/tests/formats/test_bctex.py b/tests/formats/test_bctex.py index fa0c82e2..3cbe2b2d 100644 --- a/tests/formats/test_bctex.py +++ b/tests/formats/test_bctex.py @@ -178,10 +178,12 @@ "system/fx/textures/wind_arc.bctex", ] + @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) + @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 790ca210..99d362b6 100644 --- a/tests/formats/test_blsnd.py +++ b/tests/formats/test_blsnd.py @@ -9,6 +9,7 @@ def test_blsnd(samus_returns_tree, blsnd_path): parse_build_compare_editor(Blsnd, samus_returns_tree, blsnd_path) + @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_bmdefs.py b/tests/formats/test_bmdefs.py index 0d002045..61289a74 100644 --- a/tests/formats/test_bmdefs.py +++ b/tests/formats/test_bmdefs.py @@ -6,5 +6,6 @@ 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 da83edf9..0a780ad0 100644 --- a/tests/formats/test_bmmap.py +++ b/tests/formats/test_bmmap.py @@ -8,4 +8,3 @@ @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 index 742e4d44..af087bd1 100644 --- a/tests/formats/test_bmmdef.py +++ b/tests/formats/test_bmmdef.py @@ -4,6 +4,4 @@ def test_compare_bmmdef_dread(dread_file_tree): - parse_build_compare_editor( - Bmmdef, dread_file_tree, "system/minimap/minimap.bmmdef" - ) + 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 6c167548..0db80c5d 100644 --- a/tests/formats/test_bmsad.py +++ b/tests/formats/test_bmsad.py @@ -354,6 +354,7 @@ "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: @@ -362,9 +363,7 @@ def test_compare_dread_all(dread_file_tree, bmsad_path): expectation = contextlib.nullcontext() with expectation: - parse_build_compare_editor( - Bmsad, dread_file_tree, bmsad_path - ) + parse_build_compare_editor(Bmsad, dread_file_tree, bmsad_path) @pytest.mark.parametrize("bmsad_path", samus_returns_data.all_files_ending_with(".bmsad", sr_missing)) @@ -374,8 +373,7 @@ def test_compare_sr_all(samus_returns_tree, bmsad_path): def test_api_dread_actordef(dread_file_tree: FileTreeEditor): bmsad = dread_file_tree.get_parsed_asset( - "actors/logic/breakablehint/charclasses/breakablehint.bmsad", - type_hint=Bmsad + "actors/logic/breakablehint/charclasses/breakablehint.bmsad", type_hint=Bmsad ) fakename = "foo" @@ -410,10 +408,7 @@ def test_api_dread_actordef(dread_file_tree: FileTreeEditor): def test_api_dread_charclass(dread_file_tree: FileTreeEditor): - bmsad = dread_file_tree.get_parsed_asset( - "actors/props/doorheat/charclasses/doorheat.bmsad", - type_hint=Bmsad - ) + bmsad = dread_file_tree.get_parsed_asset("actors/props/doorheat/charclasses/doorheat.bmsad", type_hint=Bmsad) fakename = "foo" @@ -431,7 +426,7 @@ def test_api_dread_charclass(dread_file_tree: FileTreeEditor): ("props/heatdoor/hdoor_open_02.wav", 1), ("props/heatdoor/hdoor_close_01.wav", 1), ("props/heatdoor/hdoor_init.wav", 1), - ("props/heatdoor/hdoor_open_01.wav", 1) + ("props/heatdoor/hdoor_open_01.wav", 1), ] navmesh = bmsad.components["NAVMESHITEM"] @@ -467,11 +462,7 @@ def test_api_dread_charclass(dread_file_tree: FileTreeEditor): # functions funcs = list(navmesh.functions) - assert [func.name for func in funcs] == [ - "CreateStage", - "AddStageCollider", - "CreateStage" - ] + assert [func.name for func in funcs] == ["CreateStage", "AddStageCollider", "CreateStage"] newfunc = ActorDefFunc.new("CreateStage") newfunc.set_param("Stage", "in-between") funcs.append(newfunc) diff --git a/tests/formats/test_bmsbk.py b/tests/formats/test_bmsbk.py index bbc5acf5..7c2e46a3 100644 --- a/tests/formats/test_bmsbk.py +++ b/tests/formats/test_bmsbk.py @@ -11,6 +11,7 @@ "maps/levels/c10_samus/s920_traininggallery/s920_traininggallery.bmsbk", ] + @pytest.mark.parametrize("bmsbk_path", samus_returns_data.all_files_ending_with(".bmsbk", sr_missing)) def test_bmsbk(samus_returns_tree, bmsbk_path): parse_build_compare_editor(Bmsbk, samus_returns_tree, bmsbk_path) diff --git a/tests/formats/test_bmsld.py b/tests/formats/test_bmsld.py index d4f3638e..faf31eaf 100644 --- a/tests/formats/test_bmsld.py +++ b/tests/formats/test_bmsld.py @@ -20,28 +20,33 @@ "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("maps/levels/c10_samus/s000_surface/s000_surface.bmsld", type_hint=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) + def test_all_actor_groups(surface_bmsld: Bmsld): all_groups = surface_bmsld.all_actor_groups() assert len(list(all_groups)) == 32 -@pytest.mark.parametrize(("cc_name", "actor_name", "should_be_present"), - [ - ("eg_SubArea_collision_camera_008", "LE_PowerUP_ChargeBeam", True), - ("eg_SubArea_collision_camera_012", "LE_PowerUP_ChargeBeam", False), - ("eg_SubArea_collision_camera_010", "SG_Alpha_001", True), - ("eg_SubArea_collision_camera_020", "SG_Alpha_001", False), - ("eg_SubArea_collision_camera_010", "LE_Item_001", True), - ("eg_SubArea_collision_camera_012", "LE_Item_001", False), - ] - ) + +@pytest.mark.parametrize( + ("cc_name", "actor_name", "should_be_present"), + [ + ("eg_SubArea_collision_camera_008", "LE_PowerUP_ChargeBeam", True), + ("eg_SubArea_collision_camera_012", "LE_PowerUP_ChargeBeam", False), + ("eg_SubArea_collision_camera_010", "SG_Alpha_001", True), + ("eg_SubArea_collision_camera_020", "SG_Alpha_001", False), + ("eg_SubArea_collision_camera_010", "LE_Item_001", True), + ("eg_SubArea_collision_camera_012", "LE_Item_001", False), + ], +) def test_is_actor_in_group(surface_bmsld: Bmsld, cc_name, actor_name, should_be_present): in_group = surface_bmsld.is_actor_in_group(cc_name, actor_name) assert in_group is should_be_present @@ -54,18 +59,21 @@ def test_get_actor_group(surface_bmsld: Bmsld): with pytest.raises(KeyError): surface_bmsld.get_actor_group("blabla") + def test_all_actors(surface_bmsld: Bmsld): all_actors = list(surface_bmsld.all_actors()) assert len(all_actors) == 232 + def test_all_actor_group_names_for_actor(surface_bmsld: Bmsld): groups = surface_bmsld.all_actor_group_names_for_actor("LE_EnergyRecharge") assert groups == [ - 'eg_SubArea_collision_camera_010', - 'eg_SubArea_collision_camera_023', - 'eg_SubArea_PostAlpha_001', + "eg_SubArea_collision_camera_010", + "eg_SubArea_collision_camera_023", + "eg_SubArea_PostAlpha_001", ] + def test_add_actor_to_entity_groups(surface_bmsld: Bmsld): groups = surface_bmsld.all_actor_group_names_for_actor("LE_AmmoRecharge") assert len(groups) == 2 @@ -78,6 +86,7 @@ def test_add_actor_to_entity_groups(surface_bmsld: Bmsld): groups = surface_bmsld.all_actor_group_names_for_actor("LE_AmmoRecharge") assert len(groups) == 5 + def test_remove_actor_from_all_groups(surface_bmsld: Bmsld): groups = surface_bmsld.all_actor_group_names_for_actor("Moheek_026") assert len(groups) == 4 diff --git a/tests/formats/test_bmsnav.py b/tests/formats/test_bmsnav.py index 2039b7ae..194766df 100644 --- a/tests/formats/test_bmsnav.py +++ b/tests/formats/test_bmsnav.py @@ -20,10 +20,12 @@ "maps/levels/c10_samus/s920_traininggallery/s920_traininggallery.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", 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 728456d3..448d71b2 100644 --- a/tests/formats/test_bmssd.py +++ b/tests/formats/test_bmssd.py @@ -20,10 +20,12 @@ "maps/levels/c10_samus/s920_traininggallery/s920_traininggallery.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) + @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_bpsi.py b/tests/formats/test_bpsi.py index 5d7e6d62..462620e6 100644 --- a/tests/formats/test_bpsi.py +++ b/tests/formats/test_bpsi.py @@ -9,6 +9,7 @@ def test_bpsi_dread(dread_file_tree, bpsi_path): parse_build_compare_editor(Bpsi, dread_file_tree, bpsi_path) + @pytest.mark.parametrize("bpsi_path", samus_returns_data.all_files_ending_with(".bpsi")) def test_bpsi_sr(dread_file_tree, bpsi_path): parse_build_compare_editor(Bpsi, dread_file_tree, bpsi_path) diff --git a/tests/formats/test_bptdat.py b/tests/formats/test_bptdat.py index cb428ab4..c4c6e791 100644 --- a/tests/formats/test_bptdat.py +++ b/tests/formats/test_bptdat.py @@ -9,6 +9,7 @@ def test_bptdat(dread_file_tree, bptdat_path): parse_build_compare_editor(Bptdat, dread_file_tree, bptdat_path) + @pytest.mark.parametrize("bptdef_path", dread_data.all_files_ending_with(".bptdef")) def test_bptdef(dread_file_tree, bptdef_path): parse_build_compare_editor(Bptdef, dread_file_tree, bptdef_path) diff --git a/tests/formats/test_bsmat.py b/tests/formats/test_bsmat.py index 7658e594..ccd2bb73 100644 --- a/tests/formats/test_bsmat.py +++ b/tests/formats/test_bsmat.py @@ -12,8 +12,9 @@ def test_compare_dread_all(dread_file_tree, bsmat_path): def test_get_uniform(dread_file_tree): - mat = dread_file_tree.get_parsed_asset("system/engine/surfaces/mp_accesspointabstractcubesorbital.bsmat", - type_hint=Bsmat) + mat = dread_file_tree.get_parsed_asset( + "system/engine/surfaces/mp_accesspointabstractcubesorbital.bsmat", type_hint=Bsmat + ) extra_uniform = mat.get_uniform("vConstant0", in_extra=True) assert extra_uniform.name == "vConstant0" @@ -27,8 +28,9 @@ def test_get_uniform(dread_file_tree): def test_get_sampler(dread_file_tree): - mat = dread_file_tree.get_parsed_asset("system/engine/surfaces/mp_accesspointabstractcubesorbital.bsmat", - type_hint=Bsmat) + mat = dread_file_tree.get_parsed_asset( + "system/engine/surfaces/mp_accesspointabstractcubesorbital.bsmat", type_hint=Bsmat + ) extra_sampler = mat.get_sampler("texVoice", in_extra=True) assert extra_sampler.name == "texVoice" diff --git a/tests/formats/test_btunda.py b/tests/formats/test_btunda.py index a65a4f8a..7bbcc51b 100644 --- a/tests/formats/test_btunda.py +++ b/tests/formats/test_btunda.py @@ -4,14 +4,18 @@ from mercury_engine_data_structures.formats.btunda import Btunda BTUNDA_PATH = "system/tunables/tunables.btunda" + + def test_btunda(dread_file_tree): parse_build_compare_editor(Btunda, dread_file_tree, BTUNDA_PATH) + def test_btunda_get_tunable(dread_file_tree): btunda = dread_file_tree.get_parsed_asset(BTUNDA_PATH, type_hint=Btunda) assert btunda.get_tunable(["ShotManager|CTunableShotManager", "rPlasmaBeamDiffusionExplosion", "uAmount"]) == 3 + def test_btunda_set_tunable(dread_file_tree): btunda = dread_file_tree.get_parsed_asset(BTUNDA_PATH, type_hint=Btunda) @@ -20,6 +24,7 @@ def test_btunda_set_tunable(dread_file_tree): btunda.set_tunable(tunable_path, False) assert btunda.get_tunable(tunable_path) is False + def test_btunda_invalid_tunable(dread_file_tree): btunda = dread_file_tree.get_parsed_asset(BTUNDA_PATH, type_hint=Btunda) diff --git a/tests/formats/test_buct.py b/tests/formats/test_buct.py index 9088f244..879a27ac 100644 --- a/tests/formats/test_buct.py +++ b/tests/formats/test_buct.py @@ -9,6 +9,7 @@ def test_buct_dread(dread_file_tree, buct_path): parse_build_compare_editor(Buct, dread_file_tree, buct_path) + @pytest.mark.parametrize("buct_path", samus_returns_data.all_files_ending_with(".buct")) def test_buct_sr(samus_returns_tree, buct_path): parse_build_compare_editor(Buct, samus_returns_tree, buct_path) diff --git a/tests/formats/test_collision.py b/tests/formats/test_collision.py index 25d9b483..9f89c728 100644 --- a/tests/formats/test_collision.py +++ b/tests/formats/test_collision.py @@ -1,4 +1,3 @@ - import pytest from tests.test_lib import parse_build_compare_editor_parsed @@ -18,7 +17,7 @@ "maps/levels/c10_samus/s909_ridley/s909_ridley.bmscc", "maps/levels/c10_samus/s910_gym/s910_gym.bmscc", "maps/levels/c10_samus/s911_swarmgym/s911_swarmgym.bmscc", - "maps/levels/c10_samus/s920_traininggallery/s920_traininggallery.bmscc" + "maps/levels/c10_samus/s920_traininggallery/s920_traininggallery.bmscc", ] sr_missing_cd = [ @@ -39,15 +38,21 @@ "maps/levels/c10_samus/s909_ridley/s909_ridley.bmscd", "maps/levels/c10_samus/s910_gym/s910_gym.bmscd", "maps/levels/c10_samus/s911_swarmgym/s911_swarmgym.bmscd", - "maps/levels/c10_samus/s920_traininggallery/s920_traininggallery.bmscd" + "maps/levels/c10_samus/s920_traininggallery/s920_traininggallery.bmscd", ] -@pytest.mark.parametrize("file_path", dread_data.all_files_ending_with(".bmscc") - + dread_data.all_files_ending_with(".bmscd")) + +@pytest.mark.parametrize( + "file_path", dread_data.all_files_ending_with(".bmscc") + dread_data.all_files_ending_with(".bmscd") +) def test_compare_dread(dread_file_tree, file_path): parse_build_compare_editor_parsed(Bmscc, dread_file_tree, file_path) -@pytest.mark.parametrize("file_path", samus_returns_data.all_files_ending_with(".bmscc", sr_missing_cc) - + samus_returns_data.all_files_ending_with(".bmscd", sr_missing_cd)) + +@pytest.mark.parametrize( + "file_path", + samus_returns_data.all_files_ending_with(".bmscc", sr_missing_cc) + + samus_returns_data.all_files_ending_with(".bmscd", sr_missing_cd), +) def test_compare_msr(samus_returns_tree, file_path): parse_build_compare_editor_parsed(Bmscc, samus_returns_tree, file_path) diff --git a/tests/formats/test_gui.py b/tests/formats/test_gui.py index 2d679e0c..49405980 100644 --- a/tests/formats/test_gui.py +++ b/tests/formats/test_gui.py @@ -9,14 +9,17 @@ def test_compare_bmscp_dread(dread_file_tree, bmscp_path): parse_build_compare_editor_parsed(Bmscp, dread_file_tree, bmscp_path) + @pytest.mark.parametrize("bmssh_path", dread_data.all_files_ending_with(".bmssh")) def test_compare_bmssh_dread(dread_file_tree, bmssh_path): parse_build_compare_editor(Bmssh, dread_file_tree, bmssh_path) + @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) + @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_lua.py b/tests/formats/test_lua.py index c2525504..5dff1a0d 100644 --- a/tests/formats/test_lua.py +++ b/tests/formats/test_lua.py @@ -4,51 +4,51 @@ from mercury_engine_data_structures.game_check import Game _SR_COMPILED_LUA = ( - b'\x1bLuaQ\x00\x01\x04\x04\x04\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x03\x11\x00\x00\x00' - b'\x05\x00\x00\x00\x06@@\x00A\x80\x00\x00\x82\x00\x00\x00\x1c@\x80\x01\x05\xc0\x00\x00\x1a@\x00\x00\x16\x00\x00\x80' - b'\n\x00\x00\x00\x07\xc0\x00\x00\x05\xc0\x00\x00d\x00\x00\x00\t@\x00\x82\x05\xc0\x00\x00d@\x00\x00\t@\x80\x82' - b'\x1e\x00\x80\x00\x06\x00\x00\x00\x04\x05\x00\x00\x00Game\x00\x04\x0e\x00\x00\x00ImportLib' - b'rary\x00\x04<\x00\x00\x00actors/items/randomize' - b'rpowerup/scripts/randomizerpower' - b'up.lc\x00\x04\x18\x00\x00\x00RandomizerBabyHatchli' - b'ng\x00\x04\x05\x00\x00\x00main\x00\x04\x0b\x00\x00\x00OnPickedUp\x00\x02\x00\x00' - b'\x00\x00\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x02\x01\x00\x00\x00\x1e\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00' - b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\n\x00\x00\x00\x00\x01\x00\x04\x16\x00\x00' - b'\x00E\x00\x00\x00F@\xc0\x00\x80\x00\x00\x00\\@\x00\x01E\x80\x00\x00F\xc0\xc0\x00\x81\x00\x01\x00\\\x80\x00' - b'\x01F@\xc1\x00K\x80\xc1\x00\\@\x00\x01E\x80\x00\x00F\xc0\xc1\x00\x81\x00\x02\x00\\\x80\x00\x01\x85\x80\x00' - b'\x00\x86\xc0@\x01\xc1\x00\x01\x00\x9c\x80\x00\x01\x86@B\x01I\x80\x80\x84\x1e\x00\x80\x00\n\x00\x00\x00\x04\x12\x00' - b'\x00\x00RandomizerPowerup\x00\x04\x0b\x00\x00\x00OnPicke' - b'dUp\x00\x04\x05\x00\x00\x00Game\x00\x04\x11\x00\x00\x00GetDefaultPla' - b'yer\x00\x04\x06\x00\x00\x00Samus\x00\x04\x16\x00\x00\x00BABYHATCHLIN' - b'GCREATION\x00\x04\n\x00\x00\x00SpawnBaby\x00\x04\n\x00\x00\x00Ge' - b'tEntity\x00\x04\x0f\x00\x00\x00Baby Hatchling\x00\x04\x05\x00\x00' - b'\x00vPos\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' - b'\x00\x00' + b"\x1bLuaQ\x00\x01\x04\x04\x04\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x03\x11\x00\x00\x00" + b"\x05\x00\x00\x00\x06@@\x00A\x80\x00\x00\x82\x00\x00\x00\x1c@\x80\x01\x05\xc0\x00\x00\x1a@\x00\x00\x16\x00\x00\x80" + b"\n\x00\x00\x00\x07\xc0\x00\x00\x05\xc0\x00\x00d\x00\x00\x00\t@\x00\x82\x05\xc0\x00\x00d@\x00\x00\t@\x80\x82" + b"\x1e\x00\x80\x00\x06\x00\x00\x00\x04\x05\x00\x00\x00Game\x00\x04\x0e\x00\x00\x00ImportLib" + b"rary\x00\x04<\x00\x00\x00actors/items/randomize" + b"rpowerup/scripts/randomizerpower" + b"up.lc\x00\x04\x18\x00\x00\x00RandomizerBabyHatchli" + b"ng\x00\x04\x05\x00\x00\x00main\x00\x04\x0b\x00\x00\x00OnPickedUp\x00\x02\x00\x00" + b"\x00\x00\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x02\x01\x00\x00\x00\x1e\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00" + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\n\x00\x00\x00\x00\x01\x00\x04\x16\x00\x00" + b"\x00E\x00\x00\x00F@\xc0\x00\x80\x00\x00\x00\\@\x00\x01E\x80\x00\x00F\xc0\xc0\x00\x81\x00\x01\x00\\\x80\x00" + b"\x01F@\xc1\x00K\x80\xc1\x00\\@\x00\x01E\x80\x00\x00F\xc0\xc1\x00\x81\x00\x02\x00\\\x80\x00\x01\x85\x80\x00" + b"\x00\x86\xc0@\x01\xc1\x00\x01\x00\x9c\x80\x00\x01\x86@B\x01I\x80\x80\x84\x1e\x00\x80\x00\n\x00\x00\x00\x04\x12\x00" + b"\x00\x00RandomizerPowerup\x00\x04\x0b\x00\x00\x00OnPicke" + b"dUp\x00\x04\x05\x00\x00\x00Game\x00\x04\x11\x00\x00\x00GetDefaultPla" + b"yer\x00\x04\x06\x00\x00\x00Samus\x00\x04\x16\x00\x00\x00BABYHATCHLIN" + b"GCREATION\x00\x04\n\x00\x00\x00SpawnBaby\x00\x04\n\x00\x00\x00Ge" + b"tEntity\x00\x04\x0f\x00\x00\x00Baby Hatchling\x00\x04\x05\x00\x00" + b"\x00vPos\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + b"\x00\x00" ) _DREAD_COMPILED_LUA = ( - b'\x1bLuaQ\x00\x01\x04\x08\x04\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x03' - b'\x11\x00\x00\x00\x05\x00\x00\x00\x06@@\x00A\x80\x00\x00\x82\x00\x00\x00\x1c@\x80\x01\x05\xc0\x00\x00\x1a@\x00\x00' - b'\x16\x00\x00\x80\n\x00\x00\x00\x07\xc0\x00\x00\x05\xc0\x00\x00d\x00\x00\x00\t@\x00\x82\x05\xc0\x00\x00d@\x00\x00' - b'\t@\x80\x82\x1e\x00\x80\x00\x06\x00\x00\x00\x04\x05\x00\x00\x00\x00\x00\x00\x00Game\x00\x04\x0e\x00\x00\x00\x00' - b'\x00\x00\x00ImportLibrary\x00\x04<\x00\x00\x00\x00\x00\x00\x00actors' - b'/items/randomizerpowerup/scripts' - b'/randomizerpowerup.lc\x00\x04\x18\x00\x00\x00\x00\x00\x00\x00R' - b'andomizerBabyHatchling\x00\x04\x05\x00\x00\x00\x00\x00\x00\x00' - b'main\x00\x04\x0b\x00\x00\x00\x00\x00\x00\x00OnPickedUp\x00\x02\x00\x00\x00\x00\x00\x00' - b'\x00\x00\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x02\x01\x00\x00\x00\x1e\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00' - b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\n\x00\x00\x00\x00\x01\x00' - b'\x04\x16\x00\x00\x00E\x00\x00\x00F@\xc0\x00\x80\x00\x00\x00\\@\x00\x01E\x80\x00\x00F\xc0\xc0\x00\x81\x00\x01' - b'\x00\\\x80\x00\x01F@\xc1\x00K\x80\xc1\x00\\@\x00\x01E\x80\x00\x00F\xc0\xc1\x00\x81\x00\x02\x00\\\x80\x00' - b'\x01\x85\x80\x00\x00\x86\xc0@\x01\xc1\x00\x01\x00\x9c\x80\x00\x01\x86@B\x01I\x80\x80\x84\x1e\x00\x80\x00\n\x00\x00' - b'\x00\x04\x12\x00\x00\x00\x00\x00\x00\x00RandomizerPowerup\x00\x04\x0b\x00\x00' - b'\x00\x00\x00\x00\x00OnPickedUp\x00\x04\x05\x00\x00\x00\x00\x00\x00\x00Game\x00\x04\x11' - b'\x00\x00\x00\x00\x00\x00\x00GetDefaultPlayer\x00\x04\x06\x00\x00\x00\x00\x00\x00' - b'\x00Samus\x00\x04\x16\x00\x00\x00\x00\x00\x00\x00BABYHATCHLINGCRE' - b'ATION\x00\x04\n\x00\x00\x00\x00\x00\x00\x00SpawnBaby\x00\x04\n\x00\x00\x00\x00\x00' - b'\x00\x00GetEntity\x00\x04\x0f\x00\x00\x00\x00\x00\x00\x00Baby Hatchl' - b'ing\x00\x04\x05\x00\x00\x00\x00\x00\x00\x00vPos\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' - b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b"\x1bLuaQ\x00\x01\x04\x08\x04\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x03" + b"\x11\x00\x00\x00\x05\x00\x00\x00\x06@@\x00A\x80\x00\x00\x82\x00\x00\x00\x1c@\x80\x01\x05\xc0\x00\x00\x1a@\x00\x00" + b"\x16\x00\x00\x80\n\x00\x00\x00\x07\xc0\x00\x00\x05\xc0\x00\x00d\x00\x00\x00\t@\x00\x82\x05\xc0\x00\x00d@\x00\x00" + b"\t@\x80\x82\x1e\x00\x80\x00\x06\x00\x00\x00\x04\x05\x00\x00\x00\x00\x00\x00\x00Game\x00\x04\x0e\x00\x00\x00\x00" + b"\x00\x00\x00ImportLibrary\x00\x04<\x00\x00\x00\x00\x00\x00\x00actors" + b"/items/randomizerpowerup/scripts" + b"/randomizerpowerup.lc\x00\x04\x18\x00\x00\x00\x00\x00\x00\x00R" + b"andomizerBabyHatchling\x00\x04\x05\x00\x00\x00\x00\x00\x00\x00" + b"main\x00\x04\x0b\x00\x00\x00\x00\x00\x00\x00OnPickedUp\x00\x02\x00\x00\x00\x00\x00\x00" + b"\x00\x00\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x02\x01\x00\x00\x00\x1e\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00" + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\n\x00\x00\x00\x00\x01\x00" + b"\x04\x16\x00\x00\x00E\x00\x00\x00F@\xc0\x00\x80\x00\x00\x00\\@\x00\x01E\x80\x00\x00F\xc0\xc0\x00\x81\x00\x01" + b"\x00\\\x80\x00\x01F@\xc1\x00K\x80\xc1\x00\\@\x00\x01E\x80\x00\x00F\xc0\xc1\x00\x81\x00\x02\x00\\\x80\x00" + b"\x01\x85\x80\x00\x00\x86\xc0@\x01\xc1\x00\x01\x00\x9c\x80\x00\x01\x86@B\x01I\x80\x80\x84\x1e\x00\x80\x00\n\x00\x00" + b"\x00\x04\x12\x00\x00\x00\x00\x00\x00\x00RandomizerPowerup\x00\x04\x0b\x00\x00" + b"\x00\x00\x00\x00\x00OnPickedUp\x00\x04\x05\x00\x00\x00\x00\x00\x00\x00Game\x00\x04\x11" + b"\x00\x00\x00\x00\x00\x00\x00GetDefaultPlayer\x00\x04\x06\x00\x00\x00\x00\x00\x00" + b"\x00Samus\x00\x04\x16\x00\x00\x00\x00\x00\x00\x00BABYHATCHLINGCRE" + b"ATION\x00\x04\n\x00\x00\x00\x00\x00\x00\x00SpawnBaby\x00\x04\n\x00\x00\x00\x00\x00" + b"\x00\x00GetEntity\x00\x04\x0f\x00\x00\x00\x00\x00\x00\x00Baby Hatchl" + b"ing\x00\x04\x05\x00\x00\x00\x00\x00\x00\x00vPos\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" ) @@ -69,6 +69,7 @@ def test_build_lua_sr(): lua_sr = Lua(Container(lua_text=lua_str), Game.SAMUS_RETURNS) assert lua_sr.build() == _SR_COMPILED_LUA + def test_build_lua_dread(): lua_dread = Lua(Container(lua_text=lua_str), Game.DREAD) assert lua_dread.build() == _DREAD_COMPILED_LUA diff --git a/tests/formats/test_pkg.py b/tests/formats/test_pkg.py index 6bcb0499..98d6263e 100644 --- a/tests/formats/test_pkg.py +++ b/tests/formats/test_pkg.py @@ -6,7 +6,7 @@ from mercury_engine_data_structures.formats.pkg import Pkg from mercury_engine_data_structures.game_check import Game -_EMPTY_DREAD_PKG = (b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') +_EMPTY_DREAD_PKG = b"\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" wrong_build_sr = [ # MSCU, no padding in vanilla @@ -100,11 +100,11 @@ "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) - ) + parse_and_build_compare(Pkg.construct_class(Game.DREAD), Game.DREAD, dread_path.joinpath(pkg_path)) + @pytest.mark.parametrize("pkg_path", samus_returns_data.all_files_ending_with(".pkg", sr_missing)) def test_compare_sr(samus_returns_path, pkg_path): @@ -129,6 +129,7 @@ def test_compare_sr(samus_returns_path, pkg_path): Pkg.construct_class(Game.SAMUS_RETURNS), Game.SAMUS_RETURNS, samus_returns_path.joinpath(pkg_path) ) + def test_build_empty_pkg(): pkg = Pkg(Container(files=ListContainer()), Game.DREAD) @@ -136,15 +137,17 @@ def test_build_empty_pkg(): def test_remove_pkg_element(): - single_element_pkg = (b'|\x00\x00\x00\x08\x00\x00\x00\x01\x00\x00\x00\xd2\x04\x00\x00' - b'\x00\x00\x00\x00\x80\x00\x00\x00\x86\x00\x00\x00\x00\x00\x00\x00' - b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' - b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' - b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' - b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' - b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' - b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' - b'FOOBAR\x00\x00') + single_element_pkg = ( + b"|\x00\x00\x00\x08\x00\x00\x00\x01\x00\x00\x00\xd2\x04\x00\x00" + b"\x00\x00\x00\x00\x80\x00\x00\x00\x86\x00\x00\x00\x00\x00\x00\x00" + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + b"FOOBAR\x00\x00" + ) pkg = Pkg.parse(single_element_pkg, Game.DREAD) assert pkg.build() == single_element_pkg diff --git a/tests/formats/test_txt.py b/tests/formats/test_txt.py index 23fa3d9d..0374c841 100644 --- a/tests/formats/test_txt.py +++ b/tests/formats/test_txt.py @@ -9,6 +9,7 @@ def test_compare_dread(dread_file_tree, txt_path): parse_build_compare_editor(Txt, dread_file_tree, txt_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_common_types.py b/tests/test_common_types.py index 2077995c..6951b6b4 100644 --- a/tests/test_common_types.py +++ b/tests/test_common_types.py @@ -3,7 +3,7 @@ def test_make_dict_parse(): - data = b'\x02\x00\x00\x00foo\x00\x00\x00@?banana\x00\x00 \xa7D' + data = b"\x02\x00\x00\x00foo\x00\x00\x00@?banana\x00\x00 \xa7D" con = common_types.make_dict(Float) # Run @@ -26,4 +26,3 @@ def test_make_vector(): # Assert assert data == decoded - diff --git a/tests/test_lib.py b/tests/test_lib.py index 5b25aa17..90a6757d 100644 --- a/tests/test_lib.py +++ b/tests/test_lib.py @@ -25,8 +25,8 @@ def parse_and_build_compare(module, game: Game, file_path: Path, print_data=Fals assert encoded == raw -def _parse_build_compare(module: typing.Type[BaseResource], - editor: FileTreeEditor, file_name: str, print_data=False): + +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) @@ -37,14 +37,18 @@ def _parse_build_compare(module: typing.Type[BaseResource], return raw, encoded, data -def parse_build_compare_editor(module: typing.Type[BaseResource], - editor: FileTreeEditor, file_name: str, print_data=False): + +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) assert encoded == raw -def parse_build_compare_editor_parsed(module: typing.Type[BaseResource], - editor: FileTreeEditor, file_name: str, print_data=False): + +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) construct_class = module.construct_class(editor.target_game) diff --git a/tests/test_object.py b/tests/test_object.py index 6493d66b..6c538d8b 100644 --- a/tests/test_object.py +++ b/tests/test_object.py @@ -5,30 +5,39 @@ from mercury_engine_data_structures.object import Object from tests.test_lib import game_compile_build, game_compile_parse -TestClass = Object({ - "fTimeToChargeDoubleGroundShock": common_types.Float, - "uNumShocks": common_types.UInt, - "fTimeBetweenShockwaves": common_types.Float, - "fTimeToEndShockwaves": common_types.Float, -}) - - -@pytest.fixture(name="sample_object", params=[ - ( +TestClass = Object( + { + "fTimeToChargeDoubleGroundShock": common_types.Float, + "uNumShocks": common_types.UInt, + "fTimeBetweenShockwaves": common_types.Float, + "fTimeToEndShockwaves": common_types.Float, + } +) + + +@pytest.fixture( + name="sample_object", + params=[ + ( {"fTimeToChargeDoubleGroundShock": 1.5, "uNumShocks": 15, "fTimeToEndShockwaves": 20.0}, - (b'\x03\x00\x00\x00w3t}\x9f{\xc4\x83\x00\x00\xc0?e|x\x01\xed|\x08D' - b'\x0f\x00\x00\x00\x15\x849o@\xdb\x8a\xf3\x00\x00\xa0A') - ), - ( + ( + b"\x03\x00\x00\x00w3t}\x9f{\xc4\x83\x00\x00\xc0?e|x\x01\xed|\x08D" + b"\x0f\x00\x00\x00\x15\x849o@\xdb\x8a\xf3\x00\x00\xa0A" + ), + ), + ( [ {"type": "fTimeToChargeDoubleGroundShock", "item": 1.5}, {"type": "fTimeToChargeDoubleGroundShock", "item": 5.5}, {"type": "uNumShocks", "item": 15}, ], - (b'\x03\x00\x00\x00w3t}\x9f{\xc4\x83\x00\x00\xc0?w3t}\x9f{\xc4\x83\x00\x00\xb0@' - b'e|x\x01\xed|\x08D\x0f\x00\x00\x00') - ), -]) + ( + b"\x03\x00\x00\x00w3t}\x9f{\xc4\x83\x00\x00\xc0?w3t}\x9f{\xc4\x83\x00\x00\xb0@" + b"e|x\x01\xed|\x08D\x0f\x00\x00\x00" + ), + ), + ], +) def _sample_object(request): return request.param diff --git a/tests/test_pointer_set.py b/tests/test_pointer_set.py index 98993ee2..97fd6557 100644 --- a/tests/test_pointer_set.py +++ b/tests/test_pointer_set.py @@ -6,17 +6,21 @@ from mercury_engine_data_structures.pointer_set import PointerSet from tests.test_lib import game_compile_build, game_compile_parse -CEnemyPreset = Object({ - "sId": common_types.StrId, - "fLife": common_types.Float, - "sLifeTunable": common_types.StrId, - "sLifeTunableVar": common_types.StrId, -}) - -CCentralUnitComponent_SStartPointInfo = Object({ - "wpStartPoint": common_types.StrId, - "wpEmmyLandmark": common_types.StrId, -}) +CEnemyPreset = Object( + { + "sId": common_types.StrId, + "fLife": common_types.Float, + "sLifeTunable": common_types.StrId, + "sLifeTunableVar": common_types.StrId, + } +) + +CCentralUnitComponent_SStartPointInfo = Object( + { + "wpStartPoint": common_types.StrId, + "wpEmmyLandmark": common_types.StrId, + } +) SingleType = PointerSet("SingleType") SingleType.add_option("CEnemyPreset", CEnemyPreset) @@ -28,36 +32,40 @@ TwoTypeConstruct = TwoType.create_construct() -@pytest.fixture(name="single_type_sample", params=[ - ( - None, - b'\xd3\x1a\x0f\xac e\x88\xce' - ), - ( +@pytest.fixture( + name="single_type_sample", + params=[ + (None, b"\xd3\x1a\x0f\xac e\x88\xce"), + ( {"fLife": 1234.0, "sId": "foo"}, - (b'\x90T\xcc\xd8\x92\r\xceV\x02\x00\x00\x00\xe1\x10\x8bI\xc4%\xdf{\x00@\x9aD' - b'\x9f\x05lwS\x87\xd4\xe9foo\x00'), - ) -]) + ( + b"\x90T\xcc\xd8\x92\r\xceV\x02\x00\x00\x00\xe1\x10\x8bI\xc4%\xdf{\x00@\x9aD" + b"\x9f\x05lwS\x87\xd4\xe9foo\x00" + ), + ), + ], +) def _single_type_sample(request): return request.param -@pytest.fixture(name="two_type_sample", params=[ - ( - None, - b'\xd3\x1a\x0f\xac e\x88\xce' - ), - ( +@pytest.fixture( + name="two_type_sample", + params=[ + (None, b"\xd3\x1a\x0f\xac e\x88\xce"), + ( {"@type": "CEnemyPreset", "fLife": 1234.0, "sId": "foo"}, - (b'\x90T\xcc\xd8\x92\r\xceV\x02\x00\x00\x00\xe1\x10\x8bI\xc4%\xdf{\x00@\x9aD' - b'\x9f\x05lwS\x87\xd4\xe9foo\x00') - ), - ( + ( + b"\x90T\xcc\xd8\x92\r\xceV\x02\x00\x00\x00\xe1\x10\x8bI\xc4%\xdf{\x00@\x9aD" + b"\x9f\x05lwS\x87\xd4\xe9foo\x00" + ), + ), + ( {"@type": "CCentralUnitComponent::SStartPointInfo", "wpStartPoint": "foo"}, - b'\xb1M\xeb\xac\xc4_u\x0c\x01\x00\x00\x00\x16t\x82\x93\xf2\x11BQfoo\x00' - ), -]) + b"\xb1M\xeb\xac\xc4_u\x0c\x01\x00\x00\x00\x16t\x82\x93\xf2\x11BQfoo\x00", + ), + ], +) def _two_type_sample(request): return request.param diff --git a/tests/test_type_lib.py b/tests/test_type_lib.py index 074c76b8..af029d70 100644 --- a/tests/test_type_lib.py +++ b/tests/test_type_lib.py @@ -18,179 +18,208 @@ def _dread_type_lib(): return get_type_lib_for_game(Game.DREAD) -@pytest.mark.parametrize(("type_name", "value", "expected"), ( - # primitive - ("base::global::CStrId", "", None), - ("bool", True, None), - ("int", -1, None), - ("unsigned_short", 2**16 - 1, None), - ("unsigned_int", 2**32 - 1, None), - ("unsigned_long", 2**64 - 1, None), - ("float", 0.0, None), - ("base::math::CVector2D", [0.0, 0.0], None), - ("base::math::CVector3D", [0.0, 0.0, 0.0], None), - ("base::math::CVector4D", [0.0, 0.0, 0.0, 0.0], None), - ("base::global::CRntFile", b"\x24\x03", None), - ("base::global::CName", "", None), - ("base::global::CName", 2**64 - 1, None), - - ("base::global::CStrId", None, TypeError('Expected str; got NoneType')), - ("bool", None, TypeError('Expected bool; got NoneType')), - ("int", None, TypeError("Expected int; got NoneType")), - ("unsigned_short", None, TypeError("Expected int; got NoneType")), - ("unsigned_int", None, TypeError("Expected int; got NoneType")), - ("unsigned_long", None, TypeError("Expected int; got NoneType")), - ("float", None, TypeError("Expected float; got NoneType")), - ("base::math::CVector2D", None, TypeError("Expected typing.Sequence; got NoneType")), - ("base::math::CVector3D", None, TypeError("Expected typing.Sequence; got NoneType")), - ("base::math::CVector4D", None, TypeError("Expected typing.Sequence; got NoneType")), - ("base::global::CRntFile", None, TypeError('Expected bytes; got NoneType')), - ("base::global::CName", None, TypeError('Expected str | int; got NoneType')), - ("base::global::CName", None, TypeError('Expected str | int; got NoneType')), - - ("int", -2**33, ValueError('-8589934592 is out of range of [-0x80000000, 0x7fffffff]')), - ("int", 2**33, ValueError('8589934592 is out of range of [-0x80000000, 0x7fffffff]')), - ("unsigned_short", 2**16, ValueError('65536 is out of range of [0x0, 0xffff]')), - ("unsigned_int", 2**32, ValueError('4294967296 is out of range of [0x0, 0xffffffff]')), - ("unsigned_long", 2**64, ValueError('18446744073709551616 is out of range of [0x0, 0xffffffffffffffff]')), - ("base::global::CName", -1, ValueError('-1 is out of range of [0x0, 0xffffffffffffffff]')), - - ("base::math::CVector2D", ["foo", "bar"], ValueError("Invalid CVector2D: ['foo', 'bar']")), - ("base::math::CVector2D", [0.0], ValueError('Invalid CVector2D: [0.0]')), - ("base::math::CVector3D", [0.0], ValueError('Invalid CVector3D: [0.0]')), - ("base::math::CVector4D", [0.0], ValueError('Invalid CVector4D: [0.0]')), - - # struct - ("base::reflection::CType", { - "sName": "base::reflection::CFlagsetType", - "sBaseTypeName": "base::reflection::CType", - }, None), - - ("base::reflection::CType", None, TypeError('Expected base::reflection::CType; got NoneType')), - ("base::reflection::CType", { - "sName": True, - "sBaaaseTypeName": "base::reflection::CType", - }, TypeError( - TypeError('Expected str; got bool'), - AttributeError("Invalid attribute 'sBaaaseTypeName' for base::reflection::CType") - )), - - # enum - ("ETeleporterColorSphere", dread_types.ETeleporterColorSphere.PINK, None), - ("ETeleporterColorSphere", 4, None), - ("ETeleporterColorSphere", "PINK", None), - - ( - "ETeleporterColorSphere", - dread_types.ECoolShinesparkSituation.Default, - TypeError('Expected ETeleporterColorSphere; got ECoolShinesparkSituation') - ), - ("ETeleporterColorSphere", 40, ValueError('40 is not a valid ETeleporterColorSphere')), - ("ETeleporterColorSphere", "PIIINK", TypeError('Expected ETeleporterColorSphere; got str')), - - # flagset - ("TCoolShinesparkSituation", dread_types.ECoolShinesparkSituation.Default, None), - ("TCoolShinesparkSituation", "Default|CooldownX", None), - ("TCoolShinesparkSituation", 0b11, None), - - ( - "TCoolShinesparkSituation", - dread_types.ETeleporterColorSphere.PINK, - TypeError('Expected TCoolShinesparkSituation; got ETeleporterColorSphere') - ), +@pytest.mark.parametrize( + ("type_name", "value", "expected"), ( - "TCoolShinesparkSituation", - "Default|CooldownY", - TypeError("Contains invalid ECoolShinesparkSituation names: ['CooldownY']") + # primitive + ("base::global::CStrId", "", None), + ("bool", True, None), + ("int", -1, None), + ("unsigned_short", 2**16 - 1, None), + ("unsigned_int", 2**32 - 1, None), + ("unsigned_long", 2**64 - 1, None), + ("float", 0.0, None), + ("base::math::CVector2D", [0.0, 0.0], None), + ("base::math::CVector3D", [0.0, 0.0, 0.0], None), + ("base::math::CVector4D", [0.0, 0.0, 0.0, 0.0], None), + ("base::global::CRntFile", b"\x24\x03", None), + ("base::global::CName", "", None), + ("base::global::CName", 2**64 - 1, None), + ("base::global::CStrId", None, TypeError("Expected str; got NoneType")), + ("bool", None, TypeError("Expected bool; got NoneType")), + ("int", None, TypeError("Expected int; got NoneType")), + ("unsigned_short", None, TypeError("Expected int; got NoneType")), + ("unsigned_int", None, TypeError("Expected int; got NoneType")), + ("unsigned_long", None, TypeError("Expected int; got NoneType")), + ("float", None, TypeError("Expected float; got NoneType")), + ("base::math::CVector2D", None, TypeError("Expected typing.Sequence; got NoneType")), + ("base::math::CVector3D", None, TypeError("Expected typing.Sequence; got NoneType")), + ("base::math::CVector4D", None, TypeError("Expected typing.Sequence; got NoneType")), + ("base::global::CRntFile", None, TypeError("Expected bytes; got NoneType")), + ("base::global::CName", None, TypeError("Expected str | int; got NoneType")), + ("base::global::CName", None, TypeError("Expected str | int; got NoneType")), + ("int", -(2**33), ValueError("-8589934592 is out of range of [-0x80000000, 0x7fffffff]")), + ("int", 2**33, ValueError("8589934592 is out of range of [-0x80000000, 0x7fffffff]")), + ("unsigned_short", 2**16, ValueError("65536 is out of range of [0x0, 0xffff]")), + ("unsigned_int", 2**32, ValueError("4294967296 is out of range of [0x0, 0xffffffff]")), + ("unsigned_long", 2**64, ValueError("18446744073709551616 is out of range of [0x0, 0xffffffffffffffff]")), + ("base::global::CName", -1, ValueError("-1 is out of range of [0x0, 0xffffffffffffffff]")), + ("base::math::CVector2D", ["foo", "bar"], ValueError("Invalid CVector2D: ['foo', 'bar']")), + ("base::math::CVector2D", [0.0], ValueError("Invalid CVector2D: [0.0]")), + ("base::math::CVector3D", [0.0], ValueError("Invalid CVector3D: [0.0]")), + ("base::math::CVector4D", [0.0], ValueError("Invalid CVector4D: [0.0]")), + # struct + ( + "base::reflection::CType", + { + "sName": "base::reflection::CFlagsetType", + "sBaseTypeName": "base::reflection::CType", + }, + None, + ), + ("base::reflection::CType", None, TypeError("Expected base::reflection::CType; got NoneType")), + ( + "base::reflection::CType", + { + "sName": True, + "sBaaaseTypeName": "base::reflection::CType", + }, + TypeError( + TypeError("Expected str; got bool"), + AttributeError("Invalid attribute 'sBaaaseTypeName' for base::reflection::CType"), + ), + ), + # enum + ("ETeleporterColorSphere", dread_types.ETeleporterColorSphere.PINK, None), + ("ETeleporterColorSphere", 4, None), + ("ETeleporterColorSphere", "PINK", None), + ( + "ETeleporterColorSphere", + dread_types.ECoolShinesparkSituation.Default, + TypeError("Expected ETeleporterColorSphere; got ECoolShinesparkSituation"), + ), + ("ETeleporterColorSphere", 40, ValueError("40 is not a valid ETeleporterColorSphere")), + ("ETeleporterColorSphere", "PIIINK", TypeError("Expected ETeleporterColorSphere; got str")), + # flagset + ("TCoolShinesparkSituation", dread_types.ECoolShinesparkSituation.Default, None), + ("TCoolShinesparkSituation", "Default|CooldownX", None), + ("TCoolShinesparkSituation", 0b11, None), + ( + "TCoolShinesparkSituation", + dread_types.ETeleporterColorSphere.PINK, + TypeError("Expected TCoolShinesparkSituation; got ETeleporterColorSphere"), + ), + ( + "TCoolShinesparkSituation", + "Default|CooldownY", + TypeError("Contains invalid ECoolShinesparkSituation names: ['CooldownY']"), + ), + ("TCoolShinesparkSituation", 0b111, TypeError("7 is not a valid TCoolShinesparkSituation")), + # typedef + ( + "GUI::CDisplayObjectTrack::SKey", + { + "iFrame": 0, + "Value": True, + }, + None, + ), + ( + "GUI::CDisplayObjectTrack::SKey", + { + "iFrame": 1.2, + "Vaalue": True, + }, + TypeError( + TypeError("Expected int; got float"), + AttributeError("Invalid attribute 'Vaalue' for GUI::CDisplayObjectTrackBool::SKey"), + ), + ), + # pointer + ("CEnvironmentData::SCubeMap*", None, None), + ( + "CEnvironmentData::SCubeMap*", + { + "fInterp": 0.0, + "bEnabled": True, + "sTexturePath": "", + }, + None, + ), + ( + "CEnvironmentData::SCubeMap*", + { + "@type": "CEnvironmentData::SCubeMap", + "@value": { + "fInterp": 0.0, + "bEnabled": True, + "sTexturePath": "", + }, + }, + None, + ), + ("game::logic::collision::CShape*", None, None), + ( + "game::logic::collision::CShape*", + { + "@type": "game::logic::collision::CCircleShape2D", + "@value": { + "vPos": [0.0, 0.0, 0.0], + "bIsSolid": False, + "fRadius": 1.0, + }, + }, + None, + ), + ( + "CEnvironmentData::SCubeMap*", + { + "fIntep": 0.0, + "bEnabled": None, + "sTexturePath": "", + }, + TypeError( + AttributeError("Invalid attribute 'fIntep' for CEnvironmentData::SCubeMap"), + TypeError("Expected bool; got NoneType"), + ), + ), + ( + "CEnvironmentData::SCubeMap*", + { + "@type": "CEnvironmentData:::::SCubeMap", + "@value": { + "fInterp": 0.0, + "bEnabled": True, + "sTexturePath": "", + }, + }, + TypeError("CEnvironmentData:::::SCubeMap is not a valid target for CEnvironmentData::SCubeMap*"), + ), + ( + "game::logic::collision::CShape*", + { + "vPos": [0.0, 0.0, 0.0], + "bIsSolid": False, + "fRadius": 1.0, + }, + TypeError("No type specified for game::logic::collision::CShape*"), + ), + # vector + ("base::global::CRntVector", [], None), + ("base::global::CRntVector", [True, False, True], None), + ("base::global::CRntVector", None, TypeError("NoneType is not iterable")), + ( + "base::global::CRntVector", + ["foo", True, 999], + TypeError((0, TypeError("Expected bool; got str")), (2, TypeError("Expected bool; got int"))), + ), + # dictionary + ("base::global::CRntSmallDictionary", {"foo": 1.0}, None), + ("base::global::CRntSmallDictionary", {}, None), + ( + "base::global::CRntSmallDictionary", + { + 1.0: "foo", + "bar": "baz", + 2.0: 1.0, + }, + TypeError( + ("Keys", {1.0: TypeError("Expected str; got float"), 2.0: TypeError("Expected str; got float")}), + ("Values", {1.0: TypeError("Expected float; got str"), "bar": TypeError("Expected float; got str")}), + ), + ), ), - ("TCoolShinesparkSituation", 0b111, TypeError('7 is not a valid TCoolShinesparkSituation')), - - # typedef - ("GUI::CDisplayObjectTrack::SKey", { - "iFrame": 0, - "Value": True, - }, None), - ("GUI::CDisplayObjectTrack::SKey", { - "iFrame": 1.2, - "Vaalue": True, - }, TypeError( - TypeError('Expected int; got float'), - AttributeError("Invalid attribute 'Vaalue' for GUI::CDisplayObjectTrackBool::SKey") - )), - - # pointer - ("CEnvironmentData::SCubeMap*", None, None), - ("CEnvironmentData::SCubeMap*", { - "fInterp": 0.0, - "bEnabled": True, - "sTexturePath": "", - }, None), - ("CEnvironmentData::SCubeMap*", { - "@type": "CEnvironmentData::SCubeMap", - "@value": { - "fInterp": 0.0, - "bEnabled": True, - "sTexturePath": "", - }, - }, None), - ("game::logic::collision::CShape*", None, None), - ("game::logic::collision::CShape*", { - "@type": "game::logic::collision::CCircleShape2D", - "@value": { - "vPos": [0.0, 0.0, 0.0], - "bIsSolid": False, - "fRadius": 1.0, - } - }, None), - - ("CEnvironmentData::SCubeMap*", { - "fIntep": 0.0, - "bEnabled": None, - "sTexturePath": "", - }, TypeError( - AttributeError("Invalid attribute 'fIntep' for CEnvironmentData::SCubeMap"), - TypeError('Expected bool; got NoneType') - )), - ("CEnvironmentData::SCubeMap*", { - "@type": "CEnvironmentData:::::SCubeMap", - "@value": { - "fInterp": 0.0, - "bEnabled": True, - "sTexturePath": "", - }, - }, TypeError('CEnvironmentData:::::SCubeMap is not a valid target for CEnvironmentData::SCubeMap*')), - ("game::logic::collision::CShape*", { - "vPos": [0.0, 0.0, 0.0], - "bIsSolid": False, - "fRadius": 1.0, - }, TypeError('No type specified for game::logic::collision::CShape*')), - - # vector - ("base::global::CRntVector", [], None), - ("base::global::CRntVector", [True, False, True], None), - - ("base::global::CRntVector", None, TypeError('NoneType is not iterable')), - ("base::global::CRntVector", ["foo", True, 999], TypeError( - (0, TypeError('Expected bool; got str')), - (2, TypeError('Expected bool; got int')) - )), - - # dictionary - ("base::global::CRntSmallDictionary", {"foo": 1.0}, None), - ("base::global::CRntSmallDictionary", {}, None), - - ("base::global::CRntSmallDictionary", { - 1.0: "foo", - "bar": "baz", - 2.0: 1.0, - }, TypeError(('Keys', { - 1.0: TypeError('Expected str; got float'), - 2.0: TypeError('Expected str; got float') - }), ('Values', { - 1.0: TypeError('Expected float; got str'), - 'bar': TypeError('Expected float; got str') - }))), -)) +) def test_find_type_errors(dread_type_lib: TypeLib, type_name, value, expected): type_class = dread_type_lib.get_type(type_name) err = type_class._find_type_errors(value) diff --git a/tools/create_class_definitions.py b/tools/create_class_definitions.py index 90a1ce9a..ea5a9d2b 100644 --- a/tools/create_class_definitions.py +++ b/tools/create_class_definitions.py @@ -15,8 +15,14 @@ def _type_name_to_python_identifier(type_name: str): - return type_name.replace("::", "_").replace(" ", "_").replace("<", "_").replace( - ">", "_").replace(",", "_").replace("*", "Ptr") + return ( + type_name.replace("::", "_") + .replace(" ", "_") + .replace("<", "_") + .replace(">", "_") + .replace(",", "_") + .replace("*", "Ptr") + ) class TypeExporter: @@ -53,7 +59,7 @@ def _export_enum_type(self, type_variable: str, type_name: str): for key, value in data.values.items(): if key == "None": key = "NONE" - enum_definition += f' {key} = {value}\n' + enum_definition += f" {key} = {value}\n" code = f"{enum_definition}\n\nconstruct_{type_variable} = StrictEnum({type_variable})" @@ -91,7 +97,7 @@ def _export_struct_type(self, type_variable: str, type_name: str): # We have children, create a field vars field_var = f"{type_variable}Fields := " - return f'Object({field_var}{fields_def})' + return f"Object({field_var}{fields_def})" def _export_type(self, type_name: str): type_data = self.all_types[type_name] @@ -102,7 +108,7 @@ def _export_type(self, type_name: str): elif isinstance(type_data, self._type_lib.StructType): type_code = self._export_struct_type(type_variable, type_name) - self._type_definition_code += f'\n\n{type_variable} = {type_code}' + self._type_definition_code += f"\n\n{type_variable} = {type_code}" elif isinstance(type_data, self._type_lib.EnumType): type_variable, type_code = self._export_enum_type(type_variable, type_name) @@ -110,27 +116,27 @@ def _export_type(self, type_name: str): elif isinstance(type_data, self._type_lib.FlagsetType): reference = self.ensure_exported_type(type_data.enum) - flags = f'BitMaskEnum({reference}.enum_class)' - self._type_definition_code += f'\n\n{type_variable} = {flags}' + flags = f"BitMaskEnum({reference}.enum_class)" + self._type_definition_code += f"\n\n{type_variable} = {flags}" elif isinstance(type_data, self._type_lib.TypedefType): reference = self.ensure_exported_type(type_data.alias) - self._type_definition_code += f'\n\n{type_variable} = {reference}' + self._type_definition_code += f"\n\n{type_variable} = {reference}" elif isinstance(type_data, self._type_lib.PointerType): inner_field = self.pointer_to_type(type_data.target) - self._type_definition_code += f'\n\n{type_variable} = {inner_field}.create_construct()' + self._type_definition_code += f"\n\n{type_variable} = {inner_field}.create_construct()" elif isinstance(type_data, self._type_lib.VectorType): inner_field = self.ensure_exported_type(type_data.value_type) type_code = f"common_types.make_vector({inner_field})" - self._type_definition_code += f'\n\n{type_variable} = {type_code}' + self._type_definition_code += f"\n\n{type_variable} = {type_code}" elif isinstance(type_data, self._type_lib.DictionaryType): key_field = self.ensure_exported_type(type_data.key_type) inner_field = self.ensure_exported_type(type_data.value_type) type_code = f"common_types.make_dict({inner_field}, key={key_field})" - self._type_definition_code += f'\n\n{type_variable} = {type_code}' + self._type_definition_code += f"\n\n{type_variable} = {type_code}" else: raise ValueError(f"Unknown type_data: {type_data}") @@ -173,7 +179,7 @@ def export_code(self): from mercury_engine_data_structures.construct_extensions.enum import StrictEnum, BitMaskEnum """ - code += 'primitive_to_construct = {\n' + code += "primitive_to_construct = {\n" code += "".join(f' "{k.value}": {v},\n' for k, v in self._primitive_to_construct.items()) code += "}\n\n" @@ -199,7 +205,7 @@ def export_code(self): if type_name != "base::reflection::CTypedValue": code += ( f'{self.pointer_to_type(type_name)}.add_option("{type_name}", ' - f'{self.ensure_exported_type(type_name)})\n' + f"{self.ensure_exported_type(type_name)})\n" ) for child in sorted(self.children_for(type_name)): code += f'{self.pointer_to_type(type_name)}.add_option("{child}", {self.ensure_exported_type(child)})\n' @@ -213,10 +219,12 @@ def game_argument_type(s: str) -> str: raise ValueError(f"No enum named {s} found") return s + def main(): parser = argparse.ArgumentParser() - parser.add_argument("game", help="The game to create the class definitions for", - type=game_argument_type, choices=["dread", "sr"]) + parser.add_argument( + "game", help="The game to create the class definitions for", type=game_argument_type, choices=["dread", "sr"] + ) args = parser.parse_args() if args.game == "dread": @@ -226,7 +234,7 @@ def main(): else: types_path = meds_root.joinpath("samus_returns_types.json") output_name = "sr_types.py" - file_names = ["sr_resource_names", "sr_property_names"] + file_names = ["sr_resource_names", "sr_property_names"] game_types = json.loads(types_path.read_text()) @@ -265,11 +273,8 @@ def main(): with meds_root.joinpath(f"{file_name}.json").open() as f: file_data: dict[str, int] = json.load(f) - data_construct.KnownHashes.build_file( - file_data, - meds_root.joinpath(f"{file_name}.bin") - ) + data_construct.KnownHashes.build_file(file_data, meds_root.joinpath(f"{file_name}.bin")) -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/tools/create_sr_file_names.py b/tools/create_sr_file_names.py index 0d81f314..55bddceb 100644 --- a/tools/create_sr_file_names.py +++ b/tools/create_sr_file_names.py @@ -21,8 +21,22 @@ "s904_omega", "s910_gym", ] -extensions = [".bmsld", ".bmscd", ".bmscc", "_auto.lua", "_auto.lc", ".lua", ".lc", ".bmsld", ".bmsbk", ".bmssd", - ".bmsnd", ".bgph", ".bmsel", ".bmsnav"] +extensions = [ + ".bmsld", + ".bmscd", + ".bmscc", + "_auto.lua", + "_auto.lc", + ".lua", + ".lc", + ".bmsld", + ".bmsbk", + ".bmssd", + ".bmsnd", + ".bgph", + ".bmsel", + ".bmsnav", +] def build(major, lvl): @@ -32,7 +46,7 @@ def build(major, lvl): result = [] -if __name__ == '__main__': +if __name__ == "__main__": for s in all_levels: result.extend(build("c10_samus", s)) result.extend(build("c50_gui", "s000_mainmenu")) diff --git a/tools/extract_pkg.py b/tools/extract_pkg.py index 5cf3ff2d..b8e67119 100644 --- a/tools/extract_pkg.py +++ b/tools/extract_pkg.py @@ -20,8 +20,9 @@ def main(): else: raise ValueError(f"unsupported game {args.game}") - path = Path(__file__).parents[1].joinpath("src", "mercury_engine_data_structures", - f"{short_game}_resource_names.json") + path = ( + Path(__file__).parents[1].joinpath("src", "mercury_engine_data_structures", f"{short_game}_resource_names.json") + ) known_names: dict[str, int] = json.loads(path.read_text()) name_for_asset_id: dict[int, str] = {asset_id: name for name, asset_id in known_names.items()} @@ -31,6 +32,7 @@ def main(): output.mkdir(parents=True, exist_ok=True) from mercury_engine_data_structures.formats import Pkg + for pkg_path in game_root.rglob("*.pkg"): with pkg_path.open("rb") as f: pkg = Pkg.parse_stream(f, target_game=args.game) @@ -45,5 +47,5 @@ def main(): target_path.write_bytes(asset.data) -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/tools/filter_file_names.py b/tools/filter_file_names.py index bb5e1083..8324696e 100644 --- a/tools/filter_file_names.py +++ b/tools/filter_file_names.py @@ -67,8 +67,9 @@ def main(): else: raise ValueError(f"unsupported game {game}") - path = Path(__file__).parents[1].joinpath("src", "mercury_engine_data_structures", - f"{short_game}_resource_names.json") + path = ( + Path(__file__).parents[1].joinpath("src", "mercury_engine_data_structures", f"{short_game}_resource_names.json") + ) game_root: Path = args.game_root toc = Toc.parse( @@ -93,16 +94,14 @@ def main(): if new_name not in known_names: known_names[new_name] = game.hash_asset(new_name) - filtered_names = { - name: value - for name, value in known_names.items() - if value in all_asset_id - } - path.write_text(json.dumps( - filtered_names, - indent=4, - sort_keys=True, - )) + filtered_names = {name: value for name, value in known_names.items() if value in all_asset_id} + path.write_text( + json.dumps( + filtered_names, + indent=4, + sort_keys=True, + ) + ) asset_ids_with_names = set(filtered_names.values()) print(f"Paths in toc: {len(all_asset_id)}") @@ -110,6 +109,7 @@ def main(): print("\n\n") from mercury_engine_data_structures.formats import Pkg + for pkg_path in game_root.rglob("*.pkg"): with pkg_path.open("rb") as f: # print(f"\n\n=== {pkg_path.relative_to(game_root)}") @@ -130,5 +130,5 @@ def main(): print(f"{pkg_path.relative_to(game_root)}: {known_ids} known ids, {missing_ids} missing ids") -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/tools/ghidra_export.py b/tools/ghidra_export.py index 799a32e5..b73a2eac 100644 --- a/tools/ghidra_export.py +++ b/tools/ghidra_export.py @@ -34,7 +34,6 @@ "CGameLink": PrimitiveKind.STRING, "CGameLink": PrimitiveKind.STRING, "base::global::CRntFile": PrimitiveKind.BYTES, - # TODO: test if works "base::global::CName": PrimitiveKind.PROPERTY, "base::core::CAssetLink": PrimitiveKind.STRING, @@ -48,26 +47,28 @@ } known_typedefs = { "TPatterns": "base::global::CRntVector", - "CCharClassRodotukAIComponent::TVAbsorbConfigs": - ("base::global::CRntVector"), + "CCharClassRodotukAIComponent::TVAbsorbConfigs": ( + "base::global::CRntVector" + ), "TLaunchPattern": "base::global::CRntVector", "TLaunchConfigs": "base::global::CRntVector", "TBigkranXSpitLaunchPattern": "base::global::CRntVector", - "CCharClassRodomithonXAIComponent::TVFirePillarConfigs": - ("base::global::CRntVector"), + "CCharClassRodomithonXAIComponent::TVFirePillarConfigs": ( + "base::global::CRntVector" + ), "CMinimapDef::TMapLabelDefs": "base::global::CRntDictionary", "CMinimapDef::TMapIconDefs": "base::global::CRntDictionary", "CBlackboard::TSectionContainer": "base::global::CRntDictionary", - "CPlaythrough::TDictCheckpointDatas": - ("base::global::CRntDictionary>"), + "CPlaythrough::TDictCheckpointDatas": ( + "base::global::CRntDictionary>" + ), "TSoundEventRules": "base::global::CRntVector>", "CGameBlackboard::TPropDeltaValues": "base::global::CRntSmallDictionary", "CMinimapData::TOccludedIcons": "base::global::CRntVector", "CMinimapData::TColliderGeoDatasMap": "base::global::CRntSmallDictionary", - - 'GUI::CDisplayObjectTrack::SKey': 'GUI::CDisplayObjectTrackBool::SKey', - 'GUI::CDisplayObjectTrack::SKey': 'GUI::CDisplayObjectTrackFloat::SKey', - 'GUI::CDisplayObjectTrack::SKey': 'GUI::CDisplayObjectTrackString::SKey', + "GUI::CDisplayObjectTrack::SKey": "GUI::CDisplayObjectTrackBool::SKey", + "GUI::CDisplayObjectTrack::SKey": "GUI::CDisplayObjectTrackFloat::SKey", + "GUI::CDisplayObjectTrack::SKey": "GUI::CDisplayObjectTrackString::SKey", } vector_re = re.compile(r"base::global::CRntVector<\s*(.*?)(?:, false)?\s*>$") @@ -97,22 +98,13 @@ def find_ptr_match(type_name: str): def convert_type(type_name: str, type_data: dict): if type_name in known_types_to_construct: - return { - "kind": TypeKind.PRIMITIVE.value, - "primitive_kind": known_types_to_construct[type_name].value - } + return {"kind": TypeKind.PRIMITIVE.value, "primitive_kind": known_types_to_construct[type_name].value} if type_name in known_typedefs: - return { - "kind": TypeKind.TYPEDEF.value, - "alias": known_typedefs[type_name] - } + return {"kind": TypeKind.TYPEDEF.value, "alias": known_typedefs[type_name]} if type_name in known_flagsets: - return { - "kind": TypeKind.FLAGSET.value, - "enum": known_flagsets[type_name] - } + return {"kind": TypeKind.FLAGSET.value, "enum": known_flagsets[type_name]} if type_data["values"] is not None: return { @@ -199,12 +191,7 @@ def convert_old_to_new(old_types: dict[str, dict[str, typing.Any]]): hash_str = "HashString" register_field = "RegisterField" add_enum_value = "(?:FUN_71000148b8|AddEnumValue)" -prefixes_to_remove = [ - "(ObjectField *)", - "&", - "(CClass *)", - "Reflection::" -] +prefixes_to_remove = ["(ObjectField *)", "&", "(CClass *)", "Reflection::"] _aliases = { # weirdness @@ -212,23 +199,18 @@ def convert_old_to_new(old_types: dict[str, dict[str, typing.Any]]): "global::CStrId": "base::global::CStrId", "global::CFilePathStrId": "base::global::CFilePathStrId", "math::CVector3D": "base::math::CVector3D", - # custom names "&DAT_7172642b18": "CGameLink", "&DAT_717275c0d8": "CGameLink", "&DAT_7172642ed8": "base::global::CRntVector>", "&DAT_717275c498": "base::global::CRntVector>", - "&CGameLink_CActor_DAT_7172642b18": "CGameLink", "&CGameLink::Serializer": "CGameLink", "&Vector_GameLink_CActor_7172642ed8": "base::global::CRntVector>", "&Vector_CGameLink_CEntity_DAT_717275c498": "base::global::CRntVector>", - "&Vector_PtrCTriggerLogicAction_DAT_71726f3930": "base::global::CRntVector>", - "&Vector_CXParasiteBehavior_71726c3030": "base::global::CRntVector>", "&base::snd::ELowPassFilter_DAT_7108b13de8": "base::snd::ELowPassFilter", - "&DAT_71726bb4c0": "base::global::CRntVector", "&DAT_71726baee8": "base::global::CRntVector>", "&DAT_71729a98a8": "base::global::CRntVector", @@ -243,8 +225,9 @@ def convert_old_to_new(old_types: dict[str, dict[str, typing.Any]]): "&vectSpawnPoints_DAT_71729aaf30": "base::global::CRntVector>", "&Vector_CSpawnerActorBlueprint_DAT_71729aa9d0": "base::global::CRntVector", "&Trigger_DAT_71726f4968": "base::global::CRntVector>", - "&DictStr_ListStr_DAT_71726f5da0": - ("base::global::CRntDictionary>"), + "&DictStr_ListStr_DAT_71726f5da0": ( + "base::global::CRntDictionary>" + ), "&VectorStrId_DAT_7101d03998": "base::global::CRntVector", "&DAT_71726f8e78": "base::global::CRntVector", "&DAT_71726fd0c0": "base::global::CRntVector", @@ -267,13 +250,13 @@ def convert_old_to_new(old_types: dict[str, dict[str, typing.Any]]): def clean_crc_var(crc_var: str) -> str: for prefix in prefixes_to_remove: if crc_var.startswith(prefix): - crc_var = crc_var[len(prefix):].strip() + crc_var = crc_var[len(prefix) :].strip() return crc_var def fix_alternative_ghidra_name(name: str) -> str: if name.endswith("Ptr"): - name = name[:-len("Ptr")] + "*" + name = name[: -len("Ptr")] + "*" name = name.replace("_const", " const") name = name.replace(",_", ", ") name = name.replace("_Ptr", " Ptr") @@ -285,13 +268,19 @@ def get_field_registrations(bridge: ghidra_bridge.GhidraBridge, ifc, monitor, fi if fields_function is None: return {} - res = bridge.remote_eval(""" + res = bridge.remote_eval( + """ ifc.decompileFunction(fields_function, 180, monitor) - """, timeout_override=200, fields_function=fields_function, ifc=ifc, monitor=monitor) + """, + timeout_override=200, + fields_function=fields_function, + ifc=ifc, + monitor=monitor, + ) decompiled_code = str(res.getCCodeMarkup()) hash_call_re = re.compile(hash_str + r'\(([^,]+?),"?([^,]+?)"?,(?:1|true)\);') - register_call_re = re.compile(register_field + r'\([^,]+?,([^,]+?),(.+?),([^,]+?),([^,]+?),([^,]+?)\);') + register_call_re = re.compile(register_field + r"\([^,]+?,([^,]+?),(.+?),([^,]+?),([^,]+?),([^,]+?)\);") crc_mapping = collections.defaultdict(list) fields = {} @@ -314,20 +303,20 @@ def get_field_registrations(bridge: ghidra_bridge.GhidraBridge, ifc, monitor, fi if "&" in type_var: if "::_" in type_var: - type_name = type_var[type_var.find("&") + 1:type_var.find("::_")] + type_name = type_var[type_var.find("&") + 1 : type_var.find("::_")] else: type_name = type_var else: i = decompiled_code.rfind(type_var, offset, m.start()) - end = decompiled_code.find(';', i) - type_name = decompiled_code[i + len(type_var) + len(" = "):end] + end = decompiled_code.find(";", i) + type_name = decompiled_code[i + len(type_var) + len(" = ") : end] for prefix in prefixes_to_remove: if type_name.startswith(prefix): - type_name = type_name[len(prefix):].strip() + type_name = type_name[len(prefix) :].strip() if type_name.endswith("()"): - type_name = type_name[:-len("()")] + type_name = type_name[: -len("()")] if type_name.endswith("::init"): - type_name = type_name[:-len("::init")] + type_name = type_name[: -len("::init")] fields[crc_string] = _aliases.get(type_name, type_name) @@ -338,13 +327,19 @@ def get_value_registrations(bridge: ghidra_bridge.GhidraBridge, ifc, monitor, va if values_function is None: return None - res = bridge.remote_eval(""" + res = bridge.remote_eval( + """ ifc.decompileFunction(values_function, 180, monitor) - """, timeout_override=200, values_function=values_function, ifc=ifc, monitor=monitor) + """, + timeout_override=200, + values_function=values_function, + ifc=ifc, + monitor=monitor, + ) decompiled_code = str(res.getCCodeMarkup()) hash_call_re = re.compile(hash_str + r'\(([^,]+?),"?([^,]+?)"?,(?:1|true)\);') - enum_call_re = re.compile(add_enum_value + r'\([^,]+?,([^,]+?),(.+?)\);') + enum_call_re = re.compile(add_enum_value + r"\([^,]+?,([^,]+?),(.+?)\);") crc_mapping = collections.defaultdict(list) values = {} @@ -395,17 +390,17 @@ def get_function_list() -> dict[str, tuple[int, int, int]]: values_funcs = {} for name, func_id in result_fields + result_init + result_values: if name.startswith("Reflection::"): - name = name[len("Reflection::"):] + name = name[len("Reflection::") :] if name.startswith("base::reflection::CollectionTypeMapper"): continue if name.endswith("::init"): - init_funcs[name[:-len("::init")]] = func_id + init_funcs[name[: -len("::init")]] = func_id elif name.endswith("::fields"): - fields_funcs[name[:-len("::fields")]] = func_id + fields_funcs[name[: -len("::fields")]] = func_id elif name.endswith("::values"): - values_funcs[name[:-len("::values")]] = func_id + values_funcs[name[: -len("::values")]] = func_id return { name: (init_funcs.get(name), fields_funcs.get(name), values_funcs.get(name)) @@ -434,9 +429,9 @@ def initialize_worker(): ifc.openProgram(flat_api.currentProgram) -def decompile_type(type_name: str, init_id: typing.Optional[int], fields_id: typing.Optional[int], - values_id: typing.Optional[int] - ) -> tuple[str, typing.Optional[str], dict[str, str], dict[str, int]]: +def decompile_type( + type_name: str, init_id: typing.Optional[int], fields_id: typing.Optional[int], values_id: typing.Optional[int] +) -> tuple[str, typing.Optional[str], dict[str, str], dict[str, int]]: if bridge is None: raise ValueError("Bridge not initialized") @@ -450,35 +445,44 @@ def find_parent(f): parent_init: typing.Optional[str] = None if init_id is not None: - parent_init = bridge.remote_eval("""find_parent( + parent_init = bridge.remote_eval( + """find_parent( currentProgram.getFunctionManager().getFunctionAt( currentProgram.getSymbolTable().getSymbol(func_id).getAddress() ) - )""", func_id=init_id) + )""", + func_id=init_id, + ) func = None if fields_id is not None: - func = bridge.remote_eval(""" + func = bridge.remote_eval( + """ currentProgram.getFunctionManager().getFunctionAt( currentProgram.getSymbolTable().getSymbol(func_id).getAddress() ) - """, func_id=fields_id) + """, + func_id=fields_id, + ) fields = get_field_registrations(bridge, ifc, monitor, func) func = None if values_id is not None: - func = bridge.remote_eval(""" + func = bridge.remote_eval( + """ currentProgram.getFunctionManager().getFunctionAt( currentProgram.getSymbolTable().getSymbol(func_id).getAddress() ) - """, func_id=values_id) + """, + func_id=values_id, + ) values = get_value_registrations(bridge, ifc, monitor, func) if parent_init is not None: if parent_init.startswith("Reflection::"): - parent_init = parent_init[len("Reflection::"):] - parent_init = parent_init[:-len("::init")] + parent_init = parent_init[len("Reflection::") :] + parent_init = parent_init[: -len("::init")] return type_name, parent_init, fields, values @@ -507,6 +511,7 @@ def callback(r): if total_count > process_count: with multiprocessing.Pool(processes=process_count, initializer=initialize_worker) as pool: + def error_callback(name, e): failed.append(name) msg = "".join(traceback.format_exception(type(e), e, e.__traceback__)) @@ -571,8 +576,12 @@ def is_container_or_ptr(name: str): return any(name.endswith(suffix) for suffix in suffixes) or any(name.startswith(prefix) for prefix in prefixes) -def main(only_missing: bool = True, ignore_without_hash: bool = True, - ignore_container_or_ptr: bool = True, query_ghidra: bool = True): +def main( + only_missing: bool = True, + ignore_without_hash: bool = True, + ignore_container_or_ptr: bool = True, + query_ghidra: bool = True, +): print("Getting function list") all_fields_functions = get_function_list() if query_ghidra else {} print(f"Got {len(all_fields_functions)} functions!") @@ -635,10 +644,7 @@ def main(only_missing: bool = True, ignore_without_hash: bool = True, old_data[key] = value with path.open("w") as f: - json.dump({ - key: old_data[key] - for key in sorted(old_data.keys()) - }, f, indent=4) + json.dump({key: old_data[key] for key in sorted(old_data.keys())}, f, indent=4) def _merge_split_types(final_results: dict[str, typing.Any]): @@ -650,8 +656,14 @@ def _merge_split_types(final_results: dict[str, typing.Any]): continue last_part = key.split("::")[-1] - if last_part.startswith("E") or last_part in {"SKey", "CParams", "SState", "CDefinition", "SSubState", - "CActorDef"}: + if last_part.startswith("E") or last_part in { + "SKey", + "CParams", + "SState", + "CDefinition", + "SSubState", + "CActorDef", + }: continue similar = [other for other in final_results.keys() if other.endswith(last_part) and other != key] @@ -690,5 +702,5 @@ def simple_decompile(): # print(decompile_function(*all_fields_functions[4])) -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/tools/list_known_paths_in_toc.py b/tools/list_known_paths_in_toc.py index 1508ea32..502794e6 100644 --- a/tools/list_known_paths_in_toc.py +++ b/tools/list_known_paths_in_toc.py @@ -38,11 +38,13 @@ def main(): for asset_id in toc.get_all_asset_id(): if asset_id not in used_asset_id: continue - print("{:016x}: {}".format( - asset_id, - id_mapping.get(asset_id, ""), - )) + print( + "{:016x}: {}".format( + asset_id, + id_mapping.get(asset_id, ""), + ) + ) -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/tools/plot_simple_map.py b/tools/plot_simple_map.py index c445b3ef..89edf821 100644 --- a/tools/plot_simple_map.py +++ b/tools/plot_simple_map.py @@ -16,20 +16,17 @@ from mercury_engine_data_structures.game_check import Game world_names = { - 'maps/levels/c10_samus/s010_cave/s010_cave.brfld': "Artaria", - 'maps/levels/c10_samus/s020_magma/s020_magma.brfld': "Cataris", - 'maps/levels/c10_samus/s030_baselab/s030_baselab.brfld': "Dairon", - 'maps/levels/c10_samus/s040_aqua/s040_aqua.brfld': "Burenia", - 'maps/levels/c10_samus/s050_forest/s050_forest.brfld': "Ghavoran", - 'maps/levels/c10_samus/s060_quarantine/s060_quarantine.brfld': "Elun", - 'maps/levels/c10_samus/s070_basesanc/s070_basesanc.brfld': "Ferenia", - 'maps/levels/c10_samus/s080_shipyard/s080_shipyard.brfld': "Hanubia", - 'maps/levels/c10_samus/s090_skybase/s090_skybase.brfld': "Itorash", -} -id_to_name = { - os.path.splitext(path.split("/")[-1])[0]: name - for path, name in world_names.items() + "maps/levels/c10_samus/s010_cave/s010_cave.brfld": "Artaria", + "maps/levels/c10_samus/s020_magma/s020_magma.brfld": "Cataris", + "maps/levels/c10_samus/s030_baselab/s030_baselab.brfld": "Dairon", + "maps/levels/c10_samus/s040_aqua/s040_aqua.brfld": "Burenia", + "maps/levels/c10_samus/s050_forest/s050_forest.brfld": "Ghavoran", + "maps/levels/c10_samus/s060_quarantine/s060_quarantine.brfld": "Elun", + "maps/levels/c10_samus/s070_basesanc/s070_basesanc.brfld": "Ferenia", + "maps/levels/c10_samus/s080_shipyard/s080_shipyard.brfld": "Hanubia", + "maps/levels/c10_samus/s090_skybase/s090_skybase.brfld": "Itorash", } +id_to_name = {os.path.splitext(path.split("/")[-1])[0]: name for path, name in world_names.items()} pickup_index = 0 bmscc: typing.Optional[Bmscc] = None brsa: typing.Optional[Brsa] = None @@ -44,11 +41,9 @@ [-5200.0, -5600.0], [-4800.0, -5600.0], [-3300.0, -6200.0], - [-1200.0, -6200.0] - ], - ("s010_cave", "collision_camera_023"): [ - [24900.0, 5100.0], [17800.0, 5100.0], [17800.0, 3400.0], [24900.0, 3400.0] + [-1200.0, -6200.0], ], + ("s010_cave", "collision_camera_023"): [[24900.0, 5100.0], [17800.0, 5100.0], [17800.0, 3400.0], [24900.0, 3400.0]], ("s010_cave", "collision_camera_048"): [ [800.0, 3900.0], [-1200.0, 3900.0], @@ -58,7 +53,7 @@ [-1000.0, 2100.0], [-1000.0, 1500.0], [500.0, 1500.0], - [800.0, 1500.0] + [800.0, 1500.0], ], ("s040_aqua", "collision_camera_023_B"): [ [4100.0, -9800.0], @@ -104,26 +99,24 @@ "phase_shift": "Phase Shift Door", } _weakness_table_for_def = { - 'doorframe': (dock_weakness["frame"], dock_weakness["frame"]), - 'doorchargecharge': (dock_weakness["charge"], dock_weakness["charge"]), - 'doorclosedcharge': (dock_weakness["closed"], dock_weakness["charge"]), - 'doorpowerpower': (dock_weakness["power"], dock_weakness["power"]), - 'doorclosedpower': (dock_weakness["closed"], dock_weakness["power"]), - 'doorpowerclosed': (dock_weakness["power"], dock_weakness["closed"]), - 'doorchargeclosed': (dock_weakness["charge"], dock_weakness["closed"]), - 'doorpresencepresence': (dock_weakness["presence"], dock_weakness["presence"]), - 'doorpresenceframe': (dock_weakness["presence"], dock_weakness["frame"]), - 'doorframepresence': (dock_weakness["frame"], dock_weakness["presence"]), - 'doorgrapplegrapple': (dock_weakness["grapple"], dock_weakness["grapple"]), - 'doorclosedgrapple': (dock_weakness["closed"], dock_weakness["grapple"]), - 'doorgrappleclosed': (dock_weakness["grapple"], dock_weakness["closed"]), - 'doorshutter': (dock_weakness["phase_shift"], dock_weakness["phase_shift"]), - + "doorframe": (dock_weakness["frame"], dock_weakness["frame"]), + "doorchargecharge": (dock_weakness["charge"], dock_weakness["charge"]), + "doorclosedcharge": (dock_weakness["closed"], dock_weakness["charge"]), + "doorpowerpower": (dock_weakness["power"], dock_weakness["power"]), + "doorclosedpower": (dock_weakness["closed"], dock_weakness["power"]), + "doorpowerclosed": (dock_weakness["power"], dock_weakness["closed"]), + "doorchargeclosed": (dock_weakness["charge"], dock_weakness["closed"]), + "doorpresencepresence": (dock_weakness["presence"], dock_weakness["presence"]), + "doorpresenceframe": (dock_weakness["presence"], dock_weakness["frame"]), + "doorframepresence": (dock_weakness["frame"], dock_weakness["presence"]), + "doorgrapplegrapple": (dock_weakness["grapple"], dock_weakness["grapple"]), + "doorclosedgrapple": (dock_weakness["closed"], dock_weakness["grapple"]), + "doorgrappleclosed": (dock_weakness["grapple"], dock_weakness["closed"]), + "doorshutter": (dock_weakness["phase_shift"], dock_weakness["phase_shift"]), # These doors are going to be event or whatever it is - 'doorheat': (None, None), - + "doorheat": (None, None), # These are the entirely different kind of door - 'dooremmy': ("EMMI Door", "EMMI Door"), + "dooremmy": ("EMMI Door", "EMMI Door"), } _dock_type_for_weakness = { "EMMI Door": "other", @@ -139,2962 +132,2947 @@ } _rooms_for_actors = { - 's010_cave': { - 'AP_01': ['collision_camera_068 (A)'], - 'AP_02': ['collision_camera_065 (A)'], - 'AccessPointTutoTrigger': ['collision_camera_068 (A)'], - 'CAM_Default': [], - 'CAM_Far': ['collision_camera_023 (A)'], - 'CAM_Far_Chasing': ['collision_camera_023 (A)'], - 'CamTunnel': ['collision_camera_055 (A)'], - 'CamTunnel_R': ['collision_camera_055 (A)'], - 'Cam_PreChain': ['collision_camera_026 (A)'], - 'Door001 (CG-CG)': ['collision_camera_013 (A)', 'collision_camera_014 (A)'], - 'Door002 (CG-CG)': ['collision_camera_000_Init (A)', 'collision_camera_013 (A)'], - 'Door003 (PW-PW)': ['collision_camera_013 (A)', 'collision_camera_062 (A)'], - 'Door003_missileShield': ['collision_camera_013 (A)', 'collision_camera_062 (A)'], - 'Door004 (PW-PW)': ['collision_camera_013 (A)', 'collision_camera_062 (A)'], - 'Door004 (PW-PW)_001': ['collision_camera_062 (A)', 'collision_camera_086 (A)'], - 'Door005 (PW-PW)': ['collision_camera_045 (A)', 'collision_camera_054 (A)'], - 'Door006 (CG-CG)': ['collision_camera_000 (A)', 'collision_camera_001 (A)'], - 'Door007 (CG-CG)': ['collision_camera_001 (A)', 'collision_camera_002 (A)'], - 'Door008 (PW-PW)': ['collision_camera_002 (A)', 'collision_camera_068 (A)'], - 'Door009 (PW-PW)': ['collision_camera_000 (A)', 'collision_camera_068 (A)'], - 'Door010 (CL-PW,OP)': ['collision_camera_003 (A)', 'collision_camera_016 (A)'], - 'Door011 (CG-CG)': ['collision_camera_003 (A)', 'collision_camera_004 (A)'], - 'Door012 (PW-PW, MISSILE)': ['collision_camera_003 (A)', 'collision_camera_063 (A)'], - 'Door014 (CG-CG)': ['collision_camera_005 (A)', 'collision_camera_018 (A)'], - 'Door015 (CG-CG)': ['collision_camera_017 (A)', 'collision_camera_049 (A)'], - 'Door016 (PW-PW)': ['collision_camera_015 (A)', 'collision_camera_017 (A)'], - 'Door017 (CU)_000': ['collision_camera_049 (A)'], - 'Door018 (CG-CL,OP)': ['collision_camera_005 (A)', 'collision_camera_017 (A)'], - 'Door020 (PW-PW)': ['collision_camera_008 (A)', 'collision_camera_009 (A)'], - 'Door021 (PW-PW)': ['collision_camera_058 (A)', 'collision_camera_060 (A)'], - 'Door021 (PW-PW)_000': ['collision_camera_059 (A)', 'collision_camera_060 (A)'], - 'Door022 (PW-PW) ': ['collision_camera_056 (A)', 'collision_camera_058 (A)'], - 'Door022 (PW-PW) _000': ['collision_camera_056 (A)', 'collision_camera_059 (A)'], - 'Door023 (PW-PW)': ['collision_camera_012 (A)', 'collision_camera_056 (A)'], - 'Door024 (PW-PW)': ['collision_camera_011 (A)', 'collision_camera_012 (A)'], - 'Door025 (PW-PW)': ['collision_camera_009 (A)', 'collision_camera_048 (A)'], - 'Door026 (PW-PW)': ['collision_camera_006 (A)', 'collision_camera_008 (A)'], - 'Door028': ['collision_camera_008 (A)', 'collision_camera_009 (A)'], - 'Door029 (CG-CL,OP)': ['collision_camera_021 (A)', 'collision_camera_065 (A)'], - 'Door030 (PW-PW)': ['collision_camera_050 (A)', 'collision_camera_065 (A)'], - 'Door032 (CG-CG)': ['collision_camera_022 (A)', 'collision_camera_023 (A)'], - 'Door033 (PW-PW)': ['collision_camera_066 (A)', 'collision_camera_067 (A)'], - 'Door034 (PW-PW)': ['collision_camera_025 (A)', 'collision_camera_066 (A)'], - 'Door035 (PW-PW)': ['collision_camera_024 (A)', 'collision_camera_025 (A)'], - 'Door036 (PW-PW)': ['collision_camera_023 (A)', 'collision_camera_024 (A)'], - 'Door037 (CG-CG)': ['collision_camera_023_B (A)', 'collision_camera_024 (A)'], - 'Door038 (PW-PW)': ['collision_camera_004 (A)', 'collision_camera_063 (A)'], - 'Door038 (PW-PW)_000': ['collision_camera_004 (A)', 'collision_camera_072 (A)'], - 'Door041 (TH)': ['collision_camera_006 (A)', 'collision_camera_008 (A)'], - 'Door042 (PW-PW) ': ['collision_camera_065 (A)', 'collision_camera_070 (A)'], - 'Door044 (TH)': ['collision_camera_021 (A)', 'collision_camera_022 (A)'], - 'Door045 (TH)': ['collision_camera_022 (A)', 'collision_camera_067 (A)'], - 'Door046 (PW-CL,OP)': ['collision_camera_066 (A)', 'collision_camera_067 (A)'], - 'Door049 (PR-PR)': ['collision_camera_050 (A)', 'collision_camera_073 (A)'], - 'Door050 (TH)': ['collision_camera_006 (A)', 'collision_camera_015 (A)'], - 'Door052': ['collision_camera_072 (A)', 'collision_camera_073 (A)'], - 'Door053': ['collision_camera_026 (A)', 'collision_camera_055 (A)'], - 'Door054': ['collision_camera_011 (A)', 'collision_camera_055 (A)'], - 'Door055': ['collision_camera_026 (A)', 'collision_camera_028 (A)'], - 'Door055 (PW-PW)': ['collision_camera_003 (A)', 'collision_camera_016 (A)'], - 'Door056': ['collision_camera_011 (A)', 'collision_camera_028 (A)'], - 'Door056 (CU)': ['collision_camera_064 (A)', 'collision_camera_074 (A)'], - 'Door057': ['collision_camera_026 (A)', 'collision_camera_029 (A)'], - 'Door057 (TH)': ['collision_camera_065 (A)', 'collision_camera_070 (A)'], - 'Door058': ['collision_camera_029 (A)', 'collision_camera_031 (A)'], - 'Door058 (PW-PW)': ['collision_camera_016 (A)', 'collision_camera_064 (A)'], - 'Door059': ['collision_camera_030 (A)', 'collision_camera_031 (A)'], - 'Door059 (CL-PW)': ['collision_camera_017 (A)', 'collision_camera_049 (A)'], - 'Door059_missileShield': ['collision_camera_030 (A)', 'collision_camera_031 (A)'], - 'Door060': ['collision_camera_024 (A)', 'collision_camera_078 (A)'], - 'Door062': ['collision_camera_077 (A)', 'collision_camera_078 (A)'], - 'Door062 (PW-PW, Special)': ['collision_camera_005 (A)', 'collision_camera_006 (A)'], - 'Door063': ['collision_camera_077 (A)', 'collision_camera_079 (A)'], - 'Door064': ['collision_camera_076 (A)', 'collision_camera_088 (A)'], - 'Door065': ['collision_camera_032 (A)', 'collision_camera_076 (A)'], - 'Door066': ['collision_camera_032 (A)', 'collision_camera_034 (A)'], - 'Door067': ['collision_camera_032 (A)', 'collision_camera_089 (A)'], - 'Door069': ['collision_camera_033 (A)', 'collision_camera_089 (A)'], - 'Door069_missileShield': ['collision_camera_033 (A)', 'collision_camera_089 (A)'], - 'Door070': ['collision_camera_080 (A)', 'collision_camera_081 (A)'], - 'Door070_missileShield': ['collision_camera_080 (A)', 'collision_camera_081 (A)'], - 'Door073': ['collision_camera_081 (A)', 'collision_camera_085 (A)'], - 'Door074': ['collision_camera_085 (A)', 'collision_camera_056 (A)'], - 'Door075': ['collision_camera_081 (A)', 'collision_camera_082 (A)'], - 'Door076': ['collision_camera_082 (A)', 'collision_camera_056 (A)'], - 'Door077': ['collision_camera_082 (A)', 'collision_camera_091 (A)'], - 'Door078': ['collision_camera_086 (A)', 'collision_camera_091 (A)'], - 'DoorEmmy01': ['collision_camera_054 (A)', 'collision_camera_061 (A)'], - 'DoorEmmy02': ['collision_camera_060 (A)', 'collision_camera_075 (A)'], - 'DoorEmmy03': ['collision_camera_011 (A)', 'collision_camera_051 (A)'], - 'DoorEmmy05': ['collision_camera_009 (A)', 'collision_camera_088 (A)'], - 'DoorEmmy06': ['collision_camera_008 (A)', 'collision_camera_070 (A)'], - 'DoorEmmy07': ['collision_camera_008 (A)', 'collision_camera_070 (A)'], - 'DoorEmmy08': ['collision_camera_050 (A)', 'collision_camera_071 (A)'], - 'DoorEmmy10': ['collision_camera_004 (A)', 'collision_camera_005 (A)'], - 'DoorEmmy10_000': ['collision_camera_004 (A)', 'collision_camera_005 (A)'], - 'DoorEmmy11': ['collision_camera_003 (A)', 'collision_camera_018 (A)'], - 'DoorFrame_001': ['collision_camera_048 (A)', 'collision_camera_051 (A)'], - 'DoorFrame_004': ['collision_camera_010 (A)', 'collision_camera_075 (A)'], - 'DoorFrame_005': ['collision_camera_010 (A)', 'collision_camera_075 (A)'], - 'DoorFrame_006': ['collision_camera_010 (A)', 'collision_camera_069 (A)'], - 'DoorFrame_007': ['collision_camera_010 (A)', 'collision_camera_069 (A)'], - 'DoorFrame_009': ['collision_camera_015 (A)', 'collision_camera_017 (A)'], - 'DoorFrame_010': ['collision_camera_015 (A)', 'collision_camera_017 (A)'], - 'DoorFrame_011': ['collision_camera_015 (A)', 'collision_camera_017 (A)'], - 'DoorFrame_012': ['collision_camera_015 (A)', 'collision_camera_069 (A)'], - 'DoorFrame_014': ['collision_camera_006 (A)', 'collision_camera_053 (A)'], - 'DoorFrame_015': ['collision_camera_008 (A)', 'collision_camera_071 (A)'], - 'DoorFrame_016': ['collision_camera_008 (A)', 'collision_camera_071 (A)'], - 'DoorFrame_017': ['collision_camera_010 (A)', 'collision_camera_053 (A)'], - 'DoorPowerPower_001': ['collision_camera_008 (A)', 'collision_camera_071 (A)'], - 'FreeAimTutoTriggerEnter': ['collision_camera_000 (A)'], - 'FreeAimTutoTriggerExit': ['collision_camera_000 (A)'], - 'HiddenBlocksTutoTriggerEnter': ['collision_camera_000 (A)'], - 'HiddenBlocksTutoTriggerExit': ['collision_camera_000 (A)'], - 'IT_VARIA_GEN_001': ['collision_camera_031 (A)'], - 'ItemSphere_ChargeBeam': ['collision_camera_014 (A)'], - 'ItemSphere_GrappleBeam': ['collision_camera_033 (A)'], - 'ItemSphere_ScrewAttack': ['collision_camera_081 (A)'], - 'Item_EnergyTank001': ['collision_camera_001 (A)'], - 'Item_MissileTank001': ['collision_camera_005 (A)'], - 'Item_MissileTank002': ['collision_camera_015 (A)'], - 'Item_MissileTank003': ['collision_camera_056 (A)'], - 'Item_MissileTank003_1': ['collision_camera_003 (A)'], - 'Item_MissileTank004': ['collision_camera_011 (A)'], - 'Item_MissileTank005': ['collision_camera_021 (A)'], - 'Item_MissileTank006': ['collision_camera_067 (A)'], - 'Item_MissileTank007': ['collision_camera_023_B (A)'], - 'Item_MissileTank009': ['collision_camera_016 (A)'], - 'Item_MissileTank010': ['collision_camera_054 (A)'], - 'Item_MissileTank011': ['collision_camera_070 (A)'], - 'Item_MissileTank012': ['collision_camera_078 (A)'], - 'Item_MissileTank014': ['collision_camera_081 (A)'], - 'Item_MissileTank015': ['collision_camera_082 (A)'], - 'Item_MissileTank016': ['collision_camera_013 (A)'], - 'LE_CentraUnitDestroyedProto': ['collision_camera_074 (A)'], - 'LE_Elevator_FromMagma': ['collision_camera_077 (A)'], - 'LE_GateProtoEmmy': ['collision_camera_016 (A)'], - 'LE_MagnetSurface_01': ['collision_camera_005 (A)'], - 'LE_MagnetSurface_03': ['collision_camera_005 (A)'], - 'LE_MagnetSurface_03_000': ['collision_camera_005 (A)'], - 'LE_MagnetSurface_05': ['collision_camera_015 (A)'], - 'LE_MagnetSurface_05_000': ['collision_camera_017 (A)'], - 'LE_MagnetSurface_06': ['collision_camera_069 (A)'], - 'LE_MagnetSurface_07': ['collision_camera_010 (A)'], - 'LE_MagnetSurface_08': ['collision_camera_010 (A)'], - 'LE_MagnetSurface_09': ['collision_camera_010 (A)'], - 'LE_MagnetSurface_09_000': ['collision_camera_048 (A)'], - 'LE_MagnetSurface_10': ['collision_camera_023_B (A)'], - 'LE_MagnetSurface_11': ['collision_camera_005 (A)'], - 'LE_MagnetSurface_12': ['collision_camera_006 (A)'], - 'LE_MagnetSurface_15': ['collision_camera_077 (A)'], - 'LE_MagnetSurface_16': ['collision_camera_077 (A)'], - 'LE_MagnetSurface_17': ['collision_camera_026 (A)'], - 'LE_MagnetSurface_19': ['collision_camera_073 (A)'], - 'LE_MagnetSurface_20': ['collision_camera_078 (A)'], - 'LE_MagnetSurface_21': ['collision_camera_079 (A)'], - 'LE_MagnetSurface_23': ['collision_camera_088 (A)'], - 'LE_MagnetSurface_24': ['collision_camera_032 (A)'], - 'LE_MagnetSurface_25': ['collision_camera_032 (A)'], - 'LE_MagnetSurface_26': ['collision_camera_032 (A)'], - 'LE_MagnetSurface_29': ['collision_camera_005 (A)'], - 'LE_MagnetSurface_30': ['collision_camera_005 (A)'], - 'LE_MagnetSurface_31': ['collision_camera_005 (A)'], - 'LE_MagnetSurface_32': ['collision_camera_022 (A)'], - 'LE_MagnetSurface_34': ['collision_camera_022 (A)'], - 'LE_MagnetSurface_35': ['collision_camera_054 (A)'], - 'LE_Platform_Elevator_FromMagma': ['collision_camera_077 (A)'], - 'LE_Platform_Teleport_FromMagma': ['collision_camera_011 (A)'], - 'LE_Platform_Teleport_FromMagma_frozen': ['collision_camera_011 (A)'], - 'LE_Teleport_FromMagma': ['collision_camera_011 (A)'], - 'LE_WorldGraph': [], - 'LE_zipline_bottom_gen_001_001': ['collision_camera_079 (A)'], - 'LE_zipline_bottom_gen_001_001_frozen': ['collision_camera_079 (A)'], - 'LE_zipline_bottom_gen_001_002': ['collision_camera_078 (A)'], - 'LE_zipline_right_gen_001': ['collision_camera_050 (A)'], - 'LE_zipline_right_gen_001_frozen': ['collision_camera_050 (A)'], - 'LM_AfterCentralUnitCavesDestroyed_000': ['collision_camera_090 (A)'], - 'LM_AfterEmmyProtoClimbSequence_Emmy': ['collision_camera_064 (A)'], - 'LM_AfterEmmyProtoClimbSequence_Samus': ['collision_camera_064 (A)'], - 'LM_EmmyCaveStartGoAwayHack': ['collision_camera_008 (A)'], - 'LM_EmmyDestroySearchLandmark01': ['collision_camera_017 (A)'], - 'LM_EmmyEntrancePoint_000': ['collision_camera_071 (A)'], - 'LM_EmmyEntrancePoint_001': ['collision_camera_009 (A)'], - 'LM_EmmyEntrancePoint_002': ['collision_camera_009 (A)'], - 'LM_EmmyEntrancePoint_003': ['collision_camera_051 (A)'], - 'LM_EmmyEntrancePoint_004': ['collision_camera_051 (A)'], - 'LM_EmmyEntrancePoint_005': ['collision_camera_010 (A)'], - 'LM_EmmyEntrancePoint_006': ['collision_camera_010 (A)'], - 'LM_EmmyEntrancePoint_008': ['collision_camera_061 (A)'], - 'LM_EmmyEntrancePoint_009': ['collision_camera_061 (A)'], - 'LM_EmmyEntrancePoint_010': ['collision_camera_010 (A)'], - 'LM_EmmyEntrancePoint_011': ['collision_camera_006 (A)'], - 'LM_EmmyEntrancePoint_012': ['collision_camera_006 (A)'], - 'LM_EmmyEntrancePoint_013': ['collision_camera_053 (A)'], - 'LM_EmmyGlobalSL_end_000A': ['collision_camera_048 (A)'], - 'LM_EmmyGlobalSL_end_000B': ['collision_camera_048 (A)'], - 'LM_EmmyGlobalSL_end_000C': ['collision_camera_051 (A)'], - 'LM_EmmyGlobalSL_end_003': ['collision_camera_017 (A)'], - 'LM_EmmyGlobalSL_end_003b': ['collision_camera_015 (A)'], - 'LM_EmmyGlobalSL_end_003c': ['collision_camera_017 (A)'], - 'LM_EmmyGlobalSL_start_000': ['collision_camera_048 (A)'], - 'LM_EmmyGlobalSL_start_001': ['collision_camera_048 (A)'], - 'LM_EmmyGlobalSL_start_002': ['collision_camera_051 (A)'], - 'LM_EmmyGlobalSL_start_003a': ['collision_camera_015 (A)'], - 'LM_EmmyGlobalSL_start_003b': ['collision_camera_017 (A)'], - 'LM_EmmyGrabOverride_000': ['collision_camera_071 (A)'], - 'LM_EmmyGrabOverride_001': ['collision_camera_071 (A)'], - 'LM_EmmyTunnelChaseLandmark01': ['collision_camera_015 (A)'], - 'LM_Emmy_WaterPlant': ['collision_camera_075 (A)'], - 'LM_EnterEmmyZoneSecondTime': ['collision_camera_006 (A)'], - 'LM_PROTOEMMY_AFTER_CU': ['collision_camera_016 (A)'], - 'LM_PROTOEMMY_AFTER_CU_001': ['collision_camera_064 (A)'], - 'LM_PROTOEMMY_AFTER_CU_002': ['collision_camera_064 (A)'], - 'LM_SamusPerceptionModifier_Focus': ['collision_camera_071 (A)'], - 'LM_SamusPerceptionPosition': ['collision_camera_015 (A)'], - 'LM_SamusPerceptionPosition_001': ['collision_camera_015 (A)'], - 'LM_SamusPerceptionPosition_002': ['collision_camera_048 (A)'], - 'LM_SamusPerceptionPosition_003': ['collision_camera_061 (A)'], - 'LM_SamusPerceptionPosition_004': ['collision_camera_015 (A)'], - 'LM_TutoFocus_EmmyNoFocusTutorialPoint': ['collision_camera_009 (A)'], - 'LM_TutoFocus_EmmyTPPoint': ['collision_camera_071 (A)'], - 'LS_CentralUnitArea': ['collision_camera_090 (A)'], - 'LS_ChangeCamera_003_B': ['collision_camera_003 (A)'], - 'LS_ChangeCamera_FX_01': ['collision_camera_048 (A)'], - 'LS_EMMYIMPASSABLE_01': ['collision_camera_075 (A)'], - 'LS_EMMYIMPASSABLE_02': ['collision_camera_075 (A)'], - 'LS_EMMYIMPASSABLE_03': ['collision_camera_075 (A)'], - 'LS_EMMYIMPASSABLE_04': ['collision_camera_075 (A)'], - 'LS_EMMYIMPASSABLE_05': ['collision_camera_010 (A)'], - 'LS_EMMYIMPASSABLE_06': ['collision_camera_048 (A)', 'collision_camera_051 (A)'], - 'LS_EMMYIMPASSABLE_07': ['collision_camera_048 (A)'], - 'LS_EMMYIMPASSABLE_09': ['collision_camera_009 (A)'], - 'LS_EMMYIMPASSABLE_10': ['collision_camera_009 (A)'], - 'LS_EMMYIMPASSABLE_11': ['collision_camera_009 (A)'], - 'LS_EMMYIMPASSABLE_12': ['collision_camera_009 (A)'], - 'LS_EMMYIMPASSABLE_13': ['collision_camera_009 (A)'], - 'LS_EMMYIMPASSABLE_14': ['collision_camera_008 (A)'], - 'LS_EMMYIMPASSABLE_16': ['collision_camera_006 (A)'], - 'LS_EMMYIMPASSABLE_17': ['collision_camera_006 (A)'], - 'LS_EMMYIMPASSABLE_18': ['collision_camera_005 (A)'], - 'LS_EMMYIMPASSABLE_19': ['collision_camera_049 (A)'], - 'LS_EMMYIMPASSABLE_20': ['collision_camera_049 (A)'], - 'LS_EMMYIMPASSABLE_22': ['collision_camera_015 (A)'], - 'LS_EMMYIMPASSABLE_23': ['collision_camera_015 (A)'], - 'LS_EMMYIMPASSABLE_24': ['collision_camera_015 (A)'], - 'LS_EMMYIMPASSABLE_25': ['collision_camera_015 (A)'], - 'LS_EMMYIMPASSABLE_26': ['collision_camera_015 (A)'], - 'LS_EMMYIMPASSABLE_27': ['collision_camera_015 (A)'], - 'LS_EMMYIMPASSABLE_28': ['collision_camera_008 (A)'], - 'LS_EMMYIMPASSABLE_29': ['collision_camera_071 (A)'], - 'LS_EMMYIMPASSABLE_30': ['collision_camera_008 (A)'], - 'LS_EMMYIMPASSABLE_32': ['collision_camera_008 (A)'], - 'LS_EMMYIMPASSABLE_33': ['collision_camera_069 (A)'], - 'LS_EMMYIMPASSABLE_34': ['collision_camera_010 (A)'], - 'LS_EMMYIMPASSABLE_35': ['collision_camera_006 (A)'], - 'LS_EMMYIMPASSABLE_36': ['collision_camera_008 (A)'], - 'LS_EMMYIMPASSABLE_37': ['collision_camera_051 (A)'], - 'LS_EMMYIMPASSABLE_38': ['collision_camera_017 (A)'], - 'LS_EMMYIMPASSABLE_39': ['collision_camera_010 (A)'], - 'LS_EMMYIMPASSABLE_40': ['collision_camera_048 (A)'], - 'LS_EMMYIMPASSABLE_41': ['collision_camera_010 (A)'], - 'LS_EMMYIMPASSABLE_42': ['collision_camera_010 (A)'], - 'LS_EMMYIMPASSABLE_43': ['collision_camera_049 (A)'], - 'LS_EMMYIMPASSABLE_44': ['collision_camera_009 (A)'], - 'LS_EMMYIMPASSABLE_45': ['collision_camera_005 (A)', 'collision_camera_018 (A)'], - 'LS_EMMYIMPASSABLE_46': ['collision_camera_071 (A)'], - 'LS_EMMYIMPASSABLE_47': ['collision_camera_005 (A)'], - 'LS_EMMYIMPASSABLE_48': ['collision_camera_048 (A)', 'collision_camera_051 (A)'], - 'LS_EmmyCavePresentationForbiddenEdges': ['collision_camera_006 (A)'], - 'LS_EmmyEndStagger_000': ['collision_camera_008 (A)'], - 'LS_EmmyGlobalGL_emmy_003a': ['collision_camera_015 (A)'], - 'LS_EmmyGlobalSL_000': ['collision_camera_009 (A)'], - 'LS_EmmyGlobalSL_001': ['collision_camera_048 (A)'], - 'LS_EmmyGlobalSL_002': [], - 'LS_EmmyGlobalSL_edges_000': ['collision_camera_048 (A)'], - 'LS_EmmyGlobalSL_emmy_000': ['collision_camera_048 (A)'], - 'LS_EmmyGlobalSL_emmy_003b': ['collision_camera_015 (A)'], - 'LS_EmmyGlobalSL_forbidden_000': ['collision_camera_048 (A)'], - 'LS_EmmyGlobalSL_samus_000': ['collision_camera_048 (A)'], - 'LS_EmmyGrabOverride_000': ['collision_camera_071 (A)'], - 'LS_EmmyGrabOverride_001': ['collision_camera_071 (A)'], - 'LS_EmmyProtoZone': ['collision_camera_064 (A)'], - 'LS_EmmyZone': ['collision_camera_005 (A)'], - 'LS_IMPASSABLE_PROTO01': ['collision_camera_016 (A)'], - 'LS_PATROLEMMYACTIVATOR_01': ['collision_camera_005 (A)'], - 'LS_PATROLEMMYACTIVATOR_02': ['collision_camera_005 (A)'], - 'LS_PATROLEMMYACTIVATOR_03': ['collision_camera_006 (A)'], - 'LS_PATROLEMMYACTIVATOR_04': ['collision_camera_006 (A)'], - 'LS_PATROLEMMYACTIVATOR_05': ['collision_camera_008 (A)'], - 'LS_PATROLEMMYACTIVATOR_06': ['collision_camera_008 (A)'], - 'LS_PATROLEMMYACTIVATOR_07': ['collision_camera_009 (A)'], - 'LS_PATROLEMMYACTIVATOR_08': ['collision_camera_048 (A)'], - 'LS_PATROLEMMYACTIVATOR_09': ['collision_camera_051 (A)'], - 'LS_PATROLEMMYACTIVATOR_10': ['collision_camera_075 (A)'], - 'LS_PATROLEMMYACTIVATOR_11': ['collision_camera_010 (A)'], - 'LS_PATROLEMMYACTIVATOR_12': ['collision_camera_015 (A)'], - 'LS_PATROLEMMYACTIVATOR_13': ['collision_camera_017 (A)'], - 'LS_PATROLEMMYACTIVATOR_14': ['collision_camera_017 (A)'], - 'LS_PATROLEMMYACTIVATOR_15': ['collision_camera_017 (A)'], - 'LS_PATROLEMMY_01': ['collision_camera_005 (A)'], - 'LS_PATROLEMMY_02': ['collision_camera_005 (A)'], - 'LS_PATROLEMMY_03': ['collision_camera_005 (A)'], - 'LS_PATROLEMMY_04': ['collision_camera_006 (A)'], - 'LS_PATROLEMMY_05': ['collision_camera_006 (A)'], - 'LS_PATROLEMMY_06': ['collision_camera_008 (A)'], - 'LS_PATROLEMMY_07': ['collision_camera_070 (A)'], - 'LS_PATROLEMMY_08': ['collision_camera_048 (A)'], - 'LS_PATROLEMMY_09': ['collision_camera_051 (A)'], - 'LS_PATROLEMMY_10': ['collision_camera_075 (A)'], - 'LS_PATROLEMMY_11': [], - 'LS_PATROLEMMY_12': ['collision_camera_010 (A)'], - 'LS_PATROLEMMY_13': ['collision_camera_017 (A)'], - 'LS_PATROLEMMY_14': ['collision_camera_017 (A)'], - 'LS_PATROLEMMY_15': ['collision_camera_017 (A)'], - 'LS_PATROLTUTOFOCUS': ['collision_camera_008 (A)'], - 'LS_RinkaLifeArea_000': ['collision_camera_090 (A)'], - 'LS_ToAvoidCornerReposition_000': ['collision_camera_051 (A)'], - 'LS_ToAvoidCornerReposition_001': ['collision_camera_017 (A)'], - 'MapOptionsTutoTriggerEnter': [], - 'MapOptionsTutoTriggerExit': [], - 'MapRoomTutoTriggerEnter': ['collision_camera_058 (A)'], - 'MapRoomTutoTriggerExit': [], - 'MeleeTutoTriggerEnter': ['collision_camera_003 (A)'], - 'MeleeTutoTriggerEnter_002': ['collision_camera_003 (A)'], - 'MeleeTutoTriggerEnter_003': ['collision_camera_003 (A)'], - 'MeleeTutoTriggerExit': ['collision_camera_003 (A)'], - 'MeleeTutoTriggerExit_002': ['collision_camera_003 (A)'], - 'MeleeTutoTriggerExit_003': ['collision_camera_003 (A)'], - 'MissileTutoObserver': ['collision_camera_000 (A)'], - 'MissileTutoTriggerEnter': ['collision_camera_000 (A)'], - 'MissileTutoTriggerExit': ['collision_camera_000 (A)'], - 'PRP_CV_AccessPoint001': ['collision_camera_068 (A)'], - 'PRP_CV_AccessPoint001_WeightPlate': ['collision_camera_068 (A)'], - 'PRP_CV_AccessPoint002': ['collision_camera_065 (A)'], - 'PRP_CV_AccessPoint002_WeightPlate': ['collision_camera_065 (A)'], - 'PRP_CV_AmmoStation001': ['collision_camera_000 (A)'], - 'PRP_CV_AmmoStation001_WeightPlate': ['collision_camera_000 (A)'], - 'PRP_CV_CentralUnitCaves': ['collision_camera_090 (A)'], - 'PRP_CV_CentralUnitProto': ['collision_camera_074 (A)'], - 'PRP_CV_EnergyStation001': ['collision_camera_054 (A)'], - 'PRP_CV_EnergyStation001_WeightPlate': ['collision_camera_054 (A)'], - 'PRP_CV_EnergyStation002': ['collision_camera_011 (A)'], - 'PRP_CV_EnergyStation002_WeightPlate': ['collision_camera_011 (A)'], - 'PRP_CV_MapStation001': ['collision_camera_058 (A)'], - 'PRP_CV_MapStation001_WeightPlate': ['collision_camera_058 (A)'], - 'PRP_CV_PlatformCaveWaterWeightPlate': ['collision_camera_010 (A)'], - 'PRP_CV_PlatformCaveWater_B': ['collision_camera_010 (A)'], - 'PRP_CV_PlatformMagnet3Left': ['collision_camera_005 (A)'], - 'PRP_CV_PlatformMagnet4Down': ['collision_camera_015 (A)'], - 'PRP_CV_PlatformMagnet5Down': ['collision_camera_006 (A)'], - 'PRP_CV_SaveStation001': ['collision_camera_063 (A)'], - 'PRP_CV_SaveStation001_WeightPlate': ['collision_camera_063 (A)'], - 'PRP_CV_SaveStation002': ['collision_camera_025 (A)'], - 'PRP_CV_SaveStation002_WeightPlate': ['collision_camera_025 (A)'], - 'PRP_CV_SaveStation003': ['collision_camera_012 (A)'], - 'PRP_CV_SaveStation003_WeightPlate': ['collision_camera_012 (A)'], - 'PRP_CV_SaveStation004': ['collision_camera_076 (A)'], - 'PRP_CV_SaveStation004_WeightPlate': ['collision_camera_076 (A)'], - 'PRP_CV_ThermalDevice': ['collision_camera_067 (A)'], - 'PRP_CV_ThermalDevice_WeightPlate': ['collision_camera_067 (A)'], - 'PRP_CV_watercave01a': ['collision_camera_004 (A)'], - 'PRP_CV_watercave01b': ['collision_camera_004 (A)'], - 'PRP_CV_watercave02': [], - 'PRP_CV_watercave05': ['collision_camera_000 (A)'], - 'PRP_CV_watercave07': ['collision_camera_004 (A)'], - 'PRP_CV_watercave08a': ['collision_camera_057 (A)'], - 'PRP_CV_watercave08b': ['collision_camera_060 (A)'], - 'PRP_CV_watercave09': ['collision_camera_011 (A)'], - 'PRP_CV_watercave10': ['collision_camera_054 (A)'], - 'PRP_CV_watercave10_001': ['collision_camera_054 (A)'], - 'PRP_DB_CV_000': ['collision_camera_048 (A)'], - 'PRP_DB_CV_002': ['collision_camera_006 (A)'], - 'PRP_DB_CV_003': ['collision_camera_004 (A)'], - 'PRP_DB_CV_006': ['collision_camera_000 (A)'], - 'PRP_DB_CV_007': ['collision_camera_022 (A)'], - 'PRP_DB_CV_008': ['collision_camera_060 (A)'], - 'PRP_DB_CV_010': ['collision_camera_013 (A)'], - 'PRP_DB_CV_014': ['collision_camera_003 (A)'], - 'PRP_DB_CV_020': ['collision_camera_004 (A)'], - 'PRP_TotalR_000': ['collision_camera_081 (A)'], - 'PRP_TotalR_001': ['collision_camera_070 (A)'], - 'PRP_TotalR_Platform_000': ['collision_camera_081 (A)'], - 'PRP_TotalR_Platform_001': ['collision_camera_070 (A)'], - 'ProtoEmmyTrigger': ['collision_camera_016 (A)'], - 'SG_Cave_Cannons': ['collision_camera_090 (A)'], - 'SPBCentralUnitTutoTrigger': [], - 'SPRTutoTrigger_000': ['collision_camera_074 (A)'], - 'SP_Cave_CUCannon_000': ['collision_camera_090 (A)'], - 'SP_Checkpoint_AccessPoint_002': ['collision_camera_050 (A)'], - 'SP_Checkpoint_AccessPoint_1B': ['collision_camera_000 (A)'], - 'SP_Checkpoint_AccessPoint_2B': ['collision_camera_021 (A)'], - 'SP_Checkpoint_CURoom': ['collision_camera_074 (A)'], - 'SP_Checkpoint_CentralUnit': ['collision_camera_049 (A)'], - 'SP_Checkpoint_ChainReaction': ['collision_camera_026 (A)'], - 'SP_Checkpoint_ChargeBeam': ['collision_camera_014 (A)'], - 'SP_Checkpoint_ChozoWarriorCave': ['collision_camera_082 (A)'], - 'SP_Checkpoint_Cooldown': ['collision_camera_081 (A)'], - 'SP_Checkpoint_Dead_ChozoWarriorX': ['collision_camera_091 (A)'], - 'SP_Checkpoint_EmmyCave': ['collision_camera_005 (A)'], - 'SP_Checkpoint_EmmyCavePhase2': ['collision_camera_090 (A)'], - 'SP_Checkpoint_Grapple': ['collision_camera_033 (A)'], - 'SP_Checkpoint_MagnetGlove': ['collision_camera_017 (A)'], - 'SP_Checkpoint_OpticalCamo': ['collision_camera_020 (A)'], - 'SP_Checkpoint_Post_ChainReaction': ['collision_camera_030 (A)'], - 'SP_Checkpoint_Pre_ChozoWarriorX': ['collision_camera_056 (A)'], - 'SP_Checkpoint_ProtoEmmy': ['collision_camera_003 (A)'], - 'SP_Checkpoint_Scorpius': ['collision_camera_072 (A)'], - 'SP_Checkpoint_ScrewAttack': ['collision_camera_081 (A)'], - 'SP_Checkpoint_ThermalDevice': ['collision_camera_067 (A)'], - 'SP_Checkpoint_VariaSuit': ['collision_camera_031 (A)'], - 'SP_Checkpoint_WaterValve': ['collision_camera_060 (A)'], - 'SP_Emmy': ['collision_camera_006 (A)'], - 'SP_EmmyProto': ['collision_camera_016 (A)'], - 'SlideTutoTriggerEnter': ['collision_camera_000 (A)'], - 'SlideTutoTriggerExit': ['collision_camera_000 (A)'], - 'StartPoint0': ['collision_camera_000_Init (A)'], - 'TG_ChainReaction_001': ['collision_camera_026 (A)'], - 'TG_ChainReaction_002': ['collision_camera_026 (A)'], - 'TG_ChainReaction_003': ['collision_camera_026 (A)'], - 'TG_ChainReaction_BigExplosion': ['collision_camera_030 (A)'], - 'TG_ChainReaction_Camera_000': ['collision_camera_026 (A)'], - 'TG_ChainReaction_Camera_001': ['collision_camera_026 (A)'], - 'TG_ChainReaction_Camera_002': ['collision_camera_026 (A)'], - 'TG_ChainReaction_Camera_003': ['collision_camera_026 (A)'], - 'TG_ChainReaction_Camera_004': ['collision_camera_026 (A)'], - 'TG_ChainReaction_Camera_005': ['collision_camera_026 (A)'], - 'TG_ChainReaction_Camera_006': ['collision_camera_030 (A)'], - 'TG_ChainReaction_ChangeFinalSetup': ['collision_camera_030 (A)'], - 'TG_ChainReaction_SteamJet_001': ['collision_camera_026 (A)'], - 'TG_ChainReaction_SteamJet_002': ['collision_camera_026 (A)'], - 'TG_ChainReaction_SteamJet_003': ['collision_camera_026 (A)'], - 'TG_ChainReaction_SteamJet_004': ['collision_camera_026 (A)'], - 'TG_ChainReaction_SteamJet_005': ['collision_camera_026 (A)'], - 'TG_ChainReaction_SteamJet_006': ['collision_camera_026 (A)'], - 'TG_ChainReaction_SteamJet_007': ['collision_camera_026 (A)'], - 'TG_ChainReaction_SteamJet_008': ['collision_camera_026 (A)'], - 'TG_ChainReaction_SteamJet_009': ['collision_camera_026 (A)'], - 'TG_ChainReaction_SteamJet_010': ['collision_camera_026 (A)'], - 'TG_ChainReaction_SteamJet_011': ['collision_camera_026 (A)'], - 'TG_ChainReaction_SteamJet_012': ['collision_camera_026 (A)'], - 'TG_ChainReaction_SteamJet_013': ['collision_camera_026 (A)'], - 'TG_ChainReaction_SteamJet_014': ['collision_camera_026 (A)'], - 'TG_ChainReaction_SteamJet_015': ['collision_camera_026 (A)'], - 'TG_ChainReaction_SteamJet_016': ['collision_camera_026 (A)'], - 'TG_ChainReaction_SteamJet_017': ['collision_camera_026 (A)'], - 'TG_ChainReaction_SteamJet_018': ['collision_camera_026 (A)'], - 'TG_ChainReaction_SteamJet_019': ['collision_camera_026 (A)'], - 'TG_ChainReaction_SteamJet_020': ['collision_camera_026 (A)'], - 'TG_ChangeCamera_003_B': ['collision_camera_003 (A)'], - 'TG_ChangeCamera_003_C': ['collision_camera_003 (A)'], - 'TG_ChangeCamera_015_B': ['collision_camera_015 (A)'], - 'TG_ChangeCamera_023_B': ['collision_camera_023_B (A)'], - 'TG_ChangeCamera_031_B': ['collision_camera_031 (A)'], - 'TG_ChangeCamera_048_B': ['collision_camera_048 (A)'], - 'TG_ChangeCamera_048_C': ['collision_camera_048 (A)'], - 'TG_ChangeCamera_050_B': ['collision_camera_050 (A)'], - 'TG_ChangeCamera_056_B': ['collision_camera_056 (A)'], - 'TG_ChangeCamera_056_C': ['collision_camera_056 (A)'], - 'TG_ChangeCamera_064B': ['collision_camera_064 (A)'], - 'TG_ChangeCamera_091_B': ['collision_camera_091 (A)'], - 'TG_ChangeCamera_FX_01': ['collision_camera_048 (A)'], - 'TG_DisableCamera_048': ['collision_camera_010 (A)', 'collision_camera_051 (A)'], - 'TG_EmmyCavePresentationForbiddenEdges': ['collision_camera_006 (A)'], - 'TG_EmmyCavePresentationForbiddenEdgesEnd': ['collision_camera_006 (A)'], - 'TG_EmmyCaveSnapshot': ['collision_camera_049 (A)'], - 'TG_EmmyCaveStartVisualConeHack': ['collision_camera_071 (A)'], - 'TG_EmmyEndStagger_000': ['collision_camera_008 (A)'], - 'TG_EmmyGrabOverride_000': ['collision_camera_071 (A)'], - 'TG_EmmyGrabOverride_001': ['collision_camera_071 (A)'], - 'TG_EmmyPerceptionModifier': ['collision_camera_015 (A)'], - 'TG_EmmyPerceptionModifier_001': ['collision_camera_015 (A)'], - 'TG_EmmyPerceptionModifier_002': ['collision_camera_048 (A)'], - 'TG_EmmyPerceptionModifier_003': ['collision_camera_010 (A)'], - 'TG_EmmyPerceptionModifier_004': ['collision_camera_015 (A)'], - 'TG_EmmyPerceptionModifier_Focus': ['collision_camera_008 (A)'], - 'TG_EmmySpawnSequence_Samus': ['collision_camera_006 (A)'], - 'TG_EmmyTunnelChaseDeviation': ['collision_camera_015 (A)'], - 'TG_IgnoreFloorSlideUpperBodySubmerged': ['collision_camera_004 (A)'], - 'TG_MusicChange_ScrewAttack_StatueRoom': ['collision_camera_081 (A)'], - 'TG_PATROLEMMYACTIVATOR_01': ['collision_camera_005 (A)'], - 'TG_PATROLEMMYACTIVATOR_02': ['collision_camera_005 (A)'], - 'TG_PATROLEMMYACTIVATOR_03': ['collision_camera_006 (A)'], - 'TG_PATROLEMMYACTIVATOR_04': ['collision_camera_006 (A)'], - 'TG_PATROLEMMYACTIVATOR_05': ['collision_camera_008 (A)'], - 'TG_PATROLEMMYACTIVATOR_06': ['collision_camera_070 (A)'], - 'TG_PATROLEMMYACTIVATOR_07': ['collision_camera_009 (A)'], - 'TG_PATROLEMMYACTIVATOR_08': ['collision_camera_048 (A)'], - 'TG_PATROLEMMYACTIVATOR_09': ['collision_camera_011 (A)'], - 'TG_PATROLEMMYACTIVATOR_10': ['collision_camera_060 (A)'], - 'TG_PATROLEMMYACTIVATOR_11': ['collision_camera_010 (A)'], - 'TG_PATROLEMMYACTIVATOR_12': ['collision_camera_015 (A)'], - 'TG_PATROLEMMYACTIVATOR_13': ['collision_camera_017 (A)'], - 'TG_PATROLEMMYACTIVATOR_14': ['collision_camera_017 (A)'], - 'TG_PATROLEMMYACTIVATOR_15': ['collision_camera_049 (A)'], - 'TG_PROTOEMMY_ACTIVATE': ['collision_camera_064 (A)'], - 'TG_PROTOEMMY_ACTIVATE_TIMER': ['collision_camera_064 (A)'], - 'TG_PROTOEMMY_BEHAVIOR': ['collision_camera_064 (A)'], - 'TG_PROTOEMMY_BEHAVIOR_001': ['collision_camera_064 (A)'], - 'TG_PROTOEMMY_BEHAVIOR_002': ['collision_camera_064 (A)'], - 'TG_PROTOEMMY_BEHAVIOR_003': ['collision_camera_064 (A)'], - 'TG_Snapshot_Checkpoint_EmmyCave': ['collision_camera_006 (A)'], - 'TG_StartCUCombat_001': ['collision_camera_090 (A)'], - 'TG_TutoFocus_Caves': ['collision_camera_050 (A)'], - 'TG_TutoFocus_Caves_001': ['collision_camera_009 (A)'], - 'TG_WaterValve_Tuto': ['collision_camera_075 (A)'], - 'Watervalve_fillmap': ['collision_camera_010 (A)'], - 'block_slide_reg_001': ['collision_camera_048 (A)'], - 'box_grapple_cv_001': ['collision_camera_033 (A)'], - 'box_weight_cv_001': ['collision_camera_069 (A)'], - 'box_weight_cv_001_col': ['collision_camera_069 (A)'], - 'box_wide_cv_001': ['collision_camera_069 (A)'], - 'breakablecave016': ['collision_camera_070 (A)'], - 'breakablecave017': ['collision_camera_070 (A)'], - 'breakablecave019': ['collision_camera_081 (A)'], - 'breakablehint_000': ['collision_camera_009 (A)'], - 'breakablehint_001': ['collision_camera_016 (A)'], - 'breakablehint_002': ['collision_camera_011 (A)'], - 'breakablehint_003': ['collision_camera_067 (A)'], - 'breakablehint_004': ['collision_camera_081 (A)'], - 'breakablehint_005': ['collision_camera_062 (A)'], - 'breakablehint_006': ['collision_camera_051 (A)'], - 'breakablehint_007': ['collision_camera_003 (A)'], - 'burnertrapcav01': ['collision_camera_023_B (A)'], - 'burnertrapcav01_000': ['collision_camera_023_B (A)'], - 'camRail_PreChain': ['collision_camera_026 (A)'], - 'camRail_mbTunnel': ['collision_camera_055 (A)'], - 'camerarailpath_MagmaCorridor': ['collision_camera_023 (A)'], - 'centralunitcave_000': ['collision_camera_090 (A)'], - 'db_dif_cv_002': ['collision_camera_056 (A)'], - 'db_reg_cv_021': ['collision_camera_022 (A)'], - 'db_reg_cv_022': ['collision_camera_011 (A)'], - 'db_reg_cv_023': ['collision_camera_011 (A)'], - 'door_frblack_gen_003': ['collision_camera_017 (A)', 'collision_camera_049 (A)'], - 'door_frblack_gen_004': ['collision_camera_017 (A)', 'collision_camera_049 (A)'], - 'door_frblack_gen_005': ['collision_camera_049 (A)'], - 'door_frblack_gen_006': ['collision_camera_015 (A)', 'collision_camera_017 (A)'], - 'door_frblack_gen_007': ['collision_camera_015 (A)'], - 'door_frblack_gen_008': ['collision_camera_017 (A)', 'collision_camera_049 (A)'], - 'door_frblack_gen_009': ['collision_camera_017 (A)', 'collision_camera_049 (A)'], - 'door_frblack_gen_010': ['collision_camera_017 (A)'], - 'door_frblack_gen_011': ['collision_camera_015 (A)', 'collision_camera_017 (A)'], - 'door_frblack_protoemmy': ['collision_camera_016 (A)', 'collision_camera_064 (A)'], - 'door_frblack_protoemmy_000': ['collision_camera_016 (A)', - 'collision_camera_064 (A)'], - 'door_frblack_protoemmy_001': ['collision_camera_064 (A)', - 'collision_camera_074 (A)'], - 'door_shield_plasma_000': ['collision_camera_081 (A)', 'collision_camera_085 (A)'], - 'door_shield_plasma_001': ['collision_camera_082 (A)'], - 'door_shield_plasma_002': ['collision_camera_082 (A)'], - 'door_shield_plasma_003': ['collision_camera_081 (A)', 'collision_camera_085 (A)'], - 'doorclosedgrapple_000': ['collision_camera_033 (A)', 'collision_camera_089 (A)'], - 'doorclosedpower_000': ['collision_camera_010 (A)', 'collision_camera_051 (A)'], - 'doorgrapplegrapple': ['collision_camera_081 (A)', 'collision_camera_082 (A)'], - 'doorpresenceframe_000': ['collision_camera_022 (A)', 'collision_camera_050 (A)'], - 'doorpresenceframe_001': ['collision_camera_024 (A)', 'collision_camera_079 (A)'], - 'doorshieldsupermissile_000': ['collision_camera_011 (A)', - 'collision_camera_055 (A)'], - 'doorshutter_000': ['collision_camera_030 (A)'], - 'doorwavebeam_000': ['collision_camera_010 (A)', 'collision_camera_051 (A)'], - 'doorwidebeam_000': ['collision_camera_008 (A)', 'collision_camera_009 (A)'], - 'elevator_aqua_000_platform': ['collision_camera_080 (A)'], - 'elevator_aqua_000_platform_frozen': ['collision_camera_080 (A)'], - 'elevator_baselab_000': ['collision_camera_034 (A)'], - 'elevator_baselab_000_platform': ['collision_camera_034 (A)'], - 'elevator_with_cutscene_aqua_000': ['collision_camera_080 (A)'], - 'env_frozen_gen_001_000': ['collision_camera_091 (A)'], - 'env_frozen_gen_001_001': ['collision_camera_062 (A)'], - 'env_frozen_gen_001_002': ['collision_camera_082 (A)'], - 'env_heat_gen_001_001': ['collision_camera_023_B (A)'], - 'env_heat_gen_001_002': ['collision_camera_078 (A)'], - 'env_heat_gen_001_003': ['collision_camera_028 (A)'], - 'env_heat_gen_001_004': ['collision_camera_029 (A)'], - 'env_heat_gen_001_CR_001': ['collision_camera_026 (A)'], - 'env_heat_gen_001_CR_002': ['collision_camera_026 (A)'], - 'env_heat_gen_001_CR_003': ['collision_camera_026 (A)'], - 'env_heat_gen_001_CR_004': ['collision_camera_026 (A)'], - 'env_heat_gen_001_CR_005': ['collision_camera_026 (A)'], - 'env_heat_gen_001_CR_END': ['collision_camera_026 (A)'], - 'ev_chainreaction_cv_001': ['collision_camera_026 (A)'], - 'ev_chainreaction_cv_001_a': ['collision_camera_026 (A)'], - 'ev_chainreaction_cv_001_b': ['collision_camera_011 (A)'], - 'ev_chainreaction_cv_002': ['collision_camera_026 (A)'], - 'ev_chainreaction_cv_003': ['collision_camera_026 (A)'], - 'ev_chainreaction_cv_004': ['collision_camera_026 (A)'], - 'ev_chainreaction_cv_004_a': ['collision_camera_026 (A)'], - 'ev_chainreaction_cv_005': ['collision_camera_026 (A)'], - 'ev_chainreaction_cv_006': ['collision_camera_026 (A)'], - 'ev_chainreaction_cv_007': ['collision_camera_011 (A)'], - 'ev_chainreaction_cv_009': ['collision_camera_011 (A)'], - 'ev_chainreaction_cv_009_B': ['collision_camera_011 (A)'], - 'ev_chainreaction_cv_010': ['collision_camera_028 (A)'], - 'ev_chainreaction_cv_010_b': ['collision_camera_028 (A)'], - 'ev_chainreaction_cv_012': ['collision_camera_011 (A)'], - 'ev_chainreaction_cv_fx_000': ['collision_camera_026 (A)'], - 'ev_chainreaction_cv_fx_001': ['collision_camera_026 (A)'], - 'ev_chainreaction_cv_fx_002': ['collision_camera_026 (A)'], - 'ev_chainreaction_cv_fx_003': ['collision_camera_026 (A)'], - 'ev_chainreaction_cv_fx_004': ['collision_camera_026 (A)'], - 'ev_chainreaction_cv_fx_005': ['collision_camera_026 (A)'], - 'ev_chainreaction_cv_fx_006': ['collision_camera_026 (A)'], - 'ev_chainreaction_cv_fx_007': ['collision_camera_026 (A)'], - 'ev_chainreaction_cv_fx_008': ['collision_camera_026 (A)'], - 'ev_chainreaction_cv_fx_009': ['collision_camera_026 (A)'], - 'ev_chainreaction_cv_fx_010': ['collision_camera_026 (A)'], - 'ev_chainreaction_cv_fx_011': ['collision_camera_026 (A)'], - 'ev_chainreaction_cv_fx_012': ['collision_camera_026 (A)'], - 'ev_chainreaction_cv_fx_013': ['collision_camera_026 (A)'], - 'ev_chainreaction_cv_fx_014': ['collision_camera_026 (A)'], - 'ev_chainreaction_cv_fx_015': ['collision_camera_026 (A)'], - 'ev_chainreaction_cv_fx_016': ['collision_camera_026 (A)'], - 'ev_chainreaction_cv_fx_018': ['collision_camera_026 (A)'], - 'ev_chainreaction_deviceheat': ['collision_camera_026 (A)'], - 'ev_chainreaction_weightactivatedplatform': ['collision_camera_026 (A)'], - 'ev_entercu_cv_001': ['collision_camera_049 (A)'], - 'ev_piston_cv_002': ['collision_camera_017 (A)'], - 'ev_protoemmy_chasemusic': ['collision_camera_064 (A)'], - 'footstepplatform_000': ['collision_camera_030 (A)'], - 'fx_cold_door': ['collision_camera_013 (A)', 'collision_camera_062 (A)'], - 'fx_cold_door_000': ['collision_camera_062 (A)', 'collision_camera_086 (A)'], - 'fx_cold_door_001': ['collision_camera_086 (A)', 'collision_camera_091 (A)'], - 'fx_cold_door_002': ['collision_camera_081 (A)', 'collision_camera_082 (A)'], - 'fx_heat_door': ['collision_camera_028 (A)'], - 'fx_heat_door_000': ['collision_camera_026 (A)', 'collision_camera_028 (A)'], - 'fx_heat_door_001': ['collision_camera_029 (A)', 'collision_camera_031 (A)'], - 'fx_heat_door_002': ['collision_camera_024 (A)', 'collision_camera_078 (A)'], - 'fx_heat_door_003': ['collision_camera_023_B (A)', 'collision_camera_024 (A)'], - 'fx_heat_door_004': ['collision_camera_077 (A)', 'collision_camera_078 (A)'], - 'fx_heat_door_005': ['collision_camera_026 (A)', 'collision_camera_055 (A)'], - 'fx_heat_tunnel_000': ['collision_camera_026 (A)'], - 'fxsmokepipesyellowadorn01_000': ['collision_camera_016 (A)'], - 'fxsmokepipesyellowadorn01_012': ['collision_camera_016 (A)'], - 'fxsmokepipesyellowadorn01_013': ['collision_camera_016 (A)'], - 'fxsmokepipesyellowadorn01_014': ['collision_camera_016 (A)'], - 'fxsmokepipesyellowadorn01_015': ['collision_camera_016 (A)'], - 'grapplepulloff1x2_001': ['collision_camera_081 (A)'], - 'grapplepulloff1x2_002': ['collision_camera_030 (A)'], - 'grappleswingpoint_000': ['collision_camera_089 (A)'], - 'heatroomfx_001_01': ['collision_camera_026 (A)'], - 'heatroomfx_001_02': ['collision_camera_026 (A)'], - 'heatroomfx_001_03': ['collision_camera_026 (A)'], - 'heatroomfx_001_04': ['collision_camera_026 (A)'], - 'heatroomfx_001_05': ['collision_camera_026 (A)'], - 'heatroomfx_001_06': ['collision_camera_026 (A)'], - 'heatroomfx_002_01': ['collision_camera_026 (A)'], - 'heatroomfx_002_02': ['collision_camera_026 (A)'], - 'heatroomfx_002_03': ['collision_camera_026 (A)'], - 'heatroomfx_003_01': ['collision_camera_026 (A)'], - 'heatroomfx_003_02': ['collision_camera_026 (A)'], - 'heatroomfx_003_03': ['collision_camera_026 (A)'], - 'heatroomfx_003_04': ['collision_camera_026 (A)'], - 'heatroomfx_003_05': ['collision_camera_026 (A)'], - 'heatroomfx_003_06': ['collision_camera_026 (A)'], - 'heatroomfx_004_01': ['collision_camera_026 (A)'], - 'heatroomfx_004_02': ['collision_camera_026 (A)'], - 'heatroomfx_004_03': ['collision_camera_026 (A)'], - 'heatroomfx_004_04': ['collision_camera_026 (A)'], - 'heatroomfx_004_05': ['collision_camera_026 (A)'], - 'heatroomfx_005_01': ['collision_camera_026 (A)'], - 'heatroomfx_005_02': ['collision_camera_026 (A)'], - 'heatroomfx_005_03': ['collision_camera_026 (A)'], - 'heatroomfx_005_04': ['collision_camera_026 (A)'], - 'heatroomfx_END_01': ['collision_camera_026 (A)'], - 'heatroomfx_END_02': ['collision_camera_026 (A)'], - 'instancefx_036': ['collision_camera_060 (A)'], - 'instancefx_037': ['collision_camera_060 (A)'], - 'instancefx_038': ['collision_camera_060 (A)'], - 'item_energyfragment_000': ['collision_camera_086 (A)'], - 'item_energyfragment_001': ['collision_camera_056 (A)'], - 'item_energytank_000': ['collision_camera_030 (A)'], - 'item_missiletank_000': ['collision_camera_050 (A)'], - 'item_missiletank_001': ['collision_camera_009 (A)'], - 'item_missiletank_002': ['collision_camera_081 (A)'], - 'item_missiletank_003': ['collision_camera_011 (A)'], - 'item_missiletank_004': ['collision_camera_051 (A)'], - 'item_missiletank_005': ['collision_camera_003 (A)'], - 'item_missiletank_006': ['collision_camera_080 (A)'], - 'item_missiletankplus_000': ['collision_camera_086 (A)'], - 'item_missiletankplus_001': ['collision_camera_029 (A)'], - 'item_powerbombtank_000': ['collision_camera_010 (A)'], - 'lavazone_001': [], - 'lavazone_002': ['collision_camera_028 (A)'], - 'lavazone_003': ['collision_camera_023_B (A)'], - 'logicactiontrigger_000': ['collision_camera_064 (A)'], - 'logicactiontrigger_001': [], - 'platformtrapgrapple5right': ['collision_camera_015 (A)'], - 'rail_magnet_PlatformMagnet3Left': ['collision_camera_005 (A)'], - 'rail_magnet_PlatformMagnet4Down': ['collision_camera_015 (A)'], - 'rail_magnet_PlatformMagnet5Down': ['collision_camera_006 (A)'], - 'spawnpointrinka_000': ['collision_camera_090 (A)'], - 'spawnpointrinka_001': ['collision_camera_090 (A)'], - 'spraypipe_cave': ['collision_camera_056 (A)'], - 'steammag01_005': ['collision_camera_077 (A)'], - 'steammag01_006': ['collision_camera_077 (A)'], - 'steammag01_007': ['collision_camera_077 (A)'], - 'steammag01_008': ['collision_camera_077 (A)'], - 'steammag01_009': ['collision_camera_077 (A)'], - 'steammag01_chainreaction_001': ['collision_camera_026 (A)'], - 'steammag01_chainreaction_002': ['collision_camera_026 (A)'], - 'steammag01_chainreaction_003': ['collision_camera_026 (A)'], - 'steammag01_chainreaction_004': ['collision_camera_026 (A)'], - 'steammag01_chainreaction_005': ['collision_camera_026 (A)'], - 'steammag01_chainreaction_006': ['collision_camera_026 (A)'], - 'steammag01_chainreaction_007': ['collision_camera_026 (A)'], - 'steammag01_chainreaction_008': ['collision_camera_026 (A)'], - 'steammag01_chainreaction_009': ['collision_camera_026 (A)'], - 'steammag01_chainreaction_010': ['collision_camera_026 (A)'], - 'steammag01_chainreaction_011': ['collision_camera_026 (A)'], - 'steammag01_chainreaction_012': ['collision_camera_026 (A)'], - 'steammag01_chainreaction_013': ['collision_camera_026 (A)'], - 'steammag01_chainreaction_014': ['collision_camera_026 (A)'], - 'steammag01_chainreaction_015': ['collision_camera_026 (A)'], - 'steammag01_chainreaction_016': ['collision_camera_026 (A)'], - 'steammag01_chainreaction_017': ['collision_camera_026 (A)'], - 'steammag01_chainreaction_018': ['collision_camera_026 (A)'], - 'steammag01_chainreaction_019': ['collision_camera_026 (A)'], - 'steammag01_chainreaction_020': ['collision_camera_026 (A)'], - 'steammag01_chainreaction_old': ['collision_camera_026 (A)'], - 'steammag01_chainreaction_old_000': ['collision_camera_029 (A)'], - 'steamprotoemmy': ['collision_camera_064 (A)'], - 'steamprotoemmy_000': ['collision_camera_016 (A)'], - 'steamprotoemmy_001': ['collision_camera_016 (A)'], - 'steamprotoemmy_002': ['collision_camera_016 (A)'], - 'teleport_baselab_000': ['collision_camera_008 (A)'], - 'teleport_baselab_000_platform': ['collision_camera_008 (A)'], - 'teleport_baselab_000_platform_frozen': ['collision_camera_008 (A)'], - 'teleporter_magma_000': ['collision_camera_081 (A)'], - 'teleporter_magma_000_platform': ['collision_camera_081 (A)'], - 'teleporter_magma_000_platform_frozen': ['collision_camera_081 (A)'], - 'trap_rot_cv_001': ['collision_camera_081 (A)'], - 'trap_rot_cv_003': ['collision_camera_056 (A)'], - 'trap_thermal_horizontal_000': ['collision_camera_011 (A)'], - 'trap_thermal_horizontal_001': ['collision_camera_011 (A)'], - 'waterbeforemaproom': ['collision_camera_056 (A)'], - 'waterzone_000': ['collision_camera_081 (A)'], - 'waterzone_001': ['collision_camera_081 (A)'], - 'waterzone_002': ['collision_camera_081 (A)'], - 'waterzone_003': []}, - 's020_magma': {'AP_03': ['collision_camera_002 (C)'], - 'AP_03B': ['collision_camera_058 (C)'], - 'CAM_Default': ['collision_camera_046 (C)'], - 'CAM_Far': ['collision_camera_009 (C)', 'collision_camera_CooldownX (C)'], - 'CAM_NewPath': ['collision_camera_042 (C)'], - 'CAM_ToKraid_MetroClose': ['collision_camera_024 (C)'], - 'CAM_ToKraid_MetroClose_2': ['collision_camera_024 (C)'], - 'CAM_ToKraid_MetroClose_3': ['collision_camera_024 (C)'], - 'CAM_Transition_Left_0': ['collision_camera_009 (C)'], - 'CAM_Transition_Right_0': ['collision_camera_009 (C)'], - 'CAM_Transition_Right_1': ['collision_camera_009 (C)'], - 'CamRail_KraidFace': ['collision_camera_023 (C)'], - 'Cam_KraidFace': ['collision_camera_023 (C)'], - 'Cam_KraidFace_Close': ['collision_camera_023 (C)'], - 'CameraRail_PathToKraid': ['collision_camera_024 (C)'], - 'Disable_CamToKraid': ['collision_camera_061 (C)'], - 'LE_Elevator_FromCave': ['collision_camera_000 (C)'], - 'LE_Platform_Elevator_FromCave': ['collision_camera_000 (C)'], - 'LE_Platform_Teleport_FromCave': ['collision_camera_025 (C)'], - 'LE_Teleport_FromCave': ['collision_camera_025 (C)'], - 'LE_WorldGraph': ['collision_camera_046 (C)'], - 'LM_EmmyDestroySearch_001': ['collision_camera_036 (C)'], - 'LM_EmmyEntrancePoint_000': ['collision_camera_020 (C)'], - 'LM_EmmyEntrancePoint_002': ['collision_camera_046 (C)'], - 'LM_EmmyEntrancePoint_003': ['collision_camera_046 (C)'], - 'LM_EmmyEntrancePoint_004': ['collision_camera_020 (C)'], - 'LM_EmmyEntrancePoint_005': ['collision_camera_010 (C)'], - 'LM_EmmyEntrancePoint_006': ['collision_camera_010 (C)'], - 'LM_EmmyEntrancePoint_007': ['collision_camera_059 (C)'], - 'LM_EmmyEntrancePoint_008': ['collision_camera_028 (C)'], - 'LM_EmmyEntrancePoint_009': ['collision_camera_028 (C)'], - 'LM_EmmyEntrancePoint_010': ['collision_camera_028 (C)'], - 'LM_EmmyEntrancePoint_012': ['collision_camera_029 (C)'], - 'LM_EmmyEntrancePoint_013': ['collision_camera_036 (C)'], - 'LM_EmmyEntrancePoint_014': ['collision_camera_022 (C)'], - 'LM_EmmyEntrancePoint_015': ['collision_camera_035 (C)'], - 'LM_EmmyEntrancePoint_017': ['collision_camera_046 (C)'], - 'LM_EmmyEntrancePoint_019': ['collision_camera_032 (C)'], - 'LM_EmmyEntrancePoint_020': ['collision_camera_010 (C)'], - 'LM_EmmyEntrancePoint_021': ['collision_camera_032 (C)'], - 'LM_EmmyEntrancePoint_024': ['collision_camera_046 (C)'], - 'LM_EmmyEntrancePoint_025': ['collision_camera_010 (C)'], - 'LS_EmmyForbidden_000': ['collision_camera_032 (C)'], - 'LS_EmmyForbidden_001': ['collision_camera_032 (C)'], - 'LS_EmmyForbidden_002': ['collision_camera_032 (C)'], - 'LS_EmmyForbidden_003': ['collision_camera_046 (C)'], - 'LS_EmmyForbidden_004': ['collision_camera_059 (C)'], - 'LS_EmmyForbidden_005': ['collision_camera_032 (C)'], - 'LS_EmmyForbidden_006': ['collision_camera_020 (C)'], - 'LS_EmmyForbidden_007': ['collision_camera_046 (C)'], - 'LS_EmmyForbidden_009': ['collision_camera_028 (C)'], - 'LS_EmmyForbidden_010': ['collision_camera_029 (C)'], - 'LS_EmmyForbidden_011': ['collision_camera_035 (C)'], - 'LS_EmmyForbidden_012': ['collision_camera_035 (C)'], - 'LS_EmmyForbidden_013': ['collision_camera_036 (C)'], - 'LS_EmmyForbidden_014': ['collision_camera_036 (C)'], - 'LS_EmmyForbidden_015': ['collision_camera_020 (C)'], - 'LS_EmmyForbidden_016': ['collision_camera_020 (C)'], - 'LS_EmmyForbidden_017': ['collision_camera_035 (C)'], - 'LS_EmmyForbidden_018': ['collision_camera_046 (C)'], - 'LS_EmmyForbidden_019': ['collision_camera_032 (C)'], - 'LS_EmmyForbidden_020': ['collision_camera_032 (C)'], - 'LS_EmmyForbidden_021': ['collision_camera_032 (C)'], - 'LS_EmmyForbidden_022': ['collision_camera_020 (C)'], - 'LS_EmmyForbidden_023': ['collision_camera_036 (C)'], - 'LS_EmmyForbidden_024': ['collision_camera_010 (C)'], - 'LS_EmmyForbidden_025': ['collision_camera_032 (C)'], - 'LS_EmmyForbidden_026': ['collision_camera_020 (C)'], - 'LS_EmmyForbidden_027': ['collision_camera_036 (C)'], - 'LS_EmmyForbidden_028': ['collision_camera_036 (C)'], - 'LS_EmmyZone': ['collision_camera_020 (C)'], - 'LS_MagmaRinkaLifeArea_000': ['collision_camera_037 (C)'], - 'LS_PATROLEMMY_01': ['collision_camera_052 (C)'], - 'LS_PATROLEMMY_02': ['collision_camera_020 (C)'], - 'LS_PATROLEMMY_03': ['collision_camera_032 (C)'], - 'LS_PATROLEMMY_04': ['collision_camera_034 (C)', 'collision_camera_055 (C)'], - 'LS_PATROLEMMY_05': ['collision_camera_013 (C)'], - 'LS_PATROLEMMY_06': ['collision_camera_028 (C)'], - 'LS_PATROLEMMY_07': [], - 'LS_PATROLEMMY_08': ['collision_camera_059 (C)'], - 'LS_PATROLEMMY_09': ['collision_camera_036 (C)'], - 'LS_PATROLEMMY_10': ['collision_camera_036 (C)'], - 'LS_PATROLEMMY_11': ['collision_camera_032 (C)'], - 'LS_PATROLEMMY_12': ['collision_camera_035 (C)'], - 'LS_PATROLEMMY_13': ['collision_camera_052 (C)'], - 'LS_PATROLEMMY_14': ['collision_camera_046 (C)'], - 'SG_Magma_Cannons_000': ['collision_camera_037 (C)'], - 'SP_AccessPoint_3': ['collision_camera_000 (C)'], - 'SP_AccessPoint_3_B': ['collision_camera_025 (C)'], - 'SP_Checkpoint_CentralUnit': ['collision_camera_036 (C)'], - 'SP_Checkpoint_CooldownX': ['collision_camera_004 (C)'], - 'SP_Checkpoint_Dead_CooldownX': ['collision_camera_009 (C)', - 'collision_camera_CooldownX (C)'], - 'SP_Checkpoint_Dead_Kraid': ['collision_camera_063 (C)'], - 'SP_Checkpoint_EmmyMagma': ['collision_camera_052 (C)'], - 'SP_Checkpoint_EmmyMagmaPhase2': ['collision_camera_037 (C)'], - 'SP_Checkpoint_Kraid': ['collision_camera_061 (C)'], - 'SP_Checkpoint_MorphBall': ['collision_camera_036 (C)'], - 'SP_Checkpoint_PistonLeft': ['collision_camera_038 (C)'], - 'SP_Checkpoint_PistonRight': ['collision_camera_012 (C)'], - 'SP_Checkpoint_WideBeam': ['collision_camera_041 (C)'], - 'SP_DiffusionBeam': ['collision_camera_044 (C)'], - 'SP_Emmy': ['collision_camera_046 (C)'], - 'SP_Magma_CUCannon_000': ['collision_camera_037 (C)'], - 'SP_Magma_CUCannon_001': ['collision_camera_037 (C)'], - 'SP_Magma_CUCannon_002': ['collision_camera_037 (C)'], - 'SP_Magma_CUCannon_003': ['collision_camera_037 (C)'], - 'StartPoint0': ['collision_camera_000 (C)'], - 'TG_ChangeCamera_000_B': ['collision_camera_000 (C)'], - 'TG_ChangeCamera_009_B': ['collision_camera_009 (C)'], - 'TG_ChangeCamera_009_C': ['collision_camera_009 (C)'], - 'TG_ChangeCamera_015_B': ['collision_camera_015 (C)'], - 'TG_ChangeCamera_023_B': ['collision_camera_023 (C)'], - 'TG_ChangeCamera_025_B': ['collision_camera_025 (C)'], - 'TG_ChangeCamera_026_B': ['collision_camera_026 (C)'], - 'TG_ChangeCamera_051_B': ['collision_camera_051 (C)'], - 'TG_CombatCU': [], - 'TG_Diffusion_MusicChange': ['collision_camera_044 (C)'], - 'TG_Diffusion_MusicChange_000': ['collision_camera_044 (C)'], - 'TG_EmmyUnlockDoors': ['collision_camera_028 (C)'], - 'TG_FadeActivation_CooldownX_000': ['collision_camera_004 (C)'], - 'TG_InsideTunnelMusicChange': ['collision_camera_053 (C)'], - 'TG_PATROLEMMYACTIVATOR_01': ['collision_camera_046 (C)'], - 'TG_PATROLEMMYACTIVATOR_02': ['collision_camera_020 (C)'], - 'TG_PATROLEMMYACTIVATOR_03': ['collision_camera_032 (C)'], - 'TG_PATROLEMMYACTIVATOR_04': ['collision_camera_032 (C)'], - 'TG_PATROLEMMYACTIVATOR_05': ['collision_camera_013 (C)'], - 'TG_PATROLEMMYACTIVATOR_06': ['collision_camera_028 (C)'], - 'TG_PATROLEMMYACTIVATOR_07': ['collision_camera_027 (C)'], - 'TG_PATROLEMMYACTIVATOR_08': ['collision_camera_059 (C)'], - 'TG_PATROLEMMYACTIVATOR_09': ['collision_camera_038 (C)'], - 'TG_PATROLEMMYACTIVATOR_10': ['collision_camera_036 (C)'], - 'TG_PATROLEMMYACTIVATOR_11': [], - 'TG_PATROLEMMYACTIVATOR_12': ['collision_camera_031 (C)'], - 'TG_PATROLEMMYACTIVATOR_13': ['collision_camera_046 (C)'], - 'TG_PATROLEMMYACTIVATOR_14': ['collision_camera_046 (C)'], - 'TG_PistonLeft_MusicChange': ['collision_camera_038 (C)'], - 'TG_PistonLeft_MusicChange_000': ['collision_camera_042 (C)'], - 'TG_PistonRight_MusicChange': ['collision_camera_012 (C)'], - 'TG_PostCoolDownX_MusicChange': ['collision_camera_009 (C)', - 'collision_camera_CooldownX (C)'], - 'TG_Subarea_043_MusicChange': ['collision_camera_043 (C)'], - 'TG_TutoOC_Enter': ['collision_camera_046 (C)'], - 'TG_TutoOC_Exit': ['collision_camera_020 (C)'], - 'TG_ZoomOutQuit': ['collision_camera_042 (C)'], - 'accesspoint': ['collision_camera_002 (C)'], - 'accesspoint_000': ['collision_camera_058 (C)'], - 'accesspoint_platform': ['collision_camera_002 (C)'], - 'accesspoint_platform_000': ['collision_camera_058 (C)'], - 'ammorecharge_000': ['collision_camera_023 (C)'], - 'block_slide_reg_002': ['collision_camera_024 (C)'], - 'box_magnet_mg_004': ['collision_camera_042 (C)'], - 'box_magnet_mg_01_000': ['collision_camera_015 (C)'], - 'box_wide_cv_001': ['collision_camera_040 (C)'], - 'box_wide_cv_002': ['collision_camera_048 (C)'], - 'breakablemag001': ['collision_camera_007 (C)'], - 'breakablemag002': ['collision_camera_000 (C)'], - 'breakablemag003': ['collision_camera_009 (C)'], - 'breakablemag004': ['collision_camera_019 (C)'], - 'breakablemag005': ['collision_camera_020 (C)'], - 'breakablemag007': ['collision_camera_036 (C)'], - 'breakablemag008': ['collision_camera_036 (C)'], - 'breakablemag009': ['collision_camera_051 (C)'], - 'breakablemag010': ['collision_camera_024 (C)'], - 'breakablemag012': ['collision_camera_015 (C)'], - 'breakablemag013': ['collision_camera_019 (C)'], - 'breakablemag014': ['collision_camera_019 (C)'], - 'camerarailpath': ['collision_camera_042 (C)'], - 'centralunitmagma_000': ['collision_camera_037 (C)'], - 'centralunitmagmacontroller': ['collision_camera_037 (C)'], - 'cooldownxbosslavacarpet': ['collision_camera_009 (C)', - 'collision_camera_CooldownX (C)'], - 'db_dif_mg_001': ['collision_camera_051 (C)'], - 'db_dif_mg_002': ['collision_camera_044 (C)'], - 'db_dside_mg_001b_000': ['collision_camera_026 (C)'], - 'db_dside_mg_002': ['collision_camera_027 (C)'], - 'db_dside_mg_002b_000': ['collision_camera_025 (C)'], - 'db_dside_mg_003': ['collision_camera_026 (C)'], - 'db_dside_mg_003b_000': ['collision_camera_045 (C)'], - 'db_dside_mg_004': ['collision_camera_015 (C)'], - 'db_hdoor_mg_001': ['collision_camera_016 (C)'], - 'db_hdoor_mg_002': ['collision_camera_052 (C)'], - 'db_hdoor_mg_002b_000': ['collision_camera_052 (C)'], - 'db_reg_mg_017': ['collision_camera_023 (C)'], - 'db_reg_mg_019': ['collision_camera_024 (C)'], - 'db_reg_mg_020': ['collision_camera_061 (C)'], - 'db_reg_mg_021': ['collision_camera_061 (C)'], - 'deviceheat': ['collision_camera_004 (C)'], - 'deviceheat_001': ['collision_camera_034 (C)'], - 'deviceheat_002': ['collision_camera_042 (C)'], - 'deviceheat_camerafar_000': ['collision_camera_042 (C)'], - 'door_frblack_gen_000': ['collision_camera_036 (C)'], - 'door_frblack_gen_001': ['collision_camera_022 (C)', - 'collision_camera_035 (C)', - 'collision_camera_036 (C)'], - 'door_frblack_gen_002': ['collision_camera_028 (C)', 'collision_camera_036 (C)'], - 'doorcentralunit': ['collision_camera_036 (C)'], - 'doorchargecharge': ['collision_camera_018 (C)', 'collision_camera_042 (C)'], - 'doorchargecharge_001': ['collision_camera_012 (C)', 'collision_camera_013 (C)'], - 'doorchargecharge_002': ['collision_camera_012 (C)', 'collision_camera_045 (C)'], - 'doorchargecharge_003': ['collision_camera_006 (C)', 'collision_camera_012 (C)'], - 'doorchargecharge_005': ['collision_camera_020 (C)', 'collision_camera_046 (C)'], - 'doorchargecharge_007': ['collision_camera_009 (C)', 'collision_camera_049 (C)'], - 'doorclosedcharge': ['collision_camera_032 (C)', 'collision_camera_046 (C)'], - 'doorclosedcharge_001': ['collision_camera_010 (C)', 'collision_camera_032 (C)'], - 'doorclosedcharge_002': ['collision_camera_014 (C)', 'collision_camera_018 (C)'], - 'doorclosedpower_000': ['collision_camera_044 (C)', 'collision_camera_051 (C)'], - 'doorclosedpower_001': ['collision_camera_052 (C)', 'collision_camera_053 (C)'], - 'dooremmy': ['collision_camera_010 (C)', 'collision_camera_013 (C)'], - 'dooremmy_001': ['collision_camera_031 (C)', 'collision_camera_032 (C)'], - 'dooremmy_002': ['collision_camera_032 (C)', 'collision_camera_034 (C)'], - 'dooremmy_003': ['collision_camera_020 (C)', 'collision_camera_052 (C)'], - 'dooremmy_004': ['collision_camera_022 (C)', 'collision_camera_030 (C)'], - 'dooremmy_005': ['collision_camera_031 (C)', 'collision_camera_035 (C)'], - 'dooremmy_006': ['collision_camera_035 (C)', 'collision_camera_040 (C)'], - 'dooremmy_007': ['collision_camera_027 (C)', 'collision_camera_028 (C)'], - 'dooremmy_008': ['collision_camera_023 (C)', 'collision_camera_028 (C)'], - 'dooremmy_009': ['collision_camera_023 (C)', 'collision_camera_028 (C)'], - 'doorframe': ['collision_camera_025 (C)', 'collision_camera_043 (C)'], - 'doorframepresence': ['collision_camera_020 (C)', 'collision_camera_059 (C)'], - 'doorframepresence_001': ['collision_camera_012 (C)', 'collision_camera_045 (C)'], - 'doorgrapplegrapple': ['collision_camera_051 (C)', 'collision_camera_052 (C)'], - 'doorgrapplegrapple_000': ['collision_camera_014 (C)', 'collision_camera_015 (C)'], - 'doorheat_001': ['collision_camera_004 (C)', 'collision_camera_007 (C)'], - 'doorheat_004': ['collision_camera_040 (C)', 'collision_camera_042 (C)'], - 'doorpowerpower': ['collision_camera_000 (C)', 'collision_camera_006 (C)'], - 'doorpowerpower_000': ['collision_camera_032 (C)', 'collision_camera_046 (C)'], - 'doorpowerpower_001': ['collision_camera_006 (C)', 'collision_camera_015 (C)'], - 'doorpowerpower_002': ['collision_camera_000 (C)', 'collision_camera_002 (C)'], - 'doorpowerpower_003': ['collision_camera_002 (C)', 'collision_camera_004 (C)'], - 'doorpowerpower_004': ['collision_camera_004 (C)', 'collision_camera_007 (C)'], - 'doorpowerpower_007': ['collision_camera_025 (C)', 'collision_camera_062 (C)'], - 'doorpowerpower_008': ['collision_camera_025 (C)', 'collision_camera_064 (C)'], - 'doorpowerpower_009': ['collision_camera_025 (C)', 'collision_camera_058 (C)'], - 'doorpowerpower_010': ['collision_camera_027 (C)', 'collision_camera_058 (C)'], - 'doorpowerpower_011': ['collision_camera_028 (C)', 'collision_camera_029 (C)'], - 'doorpowerpower_012': ['collision_camera_024 (C)', 'collision_camera_061 (C)'], - 'doorpowerpower_013': ['collision_camera_022 (C)', 'collision_camera_029 (C)'], - 'doorpowerpower_014': ['collision_camera_030 (C)', 'collision_camera_031 (C)'], - 'doorpowerpower_015': ['collision_camera_032 (C)', 'collision_camera_046 (C)'], - 'doorpowerpower_016': ['collision_camera_010 (C)', 'collision_camera_032 (C)'], - 'doorpowerpower_017': ['collision_camera_033 (C)', 'collision_camera_034 (C)'], - 'doorpowerpower_018': ['collision_camera_018 (C)', 'collision_camera_033 (C)'], - 'doorpowerpower_019': ['collision_camera_004 (C)', 'collision_camera_007 (C)'], - 'doorpowerpower_020': ['collision_camera_016 (C)', 'collision_camera_042 (C)'], - 'doorpowerpower_021': ['collision_camera_040 (C)', 'collision_camera_041 (C)'], - 'doorpowerpower_022': ['collision_camera_013 (C)', 'collision_camera_014 (C)'], - 'doorpowerpower_023': ['collision_camera_014 (C)', 'collision_camera_045 (C)'], - 'doorpowerpower_025': ['collision_camera_016 (C)', 'collision_camera_048 (C)'], - 'doorpowerpower_026': ['collision_camera_009 (C)', 'collision_camera_021 (C)'], - 'doorpowerpower_027': ['collision_camera_019 (C)', 'collision_camera_052 (C)'], - 'doorpowerpower_028': ['collision_camera_023 (C)', 'collision_camera_064 (C)'], - 'doorpowerpower_029': ['collision_camera_023 (C)', 'collision_camera_043 (C)'], - 'doorpowerpower_030': ['collision_camera_035 (C)', 'collision_camera_036 (C)'], - 'doorpresenceframe_000': ['collision_camera_014 (C)', 'collision_camera_018 (C)'], - 'doorshieldmissile': ['collision_camera_044 (C)', 'collision_camera_051 (C)'], - 'doorshutter_000': ['collision_camera_010 (C)'], - 'doorshutter_001': ['collision_camera_020 (C)', 'collision_camera_046 (C)'], - 'doorshutter_002': ['collision_camera_028 (C)', 'collision_camera_059 (C)'], - 'doorwavebeam_000': ['collision_camera_052 (C)', 'collision_camera_053 (C)'], - 'doorwidebeam_000': ['collision_camera_035 (C)', 'collision_camera_036 (C)'], - 'emmyvalve_reg_gen_000': ['collision_camera_046 (C)'], - 'emmyvalve_reg_gen_001': ['collision_camera_020 (C)'], - 'emmyvalve_reg_gen_002': ['collision_camera_028 (C)'], - 'emmyvalve_reg_gen_003': ['collision_camera_059 (C)'], - 'emmyvalve_reg_gen_004': ['collision_camera_028 (C)'], - 'emmyvalve_reg_gen_005': ['collision_camera_046 (C)'], - 'emmyvalve_reg_gen_006': ['collision_camera_020 (C)'], - 'emmyvalve_reg_gen_007': ['collision_camera_036 (C)'], - 'emmyvalve_reg_gen_008': ['collision_camera_028 (C)'], - 'emmyvalve_reg_gen_009': ['collision_camera_022 (C)'], - 'emmyvalve_reg_gen_010': ['collision_camera_035 (C)'], - 'emmyvalve_reg_gen_011': ['collision_camera_046 (C)'], - 'emmyvalve_reg_gen_012': ['collision_camera_032 (C)'], - 'emmyvalve_reg_gen_013': ['collision_camera_028 (C)'], - 'emmyvalve_reg_gen_014': ['collision_camera_020 (C)'], - 'emmyvalve_reg_gen_015': ['collision_camera_029 (C)'], - 'emmyvalve_reg_gen_016': ['collision_camera_028 (C)'], - 'emmyvalve_reg_gen_017': ['collision_camera_028 (C)'], - 'emmyvalve_reg_gen_018': ['collision_camera_036 (C)'], - 'emmyvalve_reg_gen_019': ['collision_camera_036 (C)'], - 'emmyvalve_reg_gen_020': ['collision_camera_020 (C)'], - 'emmyvalve_reg_gen_021': ['collision_camera_020 (C)'], - 'emmyvalve_reg_gen_022': ['collision_camera_046 (C)'], - 'emmyvalve_reg_gen_023': ['collision_camera_032 (C)'], - 'emmyvalve_reg_gen_024': ['collision_camera_032 (C)'], - 'energyrecharge': ['collision_camera_018 (C)'], - 'env_heat_gen_001': ['collision_camera_015 (C)'], - 'env_heat_gen_002': ['collision_camera_021 (C)'], - 'env_heat_gen_003': ['collision_camera_026 (C)'], - 'env_heat_gen_004': ['collision_camera_053 (C)'], - 'env_heat_gen_005': ['collision_camera_038 (C)'], - 'env_heat_gen_006': ['collision_camera_049 (C)'], - 'env_heat_gen_007': ['collision_camera_012 (C)'], - 'ev_dspiston_heat_000': ['collision_camera_042 (C)'], - 'ev_dspiston_mg_001': ['collision_camera_031 (C)'], - 'ev_hpiston_mg_001': ['collision_camera_009 (C)', 'collision_camera_CooldownX (C)'], - 'ev_hpiston_mg_001_off': ['collision_camera_009 (C)', - 'collision_camera_CooldownX (C)'], - 'ev_lavapump_mg_001': ['collision_camera_009 (C)'], - 'ev_tpiston_heat_000': ['collision_camera_012 (C)'], - 'ev_tpiston_mg_001': ['collision_camera_014 (C)'], - 'fan_cooldown_000': ['collision_camera_009 (C)'], - 'footstepplatform_000': ['collision_camera_010 (C)'], - 'footstepplatform_001': ['collision_camera_020 (C)'], - 'footstepplatform_002': ['collision_camera_028 (C)'], - 'fusiblebox_000': ['collision_camera_009 (C)', 'collision_camera_CooldownX (C)'], - 'fusiblebox_broken_000': ['collision_camera_009 (C)', - 'collision_camera_CooldownX (C)'], - 'fx_heat_door': ['collision_camera_009 (C)', 'collision_camera_049 (C)'], - 'fx_heat_door_000': ['collision_camera_009 (C)', 'collision_camera_021 (C)'], - 'fx_heat_door_001': ['collision_camera_052 (C)', 'collision_camera_053 (C)'], - 'fx_heat_door_002': ['collision_camera_019 (C)', 'collision_camera_052 (C)'], - 'fx_heat_door_003': ['collision_camera_051 (C)', 'collision_camera_052 (C)'], - 'fx_heat_door_004': ['collision_camera_023 (C)', 'collision_camera_043 (C)'], - 'fx_heat_door_005': ['collision_camera_018 (C)', 'collision_camera_042 (C)'], - 'fx_heat_door_006': ['collision_camera_016 (C)', 'collision_camera_042 (C)'], - 'fx_heat_door_007': ['collision_camera_016 (C)', 'collision_camera_048 (C)'], - 'fx_heat_door_008': ['collision_camera_006 (C)', 'collision_camera_015 (C)'], - 'fx_heat_door_009': ['collision_camera_006 (C)', 'collision_camera_012 (C)'], - 'fx_heat_door_010': ['collision_camera_012 (C)', 'collision_camera_045 (C)'], - 'fx_heat_door_011': ['collision_camera_012 (C)', 'collision_camera_013 (C)'], - 'fx_heat_door_012': ['collision_camera_014 (C)', 'collision_camera_015 (C)'], - 'fx_heat_tunnel_000': ['collision_camera_025 (C)'], - 'fx_heat_tunnel_001': ['collision_camera_027 (C)'], - 'fx_heat_tunnel_002': ['collision_camera_045 (C)'], - 'grapplepulloff1x2': ['collision_camera_044 (C)'], - 'grapplepulloff1x2_000': ['collision_camera_053 (C)'], - 'grapplepulloff1x2_001': ['collision_camera_026 (C)'], - 'instanceactor_085': ['collision_camera_053 (C)'], - 'instanceactor_086': ['collision_camera_053 (C)'], - 'instanceactor_087': ['collision_camera_053 (C)'], - 'instanceactor_088': ['collision_camera_053 (C)'], - 'instanceactor_089': ['collision_camera_053 (C)'], - 'instanceactor_091': ['collision_camera_053 (C)'], - 'instanceactor_092': ['collision_camera_053 (C)'], - 'instanceactor_093': ['collision_camera_053 (C)'], - 'instanceactor_297': ['collision_camera_036 (C)'], - 'instanceactor_298': ['collision_camera_036 (C)'], - 'instanceactor_299': ['collision_camera_036 (C)'], - 'instancefx_032': ['collision_camera_049 (C)'], - 'item_energyfragment_000': ['collision_camera_053 (C)'], - 'item_energyfragment_001': ['collision_camera_042 (C)'], - 'item_energytank_000': ['collision_camera_042 (C)'], - 'item_missiletank': ['collision_camera_000 (C)'], - 'item_missiletank_000': ['collision_camera_040 (C)'], - 'item_missiletank_001': ['collision_camera_021 (C)'], - 'item_missiletank_002': ['collision_camera_049 (C)'], - 'item_missiletank_003': ['collision_camera_051 (C)'], - 'item_missiletank_004': ['collision_camera_028 (C)'], - 'item_missiletank_005': ['collision_camera_026 (C)'], - 'item_missiletank_006': ['collision_camera_026 (C)'], - 'item_missiletank_007': ['collision_camera_048 (C)'], - 'item_missiletank_008': ['collision_camera_009 (C)'], - 'item_missiletank_009': ['collision_camera_015 (C)'], - 'item_missiletank_010': ['collision_camera_045 (C)'], - 'item_missiletank_011': ['collision_camera_055 (C)'], - 'item_missiletank_012': ['collision_camera_061 (C)'], - 'item_missiletankplus_000': ['collision_camera_025 (C)'], - 'item_powerbombtank_000': ['collision_camera_015 (C)'], - 'item_powerbombtank_001': ['collision_camera_044 (C)'], - 'item_powerbombtank_002': ['collision_camera_029 (C)'], - 'itemsphere_diffusionbeam': ['collision_camera_044 (C)'], - 'lavazone': ['collision_camera_012 (C)'], - 'lavazone_000': [], - 'lavazone_001': ['collision_camera_049 (C)'], - 'lavazone_002': ['collision_camera_021 (C)'], - 'lavazone_003': ['collision_camera_019 (C)'], - 'lavazone_004': ['collision_camera_019 (C)'], - 'lavazone_005': [], - 'lavazone_006': ['collision_camera_051 (C)'], - 'lavazone_007': ['collision_camera_061 (C)'], - 'lavazone_008': ['collision_camera_061 (C)'], - 'lavazone_009': ['collision_camera_024 (C)'], - 'lavazone_010': ['collision_camera_024 (C)'], - 'lavazone_011': ['collision_camera_038 (C)'], - 'lavazone_012': ['collision_camera_043 (C)'], - 'lavazone_013': ['collision_camera_026 (C)'], - 'lavazone_014': ['collision_camera_015 (C)'], - 'lavazone_015': ['collision_camera_063 (C)'], - 'magnetsurface': ['collision_camera_019 (C)'], - 'magnetsurface_000': ['collision_camera_019 (C)'], - 'magnetsurface_001': ['collision_camera_051 (C)'], - 'magnetsurface_002': ['collision_camera_063 (C)'], - 'magnetsurface_003': ['collision_camera_036 (C)'], - 'magnetsurface_004': ['collision_camera_028 (C)'], - 'magnetsurface_005': ['collision_camera_032 (C)'], - 'magnetsurface_006': ['collision_camera_036 (C)'], - 'magnetsurface_007': ['collision_camera_035 (C)'], - 'magnetsurface_008': ['collision_camera_031 (C)'], - 'magnetsurface_009': ['collision_camera_031 (C)'], - 'magnetsurface_010': ['collision_camera_031 (C)'], - 'magnetsurface_011': ['collision_camera_032 (C)'], - 'magnetsurface_012': ['collision_camera_042 (C)'], - 'magnetsurface_013': ['collision_camera_014 (C)'], - 'magnetsurface_014': ['collision_camera_028 (C)'], - 'magnetsurface_015': ['collision_camera_042 (C)'], - 'magnetsurface_016': ['collision_camera_055 (C)'], - 'magnetsurface_017': ['collision_camera_009 (C)'], - 'magnetsurface_018': ['collision_camera_010 (C)'], - 'magnetsurface_019': ['collision_camera_000 (C)'], - 'magnetsurface_020': ['collision_camera_000 (C)'], - 'magnetsurface_021': ['collision_camera_014 (C)'], - 'magnetsurface_022': ['collision_camera_018 (C)'], - 'magnetsurface_023': ['collision_camera_028 (C)'], - 'magnetsurface_024': ['collision_camera_020 (C)'], - 'magnetsurface_025': ['collision_camera_046 (C)'], - 'magnetsurface_026': ['collision_camera_032 (C)'], - 'magnetsurface_027': ['collision_camera_032 (C)'], - 'magnetsurface_028': ['collision_camera_010 (C)'], - 'magnetsurface_029': ['collision_camera_028 (C)'], - 'magnetsurface_030': ['collision_camera_036 (C)'], - 'magnetsurface_031': ['collision_camera_028 (C)'], - 'magnetsurface_032': ['collision_camera_029 (C)'], - 'magnetsurface_033': ['collision_camera_059 (C)'], - 'magnetsurface_034': ['collision_camera_059 (C)'], - 'magnetsurface_035': ['collision_camera_020 (C)'], - 'magnetsurface_036': ['collision_camera_020 (C)'], - 'magnetsurface_037': ['collision_camera_020 (C)'], - 'magnetsurface_038': ['collision_camera_046 (C)'], - 'magnetsurface_039': ['collision_camera_032 (C)'], - 'magnetsurface_040': ['collision_camera_032 (C)'], - 'magnetsurface_041': ['collision_camera_032 (C)'], - 'magnetsurface_042': ['collision_camera_010 (C)'], - 'magnetsurface_043': ['collision_camera_010 (C)'], - 'magnetsurface_044': ['collision_camera_063 (C)'], - 'magnetsurface_045': ['collision_camera_061 (C)'], - 'magnetsurface_046': ['collision_camera_026 (C)'], - 'maproom': ['collision_camera_030 (C)'], - 'maproom_platform': ['collision_camera_030 (C)'], - 'mblauncher_exit_gen_001': ['collision_camera_009 (C)'], - 'mblauncher_exit_gen_002': ['collision_camera_063 (C)', - 'collision_camera_063_Stage_002 (C)'], - 'mblauncher_exit_gen_003': ['collision_camera_063 (C)', - 'collision_camera_063_Stage_002 (C)'], - 'mblauncher_launcher_gen_001': ['collision_camera_004 (C)'], - 'mblauncher_launcher_gen_002': ['collision_camera_063 (C)', - 'collision_camera_063_Stage_002 (C)'], - 'mblauncher_launcher_gen_003': ['collision_camera_063 (C)', - 'collision_camera_063_Stage_002 (C)'], - 'nofreezeroom_000': ['collision_camera_009 (C)', 'collision_camera_CooldownX (C)'], - 'pistonmag01': ['collision_camera_038 (C)'], - 'pistonmag01_000': ['collision_camera_012 (C)'], - 'pistonmag01_001': [], - 'pistonmag01_off': [], - 'pistonmag01_off_post': [], - 'rail_magnet_mg_001': ['collision_camera_015 (C)'], - 'rail_magnet_mg_003': ['collision_camera_042 (C)'], - 'savestation_000': ['collision_camera_062 (C)'], - 'savestation_000_platform': ['collision_camera_062 (C)'], - 'savestation_001': ['collision_camera_033 (C)'], - 'savestation_001_platform': ['collision_camera_033 (C)'], - 'sg_vignette_prevent_001': ['collision_camera_026 (C)'], - 'shootactivatormag01': ['collision_camera_038 (C)'], - 'shootactivatormag01_000': ['collision_camera_012 (C)'], - 'shootactivatormag01_001': [], - 'shootactivatormag01fakeblock_000': ['collision_camera_012 (C)'], - 'shootactivatoroff_000': [], - 'shootactivatoroff_000_post': [], - 'spawnpointrinka_000': ['collision_camera_037 (C)'], - 'spawnpointrinka_001': ['collision_camera_037 (C)'], - 'steammag01': ['collision_camera_000 (C)'], - 'steammag01_000': ['collision_camera_000 (C)'], - 'steammag01_001': ['collision_camera_000 (C)'], - 'steammag01_002': ['collision_camera_000 (C)'], - 'steammag01_003': ['collision_camera_000 (C)'], - 'steammag01_004': ['collision_camera_000 (C)'], - 'steammag01_005': ['collision_camera_000 (C)'], - 'steammag01_006': ['collision_camera_000 (C)'], - 'steammag01_007': ['collision_camera_000 (C)'], - 'steammag01_008': ['collision_camera_000 (C)'], - 'steammag01_009': ['collision_camera_000 (C)'], - 'steammag01_010': ['collision_camera_040 (C)'], - 'steammag01_011': ['collision_camera_040 (C)'], - 'steammag01_012': ['collision_camera_040 (C)'], - 'steammag01_013': ['collision_camera_040 (C)'], - 'steammag01_014': ['collision_camera_038 (C)'], - 'steammag01_015': ['collision_camera_038 (C)'], - 'steammag01_016': ['collision_camera_012 (C)'], - 'steammag01_017': ['collision_camera_012 (C)'], - 'steammag01_018': ['collision_camera_012 (C)'], - 'teleport_baselab_000': ['collision_camera_051 (C)'], - 'teleport_baselab_000_platform': ['collision_camera_051 (C)'], - 'teleporter_cave_000': ['collision_camera_015 (C)'], - 'teleporter_cave_000_platform': ['collision_camera_015 (C)'], - 'teleporter_forest_000': ['collision_camera_026 (C)'], - 'teleporter_forest_000_platform': ['collision_camera_026 (C)'], - 'totalrechargestation': ['collision_camera_007 (C)'], - 'totalrechargestation_000': ['collision_camera_016 (C)'], - 'trap_thermal_horizontal': ['collision_camera_042 (C)'], - 'trap_thermal_horizontal_000': ['collision_camera_009 (C)'], - 'trap_thermal_horizontal_001': ['collision_camera_010 (C)'], - 'trap_thermal_horizontal_002': ['collision_camera_012 (C)'], - 'trap_thermal_horizontal_003': ['collision_camera_032 (C)'], - 'trap_thermal_horizontal_004': ['collision_camera_004 (C)'], - 'trap_thermal_horizontal_005': ['collision_camera_009 (C)'], - 'trap_thermal_horizontal_POSTCOOL': ['collision_camera_009 (C)'], - 'trap_thermal_horizontal_PRECOOL': ['collision_camera_009 (C)'], - 'videomanager_000': ['collision_camera_036 (C)'], - 'wagontrain_baselab_000': ['collision_camera_041 (C)'], - 'wagontrain_baselab_000_platform': ['collision_camera_041 (C)'], - 'weightactivatedplatform_000': ['collision_camera_023 (C)'], - 'weightactivatedplatform_002': ['collision_camera_018 (C)'], - 'weightactivatedplatform_003': ['collision_camera_042 (C)'], - 'weightactivatedplatform_004': ['collision_camera_034 (C)'], - 'weightactivatedplatform_005': ['collision_camera_004 (C)'], - 'weightactivatedplatform_006': ['collision_camera_042 (C)'], - 'weightactivatedplatform_total': ['collision_camera_007 (C)'], - 'weightactivatedplatform_total_000': ['collision_camera_016 (C)'], - 'zipline_bottom_gen_001': [], - 'zipline_bottom_gen_002': ['collision_camera_025 (C)'], - 'zipline_bottom_gen_003': ['collision_camera_020 (C)'], - 'zipline_right_gen_001': ['collision_camera_025 (C)'], - 'zipline_right_gen_002': ['collision_camera_015 (C)'], - 'zipline_right_gen_003': ['collision_camera_035 (C)']}, - 's030_baselab': {'AP_04': [], - 'AP_06': ['collision_camera_044 (D)'], - 'CAM_Default': [], - 'CAM_PowerGenerator': ['collision_camera_007 (D)'], - 'CAM_ShakernautEvent': ['collision_camera_022 (D)'], - 'CAM_Train': ['collision_camera_043 (D)'], - 'CoolShineLeftVisited': ['collision_camera_016 (D)'], - 'CoolShineUpViewed': ['collision_camera_016 (D)'], - 'CoolShineUpVisited': ['collision_camera_016 (D)'], - 'LE_WorldGraph': [], - 'LM_EmmyDestroySearch': ['collision_camera_040 (D)'], - 'LM_EmmyEntrancePoint_000': ['collision_camera_018 (D)'], - 'LM_EmmyEntrancePoint_001': ['collision_camera_018 (D)'], - 'LM_EmmyEntrancePoint_002': ['collision_camera_018 (D)'], - 'LM_EmmyEntrancePoint_003': ['collision_camera_005 (D)'], - 'LM_EmmyEntrancePoint_004': ['collision_camera_005 (D)'], - 'LM_EmmyEntrancePoint_005': ['collision_camera_005 (D)'], - 'LM_EmmyEntrancePoint_006': ['collision_camera_018 (D)'], - 'LM_EmmyEntrancePoint_007': ['collision_camera_005 (D)'], - 'LM_EmmyEntrancePoint_010': ['collision_camera_017 (D)'], - 'LM_EmmyEntrancePoint_011': ['collision_camera_017 (D)'], - 'LM_EmmyEntrancePoint_012': ['collision_camera_017 (D)'], - 'LM_EmmyEntrancePoint_013': ['collision_camera_017 (D)'], - 'LM_EmmyEntrancePoint_015': ['collision_camera_016 (D)'], - 'LM_EmmyEntrancePoint_016': ['collision_camera_016 (D)'], - 'LM_EmmyEntrancePoint_017': ['collision_camera_016 (D)'], - 'LM_EmmyEntrancePoint_019': ['collision_camera_016 (D)'], - 'LM_EmmyEntrancePoint_020': ['collision_camera_016 (D)'], - 'LM_EmmyEntrancePoint_021': ['collision_camera_029 (D)'], - 'LM_EmmyEntrancePoint_022': ['collision_camera_027 (D)'], - 'LM_EmmyEntrancePoint_023': ['collision_camera_027 (D)'], - 'LM_EmmyEntrancePoint_024': ['collision_camera_029 (D)'], - 'LM_EmmyEntrancePoint_025': ['collision_camera_029 (D)'], - 'LM_EmmyEntrancePoint_026': ['collision_camera_036 (D)'], - 'LM_EmmyEntrancePoint_027': ['collision_camera_037 (D)'], - 'LM_EmmyEntrancePoint_028': ['collision_camera_037 (D)'], - 'LM_EmmyEntrancePoint_029': ['collision_camera_037 (D)'], - 'LM_EmmyPresentation': ['collision_camera_018 (D)'], - 'LM_EmmySpawnAfterAqua': ['collision_camera_037 (D)'], - 'LS_EMMYIMPASSABLE_000': ['collision_camera_040 (D)'], - 'LS_EMMYIMPASSABLE_001': ['collision_camera_017 (D)'], - 'LS_EMMYIMPASSABLE_002': ['collision_camera_017 (D)'], - 'LS_EMMYIMPASSABLE_003': ['collision_camera_036 (D)'], - 'LS_EMMYIMPASSABLE_004': ['collision_camera_016 (D)'], - 'LS_EMMYIMPASSABLE_005': ['collision_camera_016 (D)'], - 'LS_EMMYIMPASSABLE_006': ['collision_camera_017 (D)'], - 'LS_EMMYIMPASSABLE_007': ['collision_camera_027 (D)'], - 'LS_EMMYIMPASSABLE_008': ['collision_camera_029 (D)'], - 'LS_EMMYIMPASSABLE_009': ['collision_camera_029 (D)'], - 'LS_EMMYIMPASSABLE_010': ['collision_camera_029 (D)'], - 'LS_EMMYIMPASSABLE_011': ['collision_camera_040 (D)'], - 'LS_EMMYIMPASSABLE_012': ['collision_camera_040 (D)'], - 'LS_EMMYIMPASSABLE_013': ['collision_camera_040 (D)'], - 'LS_EMMYIMPASSABLE_014': ['collision_camera_018 (D)'], - 'LS_EMMYIMPASSABLE_015': ['collision_camera_005 (D)'], - 'LS_EMMYIMPASSABLE_016': ['collision_camera_018 (D)'], - 'LS_EMMYIMPASSABLE_017': ['collision_camera_027 (D)'], - 'LS_EMMYIMPASSABLE_018': ['collision_camera_040 (D)'], - 'LS_EMMYIMPASSABLE_019': ['collision_camera_040 (D)'], - 'LS_EMMYIMPASSABLE_020': ['collision_camera_037 (D)'], - 'LS_EMMYIMPASSABLE_021': ['collision_camera_005 (D)'], - 'LS_EMMYIMPASSABLE_022': ['collision_camera_005 (D)'], - 'LS_EMMYIMPASSABLE_023': ['collision_camera_005 (D)'], - 'LS_EMMYIMPASSABLE_024': ['collision_camera_027 (D)'], - 'LS_EMMYIMPASSABLE_025': ['collision_camera_037 (D)'], - 'LS_EMMYIMPASSABLE_026': ['collision_camera_037 (D)'], - 'LS_EMMYIMPASSABLE_027': ['collision_camera_037 (D)'], - 'LS_EMMYIMPASSABLE_028': ['collision_camera_037 (D)'], - 'LS_EMMYIMPASSABLE_029': ['collision_camera_037 (D)'], - 'LS_EMMYIMPASSABLE_030': ['collision_camera_018 (D)'], - 'LS_EMMYIMPASSABLE_031': ['collision_camera_037 (D)'], - 'LS_EMMYIMPASSABLE_032': ['collision_camera_037 (D)'], - 'LS_EMMYIMPASSABLE_033': ['collision_camera_029 (D)'], - 'LS_EMMYIMPASSABLE_034': ['collision_camera_029 (D)'], - 'LS_EMMYIMPASSABLE_035': ['collision_camera_029 (D)'], - 'LS_EMMYIMPASSABLE_036': ['collision_camera_037 (D)'], - 'LS_EMMYIMPASSABLE_037': ['collision_camera_016 (D)', 'collision_camera_027 (D)'], - 'LS_EmmyZone': ['collision_camera_018 (D)'], - 'LS_Lab_RinkaLifeArea': ['collision_camera_038 (D)'], - 'LS_PATROLEMMY_01': ['collision_camera_018 (D)'], - 'LS_PATROLEMMY_02': ['collision_camera_018 (D)'], - 'LS_PATROLEMMY_03': ['collision_camera_017 (D)'], - 'LS_PATROLEMMY_04': ['collision_camera_016 (D)'], - 'LS_PATROLEMMY_05': ['collision_camera_016 (D)'], - 'LS_PATROLEMMY_06': ['collision_camera_016 (D)'], - 'LS_PATROLEMMY_07': ['collision_camera_029 (D)'], - 'LS_PATROLEMMY_08': ['collision_camera_029 (D)'], - 'LS_PATROLEMMY_09': ['collision_camera_040 (D)'], - 'LS_PATROLEMMY_10': ['collision_camera_040 (D)'], - 'LS_PATROLEMMY_11': ['collision_camera_005 (D)'], - 'LS_PATROLEMMY_12': ['collision_camera_040 (D)'], - 'LS_PATROLEMMY_13': ['collision_camera_037 (D)'], - 'LS_PATROLEMMY_14': ['collision_camera_037 (D)'], - 'PoolViewed': ['collision_camera_025 (D)'], - 'PoolVisited': ['collision_camera_025 (D)'], - 'Rail_Train': ['collision_camera_043 (D)'], - 'SG_Lab_Cannons': ['collision_camera_038 (D)'], - 'SP_AccessPoint_4': ['collision_camera_013 (D)'], - 'SP_Checkpoint_AfterAqua': ['collision_camera_045 (D)'], - 'SP_Checkpoint_AfterDiffusion': ['collision_camera_008 (D)'], - 'SP_Checkpoint_AfterProfessor': ['collision_camera_019 (D)'], - 'SP_Checkpoint_Blackout': ['collision_camera_004 (D)'], - 'SP_Checkpoint_Blackout2': ['collision_camera_020 (D)'], - 'SP_Checkpoint_Bomb': ['collision_camera_021 (D)'], - 'SP_Checkpoint_CentralUnit': ['collision_camera_040 (D)'], - 'SP_Checkpoint_EmmyBaseLab': ['collision_camera_004 (D)'], - 'SP_Checkpoint_EmmyLabPhase2': ['collision_camera_038 (D)'], - 'SP_Checkpoint_SpeedBooster': ['collision_camera_040 (D)'], - 'SP_Emmy': ['collision_camera_017 (D)'], - 'SP_Lab_CUCannon': ['collision_camera_038 (D)'], - 'SP_Lab_Rinka_000': ['collision_camera_038 (D)'], - 'SP_Lab_Rinka_001': ['collision_camera_038 (D)'], - 'SP_Lab_Rinka_002': ['collision_camera_038 (D)'], - 'SP_WideBeam': ['collision_camera_006 (D)'], - 'StartPoint0': ['collision_camera_043 (D)'], - 'TG_CombatCU': ['collision_camera_038 (D)'], - 'TG_Cool_Shinespark_Begin': ['collision_camera_016 (D)'], - 'TG_Cool_Shinespark_End': ['collision_camera_016 (D)'], - 'TG_EmmyLAB_Deactivation': ['collision_camera_004 (D)'], - 'TG_EmmySpawnAfterAqua': ['collision_camera_045 (D)'], - 'TG_EmmyUnlockDoors': ['collision_camera_037 (D)'], - 'TG_MapCoolShineLeft': ['collision_camera_033 (D)'], - 'TG_MapCoolShineUp': ['collision_camera_016 (D)'], - 'TG_PATROLEMMYACTIVATOR_01': ['collision_camera_000 (D)'], - 'TG_PATROLEMMYACTIVATOR_02': ['collision_camera_018 (D)'], - 'TG_PATROLEMMYACTIVATOR_03': ['collision_camera_017 (D)'], - 'TG_PATROLEMMYACTIVATOR_04': ['collision_camera_026 (D)'], - 'TG_PATROLEMMYACTIVATOR_05': ['collision_camera_033 (D)'], - 'TG_PATROLEMMYACTIVATOR_06': ['collision_camera_015 (D)'], - 'TG_PATROLEMMYACTIVATOR_07': ['collision_camera_027 (D)'], - 'TG_PATROLEMMYACTIVATOR_08': ['collision_camera_031 (D)'], - 'TG_PATROLEMMYACTIVATOR_09': ['collision_camera_029 (D)'], - 'TG_PATROLEMMYACTIVATOR_10': ['collision_camera_039 (D)'], - 'TG_PATROLEMMYACTIVATOR_11': ['collision_camera_005 (D)'], - 'TG_PATROLEMMYACTIVATOR_12': ['collision_camera_040 (D)'], - 'TG_PATROLEMMYACTIVATOR_13': ['collision_camera_037 (D)'], - 'TG_PATROLEMMYACTIVATOR_14': ['collision_camera_037 (D)'], - 'TG_VisitLauncherSection': ['collision_camera_021 (D)'], - 'TG_VisitPool': ['collision_camera_025 (D)'], - 'VisitLauncherSection': ['collision_camera_021 (D)'], - 'accesspoint_000': ['collision_camera_014 (D)'], - 'accesspoint_000_platform': ['collision_camera_014 (D)'], - 'accesspoint_001': ['collision_camera_044 (D)'], - 'accesspoint_001_platform': ['collision_camera_044 (D)'], - 'ammorecharge_001': ['collision_camera_034 (D)'], - 'ammorecharge_001_platform': ['collision_camera_034 (D)'], - 'box_grapple_cv_001': ['collision_camera_003 (D)'], - 'box_wide_cv_001': ['collision_camera_002 (D)'], - 'box_wide_cv_002': ['collision_camera_019 (D)'], - 'box_wide_cv_003': ['collision_camera_001 (D)'], - 'box_wide_cv_004': ['collision_camera_004 (D)'], - 'camerarailpath_PowerGenerator': ['collision_camera_007 (D)'], - 'camerarailpath_ShakernautEvent': ['collision_camera_022 (D)'], - 'centralunitlaboratory': ['collision_camera_038 (D)'], - 'centralunitmagmacontroller': ['collision_camera_038 (D)'], - 'db_dif_b1_001': ['collision_camera_008 (D)'], - 'db_dif_b1_002': ['collision_camera_017 (D)'], - 'db_hdoor_b1_001': ['collision_camera_010 (D)'], - 'db_reg_b1_001': ['collision_camera_025 (D)'], - 'db_reg_b1_002': ['collision_camera_025 (D)'], - 'db_reg_b1_003': ['collision_camera_024 (D)'], - 'db_reg_b1_005': ['collision_camera_004 (D)'], - 'door_frblack_gen_000': ['collision_camera_040 (D)'], - 'door_frblack_gen_001': ['collision_camera_037 (D)', 'collision_camera_040 (D)'], - 'door_frblack_gen_002': ['collision_camera_037 (D)', 'collision_camera_040 (D)'], - 'doorcentralunit': ['collision_camera_040 (D)'], - 'doorchargecharge_000': ['collision_camera_037 (D)', 'collision_camera_040 (D)'], - 'doorchargecharge_001': ['collision_camera_013 (D)', 'collision_camera_014 (D)'], - 'doorchargecharge_002': ['collision_camera_010 (D)', 'collision_camera_013 (D)'], - 'doorchargeclosed_000': ['collision_camera_005 (D)', 'collision_camera_018 (D)'], - 'doorchargeclosed_001': ['collision_camera_011 (D)', 'collision_camera_012 (D)'], - 'doorclosedcharge_000': ['collision_camera_033 (D)', 'collision_camera_034 (D)'], - 'dooremmy_000': ['collision_camera_004 (D)', 'collision_camera_018 (D)'], - 'dooremmy_001': ['collision_camera_002 (D)', 'collision_camera_005 (D)'], - 'dooremmy_002': ['collision_camera_003 (D)', 'collision_camera_005 (D)'], - 'dooremmy_003': ['collision_camera_017 (D)', 'collision_camera_019 (D)'], - 'dooremmy_004': ['collision_camera_017 (D)', 'collision_camera_020 (D)'], - 'dooremmy_005': ['collision_camera_016 (D)', 'collision_camera_026 (D)'], - 'dooremmy_006': ['collision_camera_015 (D)', 'collision_camera_016 (D)'], - 'dooremmy_007': ['collision_camera_016 (D)', 'collision_camera_033 (D)'], - 'dooremmy_008': ['collision_camera_027 (D)', 'collision_camera_028 (D)'], - 'dooremmy_009': ['collision_camera_029 (D)', 'collision_camera_030 (D)'], - 'dooremmy_010': ['collision_camera_036 (D)', 'collision_camera_039 (D)'], - 'dooremmy_011': ['collision_camera_034 (D)', 'collision_camera_037 (D)'], - 'dooremmy_012': ['collision_camera_037 (D)', 'collision_camera_041 (D)'], - 'doorframe_000': ['collision_camera_037 (D)', 'collision_camera_040 (D)'], - 'doorpowerclosed_000': ['collision_camera_021 (D)', 'collision_camera_022 (D)'], - 'doorpowerpower': ['collision_camera_029 (D)', 'collision_camera_036 (D)'], - 'doorpowerpower_000': ['collision_camera_000 (D)', 'collision_camera_001 (D)'], - 'doorpowerpower_001': ['collision_camera_000 (D)', 'collision_camera_002 (D)'], - 'doorpowerpower_002': ['collision_camera_016 (D)', 'collision_camera_027 (D)'], - 'doorpowerpower_003': ['collision_camera_027 (D)', 'collision_camera_029 (D)'], - 'doorpowerpower_004': ['collision_camera_014 (D)', 'collision_camera_015 (D)'], - 'doorpowerpower_007': ['collision_camera_010 (D)', 'collision_camera_012 (D)'], - 'doorpowerpower_009': ['collision_camera_031 (D)', 'collision_camera_032 (D)'], - 'doorpowerpower_010': ['collision_camera_004 (D)', 'collision_camera_006 (D)'], - 'doorpowerpower_011': ['collision_camera_008 (D)', 'collision_camera_010 (D)'], - 'doorpowerpower_012': ['collision_camera_016 (D)', 'collision_camera_017 (D)'], - 'doorpowerpower_013': ['collision_camera_019 (D)', 'collision_camera_044 (D)'], - 'doorpowerpower_014': ['collision_camera_019 (D)', 'collision_camera_044 (D)'], - 'doorpowerpower_015': ['collision_camera_001 (D)', 'collision_camera_043 (D)'], - 'doorpowerpower_016': ['collision_camera_039 (D)', 'collision_camera_046 (D)'], - 'doorpowerpower_017': ['collision_camera_041 (D)', 'collision_camera_045 (D)'], - 'doorpowerpower_018': ['collision_camera_008 (D)', 'collision_camera_009 (D)'], - 'doorpowerpower_019': ['collision_camera_004 (D)', 'collision_camera_009 (D)'], - 'doorpowerpower_020': ['collision_camera_007 (D)', 'collision_camera_008 (D)'], - 'doorpowerpower_021': ['collision_camera_006 (D)', 'collision_camera_008 (D)'], - 'doorpowerpower_022': ['collision_camera_020 (D)', 'collision_camera_022 (D)'], - 'doorpowerpower_023': ['collision_camera_022 (D)', 'collision_camera_026 (D)'], - 'doorpowerpower_025': ['collision_camera_022 (D)', 'collision_camera_023 (D)'], - 'doorpowerpower_026': ['collision_camera_023 (D)', 'collision_camera_025 (D)'], - 'doorpowerpower_027': ['collision_camera_024 (D)', 'collision_camera_025 (D)'], - 'doorpowerpower_028': ['collision_camera_025 (D)', 'collision_camera_042 (D)'], - 'doorpowerpower_029': ['collision_camera_028 (D)', 'collision_camera_030 (D)'], - 'doorpowerpower_030': ['collision_camera_025 (D)', 'collision_camera_042 (D)'], - 'doorshieldmissile_000': ['collision_camera_006 (D)', 'collision_camera_008 (D)'], - 'doorshieldmissile_001': ['collision_camera_021 (D)', 'collision_camera_022 (D)'], - 'doorshutter_001': ['collision_camera_018 (D)'], - 'doorshutter_002': ['collision_camera_037 (D)'], - 'doorshutter_004': ['collision_camera_005 (D)'], - 'doorwidebeam_000': ['collision_camera_004 (D)', 'collision_camera_006 (D)'], - 'doorwidebeam_001': ['collision_camera_008 (D)', 'collision_camera_010 (D)'], - 'doorwidebeam_002': ['collision_camera_004 (D)', 'collision_camera_006 (D)'], - 'elevator_cave_000': ['collision_camera_011 (D)'], - 'elevator_cave_000_platform': ['collision_camera_011 (D)'], - 'elevator_forest_000': ['collision_camera_047 (D)'], - 'elevator_forest_000_platform': ['collision_camera_047 (D)'], - 'elevator_sanctuary_000': ['collision_camera_003 (D)'], - 'elevator_sanctuary_000_platform': ['collision_camera_003 (D)'], - 'elevator_sanctuary_001': ['collision_camera_019 (D)'], - 'elevator_sanctuary_001_platform': ['collision_camera_019 (D)'], - 'emergency_light_000': ['collision_camera_009 (D)'], - 'emergency_light_001': ['collision_camera_008 (D)'], - 'emergency_light_002': ['collision_camera_020 (D)'], - 'emergency_light_003': ['collision_camera_022 (D)'], - 'emergency_light_004': ['collision_camera_022 (D)'], - 'emergency_light_005': ['collision_camera_026 (D)'], - 'emergency_light_006': ['collision_camera_022 (D)'], - 'emergency_light_007': ['collision_camera_025 (D)'], - 'emergency_light_008': ['collision_camera_025 (D)'], - 'emergency_light_009': ['collision_camera_028 (D)'], - 'emergency_light_010': ['collision_camera_030 (D)'], - 'emergency_light_011': ['collision_camera_023 (D)'], - 'emergency_light_012': ['collision_camera_023 (D)'], - 'emmyvalve_reg_gen_000': ['collision_camera_018 (D)'], - 'emmyvalve_reg_gen_001': ['collision_camera_018 (D)'], - 'emmyvalve_reg_gen_002': ['collision_camera_017 (D)', 'collision_camera_018 (D)'], - 'emmyvalve_reg_gen_003': ['collision_camera_017 (D)'], - 'emmyvalve_reg_gen_004': ['collision_camera_016 (D)'], - 'emmyvalve_reg_gen_005': ['collision_camera_016 (D)'], - 'emmyvalve_reg_gen_008': ['collision_camera_027 (D)'], - 'emmyvalve_reg_gen_009': ['collision_camera_029 (D)'], - 'emmyvalve_reg_gen_010': ['collision_camera_036 (D)'], - 'emmyvalve_reg_gen_011': ['collision_camera_040 (D)'], - 'emmyvalve_reg_gen_012': ['collision_camera_037 (D)'], - 'emmyvalve_reg_gen_013': ['collision_camera_040 (D)'], - 'emmyvalve_reg_gen_014': ['collision_camera_017 (D)'], - 'emmyvalve_reg_gen_015': ['collision_camera_017 (D)'], - 'emmyvalve_reg_gen_016': ['collision_camera_037 (D)'], - 'emmyvalve_reg_gen_017': ['collision_camera_037 (D)'], - 'energyrecharge_000': ['collision_camera_015 (D)'], - 'energyrecharge_000_platform': ['collision_camera_015 (D)'], - 'energyrecharge_001': ['collision_camera_042 (D)'], - 'energyrecharge_001_platform': ['collision_camera_042 (D)'], - 'energyrecharge_002': ['collision_camera_001 (D)'], - 'energyrecharge_002_platform': ['collision_camera_001 (D)'], - 'env_frozen_gen_001': ['collision_camera_025 (D)'], - 'env_heat_gen_001': ['collision_camera_013 (D)'], - 'footstepplatform_001': ['collision_camera_018 (D)'], - 'footstepplatform_002': ['collision_camera_037 (D)'], - 'footstepplatform_004': ['collision_camera_005 (D)'], - 'fx_cold_door': ['collision_camera_025 (D)', 'collision_camera_042 (D)'], - 'fx_cold_door_000': ['collision_camera_025 (D)', 'collision_camera_042 (D)'], - 'fx_cold_door_001': ['collision_camera_024 (D)', 'collision_camera_025 (D)'], - 'fx_cold_door_002': ['collision_camera_023 (D)', 'collision_camera_025 (D)'], - 'fx_heat_door': ['collision_camera_013 (D)', 'collision_camera_014 (D)'], - 'fx_heat_door_000': ['collision_camera_008 (D)', 'collision_camera_010 (D)'], - 'grapplepulloff1x2': ['collision_camera_026 (D)'], - 'grapplepulloff1x2_000': ['collision_camera_012 (D)'], - 'grapplepulloff1x2_001': ['collision_camera_012 (D)'], - 'grapplepulloff1x2_002': ['collision_camera_020 (D)'], - 'grapplepulloff1x2_003': ['collision_camera_035 (D)'], - 'grapplepulloff1x2_005': ['collision_camera_030 (D)'], - 'grapplepulloff1x2_006': ['collision_camera_011 (D)'], - 'grapplepulloff1x2_007': ['collision_camera_004 (D)'], - 'grappleswingpoint_000': ['collision_camera_004 (D)'], - 'grappleswingpoint_001': ['collision_camera_004 (D)'], - 'grappleswingpoint_002': ['collision_camera_004 (D)'], - 'grappleswingpoint_003': ['collision_camera_004 (D)'], - 'item_energyfragment_000': ['collision_camera_018 (D)'], - 'item_energyfragment_001': ['collision_camera_010 (D)'], - 'item_energyfragment_002': ['collision_camera_042 (D)'], - 'item_energyfragment_003': ['collision_camera_040 (D)'], - 'item_energytank': ['collision_camera_016 (D)'], - 'item_missiletank': ['collision_camera_004 (D)'], - 'item_missiletank_000': ['collision_camera_001 (D)'], - 'item_missiletank_001': ['collision_camera_030 (D)'], - 'item_missiletank_002': ['collision_camera_012 (D)'], - 'item_missiletank_003': ['collision_camera_021 (D)'], - 'item_missiletank_004': ['collision_camera_012 (D)'], - 'item_missiletank_005': ['collision_camera_020 (D)'], - 'item_missiletank_006': ['collision_camera_025 (D)'], - 'item_missiletank_007': ['collision_camera_027 (D)'], - 'item_missiletank_008': ['collision_camera_025 (D)'], - 'item_missiletank_010': ['collision_camera_031 (D)'], - 'item_missiletankplus_000': ['collision_camera_033 (D)'], - 'item_powerbombtank_000': ['collision_camera_011 (D)'], - 'item_powerbombtank_001': ['collision_camera_035 (D)'], - 'item_powerbombtank_002': ['collision_camera_017 (D)'], - 'itemsphere_bomb': ['collision_camera_021 (D)'], - 'itemsphere_widebeam': ['collision_camera_006 (D)'], - 'lavazone_000': ['collision_camera_012 (D)'], - 'lavazone_001': ['collision_camera_010 (D)'], - 'lavazone_002': ['collision_camera_013 (D)'], - 'magnetsurface': ['collision_camera_027 (D)'], - 'magnetsurface_000': ['collision_camera_001 (D)'], - 'magnetsurface_001': ['collision_camera_017 (D)'], - 'magnetsurface_002': ['collision_camera_001 (D)'], - 'magnetsurface_003': ['collision_camera_002 (D)'], - 'magnetsurface_004': ['collision_camera_037 (D)'], - 'magnetsurface_005': ['collision_camera_011 (D)'], - 'magnetsurface_006': ['collision_camera_008 (D)'], - 'magnetsurface_007': ['collision_camera_037 (D)'], - 'magnetsurface_008': ['collision_camera_017 (D)'], - 'magnetsurface_009': ['collision_camera_015 (D)'], - 'magnetsurface_010': ['collision_camera_016 (D)'], - 'magnetsurface_011': ['collision_camera_016 (D)'], - 'magnetsurface_012': ['collision_camera_027 (D)'], - 'magnetsurface_013': ['collision_camera_037 (D)'], - 'magnetsurface_014': ['collision_camera_016 (D)'], - 'magnetsurface_015': ['collision_camera_016 (D)'], - 'magnetsurface_016': ['collision_camera_037 (D)'], - 'magnetsurface_017': ['collision_camera_016 (D)'], - 'magnetsurface_018': ['collision_camera_037 (D)'], - 'magnetsurface_019': ['collision_camera_037 (D)'], - 'magnetsurface_020': ['collision_camera_027 (D)'], - 'magnetsurface_021': ['collision_camera_029 (D)'], - 'magnetsurface_022': ['collision_camera_029 (D)'], - 'magnetsurface_023': ['collision_camera_029 (D)'], - 'magnetsurface_024': ['collision_camera_036 (D)'], - 'magnetsurface_025': ['collision_camera_037 (D)'], - 'magnetsurface_026': ['collision_camera_036 (D)'], - 'magnetsurface_027': ['collision_camera_005 (D)'], - 'magnetsurface_028': ['collision_camera_039 (D)'], - 'magnetsurface_029': ['collision_camera_031 (D)'], - 'magnetsurface_030': ['collision_camera_018 (D)'], - 'magnetsurface_031': ['collision_camera_016 (D)'], - 'magnetsurface_032': ['collision_camera_016 (D)'], - 'magnetsurface_033': ['collision_camera_016 (D)'], - 'magnetsurface_034': ['collision_camera_025 (D)'], - 'magnetsurface_035': ['collision_camera_017 (D)'], - 'magnetsurface_036': ['collision_camera_017 (D)'], - 'magnetsurface_037': ['collision_camera_016 (D)'], - 'magnetsurface_038': ['collision_camera_016 (D)'], - 'magnetsurface_039': ['collision_camera_022 (D)'], - 'magnetsurface_040': ['collision_camera_025 (D)'], - 'magnetsurface_041': ['collision_camera_037 (D)'], - 'maproom_000': ['collision_camera_023 (D)'], - 'maproom_000_platform': ['collision_camera_023 (D)'], - 'mblauncher_exit_gen_001': ['collision_camera_022 (D)'], - 'mblauncher_exit_gen_002': ['collision_camera_028 (D)'], - 'mblauncher_exit_gen_003': ['collision_camera_002 (D)'], - 'mblauncher_launcher_gen_001': ['collision_camera_021 (D)'], - 'mblauncher_launcher_gen_002': ['collision_camera_026 (D)'], - 'mblauncher_launcher_gen_003': ['collision_camera_031 (D)'], - 'mblauncher_launcher_gen_004': ['collision_camera_030 (D)'], - 'mblauncher_launcher_gen_005': ['collision_camera_031 (D)'], - 'mblauncher_launcher_gen_006': ['collision_camera_030 (D)'], - 'mblauncher_launcher_gen_007': ['collision_camera_011 (D)'], - 'mlm_block_000': ['collision_camera_033 (D)'], - 'mlm_point_000': ['collision_camera_033 (D)'], - 'mlm_point_001': ['collision_camera_033 (D)'], - 'mlm_point_002': ['collision_camera_033 (D)'], - 'mlm_point_003': ['collision_camera_033 (D)'], - 'mlm_point_004': ['collision_camera_033 (D)'], - 'portal_trainwagon_left': [], - 'powergenerator_001': ['collision_camera_007 (D)'], - 'powergenerator_001_platform': ['collision_camera_007 (D)'], - 'powergenerator_002': ['collision_camera_024 (D)'], - 'powergenerator_002_platform': ['collision_camera_024 (D)'], - 'powergeneratorengine_001': ['collision_camera_007 (D)'], - 'powergeneratorengine_002': ['collision_camera_024 (D)'], - 'savestation_000': ['collision_camera_000 (D)'], - 'savestation_000_platform': ['collision_camera_000 (D)'], - 'savestation_001': ['collision_camera_032 (D)'], - 'savestation_001_platform': ['collision_camera_032 (D)'], - 'teleport_cave_000': ['collision_camera_001 (D)'], - 'teleport_cave_000_platform': ['collision_camera_001 (D)'], - 'teleport_magma_000': ['collision_camera_008 (D)'], - 'teleport_magma_000_platform': ['collision_camera_008 (D)'], - 'totalrechargestation_000': ['collision_camera_022 (D)'], - 'totalrechargestation_001': ['collision_camera_009 (D)'], - 'wagontrain_aqua_000': ['collision_camera_046 (D)'], - 'wagontrain_aqua_000_platform': ['collision_camera_046 (D)'], - 'wagontrain_aqua_001_platform': ['collision_camera_045 (D)'], - 'wagontrain_magma_000': ['collision_camera_043 (D)'], - 'wagontrain_magma_000_platform': ['collision_camera_043 (D)'], - 'wagontrain_with_portal_aqua_001': ['collision_camera_045 (D)'], - 'waterzone_000': ['collision_camera_035 (D)'], - 'waterzone_001': ['collision_camera_041 (D)'], - 'waterzone_002': ['collision_camera_039 (D)'], - 'waterzone_003': ['collision_camera_039 (D)'], - 'waterzone_004': ['collision_camera_039 (D)'], - 'waterzone_005': [], - 'waterzone_006': ['collision_camera_025 (D)'], - 'weightactivatedplatform_total_000': ['collision_camera_022 (D)'], - 'weightactivatedplatform_total_001': ['collision_camera_009 (D)'], - 'zipline_bottom_gen_000': ['collision_camera_029 (D)'], - 'zipline_bottom_gen_002': ['collision_camera_016 (D)'], - 'zipline_left_gen_002': ['collision_camera_016 (D)'], - 'zipline_right_gen_001': ['collision_camera_017 (D)'], - 'zipline_right_gen_002': ['collision_camera_016 (D)']}, - 's040_aqua': {'AP_05': ['collision_camera_009 (B)'], - 'AP_09': ['collision_camera_016 (B)'], - 'CAM_Default': [], - 'CAM_Far': ['collision_camera_001 (B)'], - 'CAM_Train': ['collision_camera_003 (B)'], - 'LE_Platform_Teleport_Secret': ['collision_camera_008 (B)'], - 'LE_Teleport_Secret': ['collision_camera_008 (B)'], - 'Rail_Train': ['collision_camera_003 (B)'], - 'SP_AccessPoint_5': ['collision_camera_001 (B)'], - 'SP_AccessPoint_9': ['collision_camera_021 (B)'], - 'SP_AccessPoint_9B': ['collision_camera_017 (B)'], - 'SP_Checkpoint_Cooldown': ['collision_camera_017 (B)'], - 'SP_Checkpoint_Dead_2RCW': ['collision_camera_021 (B)'], - 'SP_Checkpoint_Demolition': ['collision_camera_021 (B)'], - 'SP_Checkpoint_DoorProfessor': ['collision_camera_001 (B)'], - 'SP_Checkpoint_GhostDash': ['collision_camera_010 (B)'], - 'SP_Checkpoint_GhostDashObtained': ['collision_camera_014 (B)'], - 'SP_Checkpoint_GravitySuit': ['collision_camera_023_B (B)'], - 'SP_Checkpoint_Hydrogiga': ['collision_camera_005 (B)'], - 'SP_Checkpoint_Hydrogiga_Dead': ['collision_camera_028 (B)'], - 'SP_Checkpoint_Trench': ['collision_camera_015 (B)'], - 'SP_Checkpoint_TwoChozoRobots_Aqua': ['collision_camera_021 (B)'], - 'StartPoint0': ['collision_camera_003 (B)'], - 'TG_Cam010_MusicChange': ['collision_camera_013 (B)'], - 'TG_Cam010_MusicChange_000': ['collision_camera_013 (B)'], - 'TG_Cam010_MusicChange_001': ['collision_camera_010 (B)'], - 'TG_Cam010_MusicChange_002': ['collision_camera_010 (B)'], - 'TG_Cam010_MusicChange_003': ['collision_camera_015 (B)'], - 'TG_ChangeCamera_001_B': ['collision_camera_001 (B)'], - 'TG_ChangeCamera_002': ['collision_camera_002 (B)'], - 'TG_ChangeCamera_021': ['collision_camera_021 (B)'], - 'TG_ChangeCamera_023_Enter': [], - 'TG_ChangeCamera_023_Exit': [], - 'TG_ChangeCamera_10': ['collision_camera_010 (B)'], - 'TG_ChangeCamera_15': ['collision_camera_015 (B)'], - 'TG_FlashShiftClose': ['collision_camera_014 (B)'], - 'TG_GravitySuit_MusicChange': ['collision_camera_023_B (B)'], - 'TG_IgnoreHangHydrogigaArena': ['collision_camera_007 (B)'], - 'TG_KeepDirection_000': ['collision_camera_028 (B)', 'collision_camera_029 (B)'], - 'TG_KeepDirection_001': ['collision_camera_007 (B)'], - 'TG_MusicChange_021_nodelay': ['collision_camera_023_B (B)'], - 'TG_MusicChange_021_nodelay_000': ['collision_camera_021 (B)'], - 'TG_waterzone_010': ['collision_camera_010 (B)'], - 'TG_waterzone_011': ['collision_camera_010 (B)'], - 'TG_waterzone_012': ['collision_camera_010 (B)'], - 'TG_waterzone_013': ['collision_camera_010 (B)'], - 'TG_waterzone_014': ['collision_camera_010 (B)'], - 'TG_waterzone_015': ['collision_camera_010 (B)'], - 'TG_waterzone_016': ['collision_camera_010 (B)'], - 'TG_waterzone_018': ['collision_camera_010 (B)'], - 'TG_waterzone_027': ['collision_camera_010 (B)'], - 'TriggerOpt_001': ['collision_camera_010 (B)'], - 'TriggerOpt_002': ['collision_camera_010 (B)'], - 'TriggerOpt_003': ['collision_camera_010 (B)'], - 'TriggerOpt_004': ['collision_camera_010 (B)'], - 'TriggerOpt_005': ['collision_camera_010 (B)'], - 'TriggerOpt_006': ['collision_camera_010 (B)'], - 'TriggerOpt_007': ['collision_camera_010 (B)'], - 'accesspoint_000': ['collision_camera_009 (B)'], - 'accesspoint_000_platform': ['collision_camera_009 (B)'], - 'accesspoint_001': ['collision_camera_016 (B)'], - 'accesspoint_001_platform': ['collision_camera_016 (B)'], - 'aeiongd_statue': ['collision_camera_014 (B)'], - 'ammorecharge_001': ['collision_camera_022 (B)'], - 'ammorecharge_001_platform': ['collision_camera_022 (B)'], - 'ammorecharge_002': ['collision_camera_008 (B)'], - 'ammorecharge_002_platform': ['collision_camera_008 (B)'], - 'box_magnet_aq_002': ['collision_camera_010 (B)'], - 'camerarailpath': ['collision_camera_001 (B)'], - 'db_reg_aq_001': ['collision_camera_002 (B)'], - 'db_reg_aq_002': ['collision_camera_002 (B)'], - 'db_reg_aq_003': ['collision_camera_010 (B)'], - 'db_reg_aq_004': ['collision_camera_023_B (B)'], - 'db_reg_aq_005': ['collision_camera_021 (B)'], - 'db_reg_aq_007': ['collision_camera_002 (B)'], - 'db_reg_aq_008': ['collision_camera_006 (B)'], - 'db_reg_aq_009': ['collision_camera_008 (B)'], - 'db_reg_aq_011': ['collision_camera_006 (B)'], - 'db_reg_aq_012': ['collision_camera_015 (B)'], - 'door_shield_plasma_002': ['collision_camera_010 (B)', 'collision_camera_013 (B)'], - 'door_shield_plasma_003': ['collision_camera_010 (B)', 'collision_camera_013 (B)'], - 'door_shield_plasma_004': ['collision_camera_010 (B)', 'collision_camera_015 (B)'], - 'doorclosedcharge_001': ['collision_camera_015 (B)', 'collision_camera_021 (B)'], - 'doorclosedcharge_002': ['collision_camera_010 (B)', 'collision_camera_015 (B)'], - 'doorclosedpower': ['collision_camera_010 (B)', 'collision_camera_015 (B)'], - 'doorframepresence': ['collision_camera_021 (B)', 'collision_camera_022 (B)'], - 'doorframepresence_000': ['collision_camera_021 (B)', 'collision_camera_022 (B)'], - 'doorgrapplegrapple_000': ['collision_camera_005 (B)', 'collision_camera_008 (B)'], - 'doorgrapplegrapple_001': ['collision_camera_006 (B)', 'collision_camera_007 (B)'], - 'doorpowerclosed_000': ['collision_camera_010 (B)', 'collision_camera_014 (B)'], - 'doorpowerpower_000': ['collision_camera_002 (B)', 'collision_camera_003 (B)'], - 'doorpowerpower_001': ['collision_camera_001 (B)', 'collision_camera_002 (B)'], - 'doorpowerpower_002': ['collision_camera_001 (B)', 'collision_camera_009 (B)'], - 'doorpowerpower_003': ['collision_camera_008 (B)', 'collision_camera_009 (B)'], - 'doorpowerpower_004': ['collision_camera_008 (B)', 'collision_camera_010 (B)'], - 'doorpowerpower_005': ['collision_camera_010 (B)', 'collision_camera_011 (B)'], - 'doorpowerpower_006': ['collision_camera_002 (B)', 'collision_camera_012 (B)'], - 'doorpowerpower_007': ['collision_camera_002 (B)', 'collision_camera_004 (B)'], - 'doorpowerpower_008': ['collision_camera_000 (B)', 'collision_camera_001 (B)'], - 'doorpowerpower_009': ['collision_camera_000 (B)', 'collision_camera_008 (B)'], - 'doorpowerpower_010': ['collision_camera_005 (B)', 'collision_camera_029 (B)'], - 'doorpowerpower_011': ['collision_camera_006 (B)', 'collision_camera_030 (B)'], - 'doorpowerpower_013': ['collision_camera_010 (B)', 'collision_camera_013 (B)'], - 'doorpowerpower_014': ['collision_camera_010 (B)', 'collision_camera_013 (B)'], - 'doorpowerpower_015': ['collision_camera_021 (B)', 'collision_camera_023_B (B)'], - 'doorpowerpower_016': ['collision_camera_021 (B)', 'collision_camera_023_B (B)'], - 'doorpowerpower_018': ['collision_camera_016 (B)', 'collision_camera_021 (B)'], - 'doorpowerpower_019': ['collision_camera_016 (B)', 'collision_camera_017 (B)'], - 'doorpowerpower_020': ['collision_camera_015 (B)', 'collision_camera_018 (B)'], - 'doorpowerpower_021': ['collision_camera_015 (B)', 'collision_camera_018 (B)'], - 'doorpowerpower_022': ['collision_camera_010 (B)', 'collision_camera_026 (B)'], - 'doorpowerpower_023': ['collision_camera_010 (B)', 'collision_camera_026 (B)'], - 'doorpowerpower_024': ['collision_camera_010 (B)', 'collision_camera_025 (B)'], - 'doorpowerpower_025': ['collision_camera_026 (B)', 'collision_camera_027 (B)'], - 'doorshieldmissile_000': ['collision_camera_010 (B)', 'collision_camera_014 (B)'], - 'doorshieldmissile_001': ['collision_camera_021 (B)', 'collision_camera_023_B (B)'], - 'doorshutter_000': ['collision_camera_010 (B)', 'collision_camera_012 (B)'], - 'doorshutter_001': ['collision_camera_010 (B)', 'collision_camera_014 (B)'], - 'doorshutter_002': ['collision_camera_008 (B)'], - 'doorshutter_003': ['collision_camera_021 (B)'], - 'doorshutter_004': ['collision_camera_021 (B)'], - 'elevator_cave_000': ['collision_camera_017 (B)'], - 'elevator_cave_000_platform': ['collision_camera_017 (B)'], - 'elevator_forest_000': ['collision_camera_006 (B)'], - 'elevator_forest_000_platform': ['collision_camera_006 (B)'], - 'energyrecharge_000': ['collision_camera_006 (B)'], - 'energyrecharge_000_platform': ['collision_camera_006 (B)'], - 'energyrecharge_001': ['collision_camera_013 (B)'], - 'energyrecharge_001_platform': ['collision_camera_013 (B)'], - 'ev_aquadrain_left': ['collision_camera_002 (B)'], - 'ev_aquadrain_right': ['collision_camera_002 (B)'], - 'ev_demolition_block': ['collision_camera_021 (B)'], - 'ev_demolition_db_001': ['collision_camera_021 (B)'], - 'ev_demolition_db_002': ['collision_camera_021 (B)'], - 'ev_demolition_db_003': ['collision_camera_021 (B)'], - 'ev_demolition_debris': ['collision_camera_021 (B)'], - 'ev_demolition_grapple': ['collision_camera_021 (B)'], - 'ev_demolition_tunnel': ['collision_camera_021 (B)'], - 'ev_doorprof': ['collision_camera_001 (B)'], - 'ev_doorprof_open': ['collision_camera_001 (B)'], - 'fan_reg': ['collision_camera_002 (B)'], - 'footstepplatform_000': ['collision_camera_010 (B)'], - 'footstepplatform_001': ['collision_camera_010 (B)'], - 'footstepplatform_002': ['collision_camera_014 (B)'], - 'footstepplatform_003': ['collision_camera_008 (B)'], - 'grapplepulloff1x2_000': ['collision_camera_002 (B)'], - 'grapplepulloff1x2_001': ['collision_camera_008 (B)'], - 'grapplepulloff1x2_003': ['collision_camera_010 (B)'], - 'grapplepulloff1x2_004': ['collision_camera_006 (B)'], - 'grapplepulloff1x2_005': ['collision_camera_010 (B)'], - 'grapplepulloff1x2_006': ['collision_camera_029 (B)'], - 'grappleswingpoint_000': ['collision_camera_005 (B)'], - 'grappleswingpoint_001': ['collision_camera_005 (B)'], - 'grappleswingpoint_002': ['collision_camera_007 (B)'], - 'grappleswingpoint_003': ['collision_camera_007 (B)'], - 'instanceactor_001': ['collision_camera_003 (B)'], - 'instanceactor_232': ['collision_camera_002 (B)'], - 'instanceactor_233': ['collision_camera_002 (B)'], - 'instanceactor_234': ['collision_camera_002 (B)'], - 'instanceactor_235': ['collision_camera_002 (B)'], - 'instanceactor_237': ['collision_camera_002 (B)'], - 'instanceactor_238': ['collision_camera_002 (B)'], - 'instanceactor_239': ['collision_camera_002 (B)'], - 'instanceactor_241': ['collision_camera_018 (B)'], - 'instanceactor_242': ['collision_camera_018 (B)'], - 'instanceactor_243': ['collision_camera_018 (B)'], - 'instanceactor_244': ['collision_camera_002 (B)'], - 'instanceactor_248': ['collision_camera_003 (B)'], - 'instanceactor_249': ['collision_camera_003 (B)'], - 'instanceactor_250': ['collision_camera_003 (B)'], - 'instanceactor_251': ['collision_camera_003 (B)'], - 'instanceactor_252': ['collision_camera_003 (B)'], - 'instanceactor_253': ['collision_camera_003 (B)'], - 'instanceactor_254': ['collision_camera_003 (B)'], - 'instanceactor_255': ['collision_camera_003 (B)'], - 'instanceactor_256': ['collision_camera_003 (B)'], - 'instanceactor_257': ['collision_camera_003 (B)'], - 'instanceactor_258': ['collision_camera_003 (B)'], - 'instanceactor_259': ['collision_camera_003 (B)'], - 'instanceactor_260': ['collision_camera_003 (B)'], - 'instancefx_000': [], - 'instancefx_001': [], - 'instancefx_002': [], - 'instancefx_003': [], - 'instancefx_004': [], - 'instancefx_005': [], - 'instancefx_006': [], - 'instancefx_007': [], - 'instancefx_008': [], - 'instancefx_doorprof_drops_000': ['collision_camera_001 (B)'], - 'instancefx_doorprof_drops_001': ['collision_camera_001 (B)'], - 'instancefx_doorprof_drops_002': ['collision_camera_001 (B)'], - 'instancefx_doorprof_stream_000': ['collision_camera_001 (B)'], - 'instancefx_doorprof_stream_001': ['collision_camera_001 (B)'], - 'instancefx_doorprof_stream_002': ['collision_camera_001 (B)'], - 'instancefx_doorprof_stream_003': ['collision_camera_001 (B)'], - 'instancefx_doorprof_stream_004': ['collision_camera_001 (B)'], - 'instancefx_doorprof_stream_005': ['collision_camera_001 (B)'], - 'item_energyfragment_000': ['collision_camera_002 (B)'], - 'item_energyfragment_002': ['collision_camera_018 (B)'], - 'item_energytank': ['collision_camera_025 (B)'], - 'item_energytank_000': ['collision_camera_010 (B)'], - 'item_missiletank': ['collision_camera_013 (B)'], - 'item_missiletank_000': ['collision_camera_007 (B)'], - 'item_missiletank_001': ['collision_camera_002 (B)'], - 'item_missiletank_003': ['collision_camera_017 (B)'], - 'item_missiletank_004': ['collision_camera_021 (B)'], - 'item_missiletank_005': ['collision_camera_010 (B)'], - 'item_missiletank_006': ['collision_camera_001 (B)'], - 'item_missiletank_007': ['collision_camera_010 (B)'], - 'item_missiletankplus': ['collision_camera_021 (B)'], - 'item_missiletankplus_000': ['collision_camera_008 (B)'], - 'item_missiletankplus_001': ['collision_camera_010 (B)'], - 'item_missiletankplus_002': ['collision_camera_018 (B)'], - 'item_powerbombtank_000': ['collision_camera_023_B (B)'], - 'itemsphere_gravitysuit': ['collision_camera_023_B (B)'], - 'magnetsurface_000': ['collision_camera_002 (B)'], - 'magnetsurface_001': ['collision_camera_006 (B)'], - 'magnetsurface_002': ['collision_camera_007 (B)'], - 'magnetsurface_003': ['collision_camera_002 (B)'], - 'magnetsurface_004': ['collision_camera_008 (B)'], - 'magnetsurface_005': ['collision_camera_010 (B)'], - 'magnetsurface_006': ['collision_camera_025 (B)'], - 'magnetsurface_007': ['collision_camera_018 (B)'], - 'magnetsurface_008': ['collision_camera_019 (B)'], - 'magnetsurface_009': ['collision_camera_008 (B)'], - 'magnetsurface_010': ['collision_camera_006 (B)'], - 'magnetsurface_011': ['collision_camera_010 (B)'], - 'magnetsurface_012': ['collision_camera_002 (B)'], - 'magnetsurface_014': ['collision_camera_005 (B)'], - 'magnetsurface_015': ['collision_camera_010 (B)'], - 'magnetsurface_016': ['collision_camera_006 (B)'], - 'magnetsurface_018': ['collision_camera_005 (B)'], - 'magnetsurface_019': ['collision_camera_010 (B)'], - 'maproom': ['collision_camera_000 (B)'], - 'maproom_platform': ['collision_camera_000 (B)'], - 'mlm2_point_000': ['collision_camera_008 (B)'], - 'mlm2_point_001': ['collision_camera_008 (B)'], - 'mlm2_point_002': ['collision_camera_008 (B)'], - 'mlm2_point_003': ['collision_camera_008 (B)'], - 'mlm2_point_004': ['collision_camera_008 (B)'], - 'mlm_block_000': ['collision_camera_025 (B)'], - 'mlm_block_001': ['collision_camera_008 (B)'], - 'mlm_point_000': ['collision_camera_025 (B)'], - 'mlm_point_001': ['collision_camera_025 (B)'], - 'mlm_point_002': ['collision_camera_025 (B)'], - 'mlm_point_003': ['collision_camera_025 (B)'], - 'mlm_point_004': ['collision_camera_025 (B)'], - 'portal_trainwagon_right': [], - 'powerup_ghostaura': ['collision_camera_014 (B)'], - 'rail_magnet_aq_001': ['collision_camera_010 (B)'], - 'savestation_000': ['collision_camera_011 (B)'], - 'savestation_000_platform': ['collision_camera_011 (B)'], - 'savestation_001': ['collision_camera_027 (B)'], - 'savestation_001_platform': ['collision_camera_027 (B)'], - 'savestation_002': ['collision_camera_030 (B)'], - 'savestation_002_platform': ['collision_camera_030 (B)'], - 'spacejump_marker_000': ['collision_camera_010 (B)'], - 'spacejump_marker_001': ['collision_camera_010 (B)'], - 'spacejump_marker_002': ['collision_camera_010 (B)'], - 'spacejump_marker_003': ['collision_camera_010 (B)'], - 'spacejump_marker_004': ['collision_camera_010 (B)'], - 'spacejump_marker_005': ['collision_camera_010 (B)'], - 'teleporter_forest_000': ['collision_camera_015 (B)'], - 'teleporter_forest_000_platform': ['collision_camera_015 (B)'], - 'wagontrain_baselab_000': ['collision_camera_003 (B)'], - 'wagontrain_baselab_000_platform': ['collision_camera_003 (B)'], - 'wagontrain_baselab_001_platform': ['collision_camera_004 (B)'], - 'wagontrain_with_portal_baselab_001': ['collision_camera_004 (B)'], - 'waterzone_000': ['collision_camera_002 (B)'], - 'waterzone_001': ['collision_camera_002 (B)'], - 'waterzone_002': ['collision_camera_002 (B)'], - 'waterzone_003': ['collision_camera_002 (B)'], - 'waterzone_004': ['collision_camera_002 (B)'], - 'waterzone_005': ['collision_camera_017 (B)'], - 'waterzone_006': ['collision_camera_002 (B)'], - 'waterzone_007': ['collision_camera_023_B (B)'], - 'waterzone_008': ['collision_camera_021 (B)'], - 'waterzone_009': ['collision_camera_008 (B)'], - 'waterzone_010': ['collision_camera_010 (B)'], - 'waterzone_011': ['collision_camera_010 (B)'], - 'waterzone_012': ['collision_camera_010 (B)'], - 'waterzone_013': ['collision_camera_010 (B)'], - 'waterzone_014': ['collision_camera_010 (B)'], - 'waterzone_015': ['collision_camera_010 (B)'], - 'waterzone_016': ['collision_camera_010 (B)'], - 'waterzone_017': ['collision_camera_012 (B)'], - 'waterzone_018': ['collision_camera_010 (B)'], - 'waterzone_019': ['collision_camera_026 (B)'], - 'waterzone_020': ['collision_camera_015 (B)'], - 'waterzone_021': ['collision_camera_018 (B)'], - 'waterzone_022': ['collision_camera_019 (B)'], - 'waterzone_023': ['collision_camera_013 (B)'], - 'waterzone_024': ['collision_camera_024 (B)'], - 'waterzone_027': ['collision_camera_010 (B)'], - 'waterzone_028': ['collision_camera_018 (B)'], - 'waterzone_029': ['collision_camera_021 (B)'], - 'waterzone_030': ['collision_camera_021 (B)'], - 'waterzone_031': [], - 'waterzone_032': ['collision_camera_021 (B)'], - 'waterzone_033': ['collision_camera_021 (B)'], - 'zipline_bottom_gen_002': ['collision_camera_010 (B)'], - 'zipline_right_gen_000': ['collision_camera_010 (B)'], - 'zipline_right_gen_001': ['collision_camera_010 (B)']}, - 's050_forest': {'AP_07': ['collision_camera_006 (G)'], - 'CAM_Default': ['collision_camera_000 (G)'], - 'SP_AccessPoint_7': ['collision_camera_005 (G)'], - 'SP_AccessPoint_7B': ['collision_camera_007 (G)'], - 'SP_Checkpoint_CentralUnit': ['collision_camera_019 (G)'], - 'SP_Checkpoint_ChozoRobotForest': ['collision_camera_001 (G)'], - 'SP_Checkpoint_ChozoWarriorForest': ['collision_camera_025_B (G)'], - 'SP_Checkpoint_Dead_ChozoRobotSoldier': ['collision_camera_002 (G)'], - 'SP_Checkpoint_Dead_ChozoWarriorX': ['collision_camera_023 (G)'], - 'SP_Checkpoint_DoubleJump': ['collision_camera_030 (G)'], - 'SP_Checkpoint_EmmyForest': ['collision_camera_005 (G)'], - 'SP_Checkpoint_EmmyForestPhase2': ['collision_camera_017 (G)'], - 'SP_Checkpoint_IceMissiles': ['collision_camera_019 (G)'], - 'SP_Checkpoint_LineBomb': ['collision_camera_026 (G)'], - 'SP_Checkpoint_Sonar': ['collision_camera_039 (G)'], - 'SP_Checkpoint_SonarObtained': ['collision_camera_032 (G)'], - 'SP_Checkpoint_SuperGoliath': ['collision_camera_024 (G)'], - 'SP_Checkpoint_SuperMissiles': ['collision_camera_010 (G)'], - 'StartPoint0': ['collision_camera_000 (G)'], - 'TG_KeepDirection_000': ['collision_camera_036 (G)'], - 'TG_KeepDirection_001': ['collision_camera_024 (G)'], - 'TG_SuperMissile_MusicChange': ['collision_camera_010 (G)'], - 'accesspoint_000': ['collision_camera_006 (G)'], - 'accesspoint_000_platform': ['collision_camera_006 (G)'], - 'aeionstatue': ['collision_camera_032 (G)'], - 'ammorecharge_001': ['collision_camera_021 (G)'], - 'ammorecharge_001_platform': ['collision_camera_021 (G)'], - 'box_grapple_cv_001': ['collision_camera_001 (G)'], - 'box_grapple_cv_002': ['collision_camera_025_B (G)'], - 'box_magnet_fr_001': ['collision_camera_035 (G)'], - 'door_frblack_gen_000': [], - 'door_frblack_gen_001': ['collision_camera_019 (G)'], - 'door_frblack_gen_002': [], - 'door_frblack_gen_003': ['collision_camera_019 (G)', 'collision_camera_020 (G)'], - 'door_frblack_gen_004': ['collision_camera_019 (G)', 'collision_camera_020 (G)'], - 'door_frblack_gen_005': ['collision_camera_019 (G)', 'collision_camera_020 (G)'], - 'door_frblack_gen_006': ['collision_camera_019 (G)', 'collision_camera_020 (G)'], - 'door_frblack_gen_007': ['collision_camera_019 (G)'], - 'door_shield_plasma_000': ['collision_camera_000 (G)', 'collision_camera_003 (G)'], - 'door_shield_plasma_001': ['collision_camera_004 (G)', 'collision_camera_011 (G)'], - 'door_shield_plasma_002': ['collision_camera_000 (G)', 'collision_camera_003 (G)'], - 'door_shield_plasma_003': ['collision_camera_021 (G)', 'collision_camera_022 (G)'], - 'door_shield_plasma_004': ['collision_camera_021 (G)', 'collision_camera_022 (G)'], - 'doorchargecharge_000': ['collision_camera_018 (G)', 'collision_camera_020 (G)'], - 'doorchargecharge_001': ['collision_camera_016 (G)', 'collision_camera_019 (G)'], - 'doorclosedcharge': ['collision_camera_024 (G)', 'collision_camera_039 (G)'], - 'doorclosedpower_000': ['collision_camera_033 (G)', 'collision_camera_034 (G)'], - 'doorclosedpower_001': ['collision_camera_009 (G)', 'collision_camera_010 (G)'], - 'doorclosedpower_002': ['collision_camera_024 (G)', 'collision_camera_025_B (G)'], - 'doorclosedpower_003': ['collision_camera_033 (G)', 'collision_camera_036 (G)'], - 'dooremmy': ['collision_camera_020 (G)', 'collision_camera_021 (G)'], - 'dooremmy_000': ['collision_camera_003 (G)', 'collision_camera_004 (G)'], - 'dooremmy_001': ['collision_camera_004 (G)', 'collision_camera_005 (G)'], - 'dooremmy_002': ['collision_camera_011 (G)', 'collision_camera_012 (G)'], - 'dooremmy_003': ['collision_camera_011 (G)', 'collision_camera_012 (G)'], - 'dooremmy_004': ['collision_camera_014 (G)', 'collision_camera_015 (G)'], - 'dooremmy_005': ['collision_camera_014 (G)', 'collision_camera_015 (G)'], - 'dooremmy_006': ['collision_camera_015 (G)', 'collision_camera_016 (G)'], - 'dooremmy_007': ['collision_camera_020 (G)', 'collision_camera_021 (G)'], - 'doorframe_000': ['collision_camera_011 (G)', 'collision_camera_014 (G)'], - 'doorgrappleclosed_000': ['collision_camera_021 (G)', 'collision_camera_039 (G)'], - 'doorgrapplegrapple_000': ['collision_camera_024 (G)', 'collision_camera_031 (G)'], - 'doorgrapplegrapple_001': ['collision_camera_000 (G)', 'collision_camera_001 (G)'], - 'doorgrapplegrapple_003': ['collision_camera_029 (G)', 'collision_camera_037 (G)'], - 'doorgrapplegrapple_006': ['collision_camera_014 (G)', 'collision_camera_018 (G)'], - 'doorpowerclosed_000': ['collision_camera_001 (G)', 'collision_camera_035 (G)'], - 'doorpowerclosed_002': ['collision_camera_023 (G)', 'collision_camera_025_B (G)'], - 'doorpowerclosed_003': ['collision_camera_026 (G)', 'collision_camera_033 (G)'], - 'doorpowerpower': ['collision_camera_024 (G)', 'collision_camera_040 (G)'], - 'doorpowerpower_000': ['collision_camera_001 (G)', 'collision_camera_002 (G)'], - 'doorpowerpower_001': ['collision_camera_008 (G)', 'collision_camera_038 (G)'], - 'doorpowerpower_002': ['collision_camera_004 (G)', 'collision_camera_011 (G)'], - 'doorpowerpower_003': ['collision_camera_005 (G)', 'collision_camera_006 (G)'], - 'doorpowerpower_004': ['collision_camera_006 (G)', 'collision_camera_007 (G)'], - 'doorpowerpower_005': ['collision_camera_007 (G)', 'collision_camera_029 (G)'], - 'doorpowerpower_006': ['collision_camera_008 (G)', 'collision_camera_009 (G)'], - 'doorpowerpower_007': ['collision_camera_009 (G)', 'collision_camera_010 (G)'], - 'doorpowerpower_008': ['collision_camera_012 (G)', 'collision_camera_013 (G)'], - 'doorpowerpower_009': ['collision_camera_014 (G)', 'collision_camera_018 (G)'], - 'doorpowerpower_010': ['collision_camera_019 (G)', 'collision_camera_020 (G)'], - 'doorpowerpower_011': ['collision_camera_019 (G)', 'collision_camera_020 (G)'], - 'doorpowerpower_012': ['collision_camera_001 (G)', 'collision_camera_010 (G)'], - 'doorpowerpower_013': ['collision_camera_022 (G)', 'collision_camera_023 (G)'], - 'doorpowerpower_014': ['collision_camera_024 (G)', 'collision_camera_025_B (G)'], - 'doorpowerpower_015': ['collision_camera_024 (G)', 'collision_camera_036 (G)'], - 'doorpowerpower_017': ['collision_camera_002 (G)', 'collision_camera_003 (G)'], - 'doorpowerpower_018': ['collision_camera_000 (G)', 'collision_camera_003 (G)'], - 'doorpowerpower_019': ['collision_camera_021 (G)', 'collision_camera_022 (G)'], - 'doorshieldmissile_000': ['collision_camera_009 (G)', 'collision_camera_010 (G)'], - 'doorshieldmissile_001': ['collision_camera_024 (G)', - 'collision_camera_025_B (G)'], - 'doorshieldsupermissile_000': ['collision_camera_001 (G)', - 'collision_camera_035 (G)'], - 'doorshieldsupermissile_001': ['collision_camera_007 (G)', - 'collision_camera_029 (G)'], - 'doorshieldsupermissile_002': ['collision_camera_009 (G)', - 'collision_camera_010 (G)'], - 'elevator_aqua_000': ['collision_camera_000 (G)'], - 'elevator_aqua_000_platform': ['collision_camera_000 (G)'], - 'elevator_baselab_000': ['collision_camera_038 (G)'], - 'elevator_baselab_000_platform': ['collision_camera_038 (G)'], - 'emmy_frozen': ['collision_camera_004 (G)'], - 'emmyvalve_reg_gen_000': ['collision_camera_004 (G)'], - 'emmyvalve_reg_gen_001': ['collision_camera_011 (G)'], - 'emmyvalve_reg_gen_002': ['collision_camera_014 (G)'], - 'emmyvalve_reg_gen_003': ['collision_camera_018 (G)'], - 'emmyvalve_reg_gen_005': ['collision_camera_020 (G)'], - 'emmyvalve_reg_gen_006': ['collision_camera_020 (G)'], - 'emmyvalve_reg_gen_007': ['collision_camera_020 (G)'], - 'energyrecharge_002': ['collision_camera_031 (G)'], - 'energyrecharge_002_platform': ['collision_camera_031 (G)'], - 'grapplepulloff1x2_000': ['collision_camera_021 (G)'], - 'grapplepulloff1x2_002': ['collision_camera_008 (G)'], - 'grappleswingpoint_000': ['collision_camera_003 (G)'], - 'grappleswingpoint_001': ['collision_camera_003 (G)'], - 'grappleswingpoint_002': ['collision_camera_003 (G)'], - 'item_energyfragment': ['collision_camera_024 (G)'], - 'item_energyfragment_000': ['collision_camera_021 (G)'], - 'item_energytank_000': ['collision_camera_021 (G)'], - 'item_missiletank': ['collision_camera_024 (G)'], - 'item_missiletank_000': ['collision_camera_001 (G)'], - 'item_missiletank_001': ['collision_camera_008 (G)'], - 'item_missiletank_002': ['collision_camera_028 (G)'], - 'item_missiletank_003': ['collision_camera_003 (G)'], - 'item_missiletank_004': ['collision_camera_024 (G)'], - 'item_missiletank_005': ['collision_camera_033 (G)'], - 'item_missiletank_006': ['collision_camera_039 (G)'], - 'item_missiletank_007': ['collision_camera_024 (G)'], - 'item_missiletank_009': ['collision_camera_029 (G)'], - 'item_missiletankplus_000': ['collision_camera_009 (G)'], - 'item_powerbombtank_000': ['collision_camera_021 (G)'], - 'itemsphere_doublejump': ['collision_camera_030 (G)'], - 'itemsphere_supermissile': ['collision_camera_010 (G)'], - 'magnetsurface': ['collision_camera_029 (G)'], - 'magnetsurface_000': ['collision_camera_001 (G)'], - 'magnetsurface_001': ['collision_camera_001 (G)'], - 'magnetsurface_002': ['collision_camera_003 (G)'], - 'magnetsurface_003': ['collision_camera_003 (G)'], - 'magnetsurface_004': ['collision_camera_004 (G)'], - 'magnetsurface_005': ['collision_camera_004 (G)'], - 'magnetsurface_006': ['collision_camera_011 (G)'], - 'magnetsurface_007': ['collision_camera_009 (G)'], - 'magnetsurface_008': ['collision_camera_035 (G)'], - 'magnetsurface_009': ['collision_camera_012 (G)'], - 'magnetsurface_010': ['collision_camera_014 (G)'], - 'magnetsurface_011': ['collision_camera_014 (G)'], - 'magnetsurface_012': ['collision_camera_018 (G)'], - 'magnetsurface_013': ['collision_camera_021 (G)'], - 'magnetsurface_014': ['collision_camera_021 (G)'], - 'magnetsurface_015': ['collision_camera_025_B (G)'], - 'magnetsurface_016': ['collision_camera_025_B (G)'], - 'magnetsurface_017': ['collision_camera_031 (G)'], - 'magnetsurface_018': ['collision_camera_014 (G)'], - 'magnetsurface_019': ['collision_camera_031 (G)'], - 'magnetsurface_020': ['collision_camera_020 (G)'], - 'maproom': ['collision_camera_013 (G)'], - 'maproom_platform': ['collision_camera_013 (G)'], - 'mblauncher_exit_gen_001': ['collision_camera_007 (G)'], - 'mblauncher_launcher_gen_001': ['collision_camera_035 (G)'], - 'mblauncher_launcher_gen_002': ['collision_camera_024 (G)'], - 'mblauncher_launcher_gen_003': ['collision_camera_030 (G)'], - 'mlm_block_000': ['collision_camera_024 (G)'], - 'mlm_point_000': ['collision_camera_025_B (G)'], - 'mlm_point_001': ['collision_camera_024 (G)'], - 'mlm_point_002': ['collision_camera_025_B (G)'], - 'mlm_point_003': ['collision_camera_025_B (G)'], - 'mlm_point_004': ['collision_camera_025_B (G)'], - 'pf_mushr_fr_000': ['collision_camera_021 (G)'], - 'pf_mushr_fr_001': ['collision_camera_021 (G)'], - 'pf_mushr_fr_002': ['collision_camera_021 (G)'], - 'pf_mushr_fr_003': ['collision_camera_021 (G)'], - 'pf_mushr_fr_004': ['collision_camera_021 (G)'], - 'pf_mushr_fr_005': ['collision_camera_021 (G)'], - 'pf_mushr_fr_006': ['collision_camera_015 (G)'], - 'pf_mushr_fr_007': ['collision_camera_015 (G)'], - 'pf_mushr_fr_008': ['collision_camera_015 (G)'], - 'pf_mushr_fr_009': ['collision_camera_025_B (G)'], - 'pf_mushr_fr_010': ['collision_camera_015 (G)'], - 'pf_mushr_fr_011': ['collision_camera_015 (G)'], - 'pf_mushr_fr_012': ['collision_camera_025_B (G)'], - 'powerup_sonar': ['collision_camera_032 (G)'], - 'rail_magnet_fr_001': ['collision_camera_035 (G)'], - 'savestation': ['collision_camera_040 (G)'], - 'savestation_000': ['collision_camera_022 (G)'], - 'savestation_000_platform': ['collision_camera_022 (G)'], - 'spacejump_marker_000': ['collision_camera_031 (G)'], - 'spacejump_marker_001': ['collision_camera_031 (G)'], - 'spacejump_marker_002': ['collision_camera_031 (G)'], - 'spacejump_marker_003': ['collision_camera_031 (G)'], - 'spacejump_marker_004': ['collision_camera_031 (G)'], - 'spacejump_marker_005': ['collision_camera_031 (G)'], - 'spacejump_marker_006': ['collision_camera_015 (G)'], - 'spacejump_marker_007': ['collision_camera_015 (G)'], - 'spacejump_marker_008': ['collision_camera_015 (G)'], - 'spacejump_marker_009': ['collision_camera_031 (G)'], - 'teleporter_aqua_000': ['collision_camera_024 (G)'], - 'teleporter_aqua_000_platform': ['collision_camera_024 (G)'], - 'teleporter_magma_000': ['collision_camera_024 (G)'], - 'teleporter_magma_000_platform': ['collision_camera_024 (G)'], - 'totalrechargestation_000': ['collision_camera_025_B (G)'], - 'totalrechargestation_001': ['collision_camera_001 (G)'], - 'trap_rot_cv_001': ['collision_camera_007 (G)'], - 'trigger_camera_019_B': ['collision_camera_019 (G)'], - 'trigger_camera_03_B': ['collision_camera_003 (G)'], - 'trigger_camera_03_C': ['collision_camera_003 (G)'], - 'trigger_camera_23_B': ['collision_camera_023 (G)'], - 'trigger_camera_24_B': ['collision_camera_024 (G)'], - 'trigger_camera_25_B': ['collision_camera_025_B (G)'], - 'trigger_camera_25_C': ['collision_camera_025_B (G)'], - 'trigger_camera_ZoomIn_off': ['collision_camera_008 (G)'], - 'trigger_camera_ZoomIn_on': ['collision_camera_007 (G)'], - 'tunnelframe': ['collision_camera_016 (G)', 'collision_camera_019 (G)'], - 'wagontrain_quarantine_000': ['collision_camera_037 (G)'], - 'wagontrain_quarantine_000_platform': ['collision_camera_037 (G)'], - 'wagontrain_quarantine_with_cutscene_000': ['collision_camera_037 (G)'], - 'wagontrain_sanctuary_000': ['collision_camera_027 (G)'], - 'wagontrain_sanctuary_000_platform': ['collision_camera_027 (G)'], - 'wagontrain_shipyard_000': ['collision_camera_034 (G)'], - 'wagontrain_shipyard_000_platform': ['collision_camera_034 (G)'], - 'waterzone_000': ['collision_camera_001 (G)'], - 'waterzone_001': ['collision_camera_011 (G)'], - 'waterzone_002': ['collision_camera_028 (G)'], - 'waterzone_003': [], - 'waterzone_004': [], - 'waterzone_005': ['collision_camera_031 (G)'], - 'waterzone_006': ['collision_camera_024 (G)'], - 'waterzone_007': ['collision_camera_020 (G)'], - 'waterzone_008': ['collision_camera_024 (G)'], - 'weightactivatedplatform_save': ['collision_camera_040 (G)'], - 'weightactivatedplatform_total_000': ['collision_camera_025_B (G)'], - 'weightactivatedplatform_total_001': ['collision_camera_001 (G)'], - 'zipline_bottom_gen_002': ['collision_camera_019 (G)'], - 'zipline_right_gen_002': ['collision_camera_004 (G)']}, - 's060_quarantine': {'CAM_Default': ['collision_camera_011 (E)'], - 'FillMapLauncher': ['collision_camera_002 (E)'], - 'GateTrigger': ['collision_camera_011 (E)'], - 'SP_Checkpoint_ChozoWarriorX': ['collision_camera_007 (E)'], - 'SP_Checkpoint_Dead_ChozoWarriorX': ['collision_camera_004 (E)'], - 'SP_Checkpoint_PlasmaBeam': ['collision_camera_003 (E)'], - 'SP_Checkpoint_ProfessorX': ['collision_camera_001 (E)'], - 'SP_PlasmaBeam': ['collision_camera_006 (E)'], - 'StartPoint0': ['collision_camera_001 (E)'], - 'TG_CameraChange_003_B': ['collision_camera_003 (E)'], - 'TG_ChangeCamera_004_B': ['collision_camera_004 (E)'], - 'TG_ChangeCamera_MBL': ['collision_camera_MBL_B (E)'], - 'TG_ChangeSetup_MBL': ['collision_camera_MBL_B (E)'], - 'TG_Disable_Camera_003_B': ['collision_camera_003 (E)'], - 'TG_FillLauncher': ['collision_camera_002 (E)'], - 'TG_QuarentineOpen': ['collision_camera_003 (E)', - 'collision_camera_MBL_B (E)'], - 'TutoParasiteEnter': ['collision_camera_005 (E)'], - 'TutoParasiteExit': ['collision_camera_005 (E)'], - 'ammorecharge_000': ['collision_camera_003 (E)'], - 'ammorecharge_000_platform': ['collision_camera_003 (E)'], - 'chozoastro': ['collision_camera_005 (E)'], - 'db_reg_qt_001': ['collision_camera_003 (E)'], - 'door_shield_plasma_000': ['collision_camera_002 (E)', - 'collision_camera_003 (E)'], - 'door_shield_plasma_001': [], - 'door_shield_plasma_002': ['collision_camera_005 (E)', - 'collision_camera_007 (E)'], - 'door_shield_plasma_004': ['collision_camera_002 (E)', - 'collision_camera_003 (E)'], - 'door_shield_plasma_005': [], - 'doorpowerclosed_000': ['collision_camera_003 (E)', 'collision_camera_006 (E)'], - 'doorpowerpower_000': ['collision_camera_002 (E)', 'collision_camera_003 (E)'], - 'doorpowerpower_001': ['collision_camera_003 (E)', 'collision_camera_004 (E)'], - 'doorpowerpower_002': ['collision_camera_003 (E)', 'collision_camera_005 (E)'], - 'doorpowerpower_003': ['collision_camera_003 (E)', 'collision_camera_006 (E)'], - 'doorpowerpower_004': ['collision_camera_001 (E)', 'collision_camera_012 (E)'], - 'doorpowerpower_005': ['collision_camera_004 (E)', 'collision_camera_007 (E)'], - 'doorpowerpower_006': ['collision_camera_005 (E)', 'collision_camera_007 (E)'], - 'doorpowerpower_007': ['collision_camera_005 (E)', 'collision_camera_008 (E)'], - 'doorpowerpower_008': ['collision_camera_011 (E)', 'collision_camera_012 (E)'], - 'doorshieldmissile_000': [], - 'energyrecharge_000': ['collision_camera_009 (E)'], - 'energyrecharge_000_platform': ['collision_camera_009 (E)'], - 'ev_gatesealed_closed': ['collision_camera_011 (E)'], - 'ev_gatesealed_opened': ['collision_camera_011 (E)'], - 'ev_gatesealed_second': ['collision_camera_000 (E)', - 'collision_camera_002 (E)'], - 'ev_quarantine_roomlights_001': ['collision_camera_000 (E)'], - 'fan_reg_000': ['collision_camera_008 (E)'], - 'grapplepulloff1x2_000': ['collision_camera_009 (E)'], - 'item_energytank_000': ['collision_camera_003 (E)'], - 'item_missiletank_000': ['collision_camera_010 (E)'], - 'item_missiletank_002': ['collision_camera_008 (E)'], - 'item_powerbombtank_000': ['collision_camera_009 (E)'], - 'itemsphere_plasmabeam_000': ['collision_camera_006 (E)'], - 'magnetsurface_000': ['collision_camera_007 (E)'], - 'mblauncher_exit_gen_001': ['collision_camera_003 (E)', - 'collision_camera_MBL_B (E)'], - 'mblauncher_launcher_gen_000': ['collision_camera_MBL_B (E)'], - 'mblauncher_launcher_gen_001': ['collision_camera_002 (E)'], - 'mblauncher_launcher_gen_002': ['collision_camera_003 (E)', - 'collision_camera_MBL_B (E)'], - 'savestation': ['collision_camera_012 (E)'], - 'wagontrain_forest_000': ['collision_camera_001 (E)'], - 'wagontrain_forest_000_platform': ['collision_camera_001 (E)'], - 'weightactivatedplatform_save': ['collision_camera_012 (E)']}, - 's070_basesanc': {'AP_08': ['collision_camera_016 (F)'], - 'CAM_Default': ['collision_camera_021 (F)'], - 'CAM_Entrance': ['collision_camera_014 (F)'], - 'LM_EmmyTrap': ['collision_camera_034 (F)'], - 'LS_EmmyTrap': ['collision_camera_034 (F)'], - 'LS_Phase2HeatEnabled_000': ['collision_camera_034 (F)'], - 'LS_TrainViewed': ['collision_camera_014 (F)'], - 'PRP_professor_death': ['collision_camera_005 (F)'], - 'PoolVisited': ['collision_camera_030 (F)'], - 'SP_AccessPoint_8': ['collision_camera_012 (F)'], - 'SP_Checkpoint_CentralUnit': ['collision_camera_038_A (F)'], - 'SP_Checkpoint_ChozoRobotSanc': ['collision_camera_005 (F)'], - 'SP_Checkpoint_Dead_2ChozoRobots': ['collision_camera_017 (F)'], - 'SP_Checkpoint_Dead_ChozoRobotSoldier': ['collision_camera_005 (F)'], - 'SP_Checkpoint_EmmySanc': ['collision_camera_007 (F)'], - 'SP_Checkpoint_EmmySancPhase2': ['collision_camera_038_A (F)'], - 'SP_Checkpoint_EmmySancPhase2_CURoom': ['collision_camera_035 (F)'], - 'SP_Checkpoint_MultiLockOn': ['collision_camera_027 (F)'], - 'SP_Checkpoint_Professor': ['collision_camera_040 (F)'], - 'SP_Checkpoint_SpaceJump': ['collision_camera_012 (F)'], - 'SP_Checkpoint_SuperQuetzoa': ['collision_camera_026 (F)'], - 'SP_Checkpoint_TwoChozoRobots': ['collision_camera_019 (F)'], - 'SP_Checkpoint_TwoChozoRobots_BottomLeft': ['collision_camera_007 (F)'], - 'SP_Checkpoint_TwoChozoRobots_TopLeft': ['collision_camera_017 (F)'], - 'SP_Checkpoint_TwoChozoRobots_TopRight': ['collision_camera_017 (F)'], - 'SP_Checkpoint_WaveBeam': ['collision_camera_034 (F)'], - 'StartPoint0': ['collision_camera_000 (F)'], - 'TG_ChangeCamera_003_B': ['collision_camera_003 (F)'], - 'TG_ChangeCamera_012_B': ['collision_camera_012 (F)'], - 'TG_ChangeCamera_012_C': ['collision_camera_012 (F)'], - 'TG_ChangeCamera_024_A': ['collision_camera_024 (F)'], - 'TG_ChangeCamera_024_B': ['collision_camera_024 (F)'], - 'TG_ChangeCamera_024_C': ['collision_camera_024 (F)'], - 'TG_ChangeCamera_030_B': ['collision_camera_030 (F)'], - 'TG_ChangeCamera_038_B_Enter': [], - 'TG_ChangeCamera_038_B_Exit': [], - 'TG_MusicChange_SpaceJumpWater': ['collision_camera_012 (F)'], - 'TG_MusicChange_Spacejump': ['collision_camera_012 (F)'], - 'TG_Professor_CUT_Placeholder': ['collision_camera_040 (F)'], - 'TG_TrainViewed': ['collision_camera_014 (F)'], - 'TG_VisitPool': ['collision_camera_030 (F)'], - 'accesspoint_000': ['collision_camera_016 (F)'], - 'accesspoint_000_platform': ['collision_camera_016 (F)'], - 'box_wide_cv_002': ['collision_camera_034 (F)'], - 'box_wide_cv_003': ['collision_camera_034 (F)'], - 'camerarailpath_entrance': ['collision_camera_014 (F)'], - 'db_reg_b2_001': ['collision_camera_012 (F)'], - 'db_reg_b2_003': ['collision_camera_009 (F)'], - 'db_reg_b2_004': ['collision_camera_013 (F)'], - 'db_reg_b2_005': ['collision_camera_028 (F)'], - 'db_reg_b2_006': ['collision_camera_031 (F)'], - 'db_reg_b2_007': ['collision_camera_034 (F)'], - 'db_reg_b2_008': ['collision_camera_034 (F)'], - 'db_reg_b2_009': ['collision_camera_034 (F)'], - 'db_reg_b2_010': ['collision_camera_034 (F)'], - 'db_reg_b2_011': ['collision_camera_034 (F)'], - 'door_shield_plasma_000': ['collision_camera_018 (F)', - 'collision_camera_030 (F)'], - 'door_shield_plasma_001': ['collision_camera_018 (F)', - 'collision_camera_030 (F)'], - 'door_shield_plasma_002': ['collision_camera_007 (F)', - 'collision_camera_010 (F)'], - 'door_shield_plasma_003': ['collision_camera_007 (F)', - 'collision_camera_010 (F)'], - 'doorchargecharge_000': ['collision_camera_018 (F)', 'collision_camera_030 (F)'], - 'doorclosedcharge_000': ['collision_camera_015 (F)', 'collision_camera_017 (F)'], - 'doorclosedcharge_001': ['collision_camera_032 (F)', 'collision_camera_033 (F)'], - 'doorclosedcharge_002': ['collision_camera_031 (F)', 'collision_camera_033 (F)'], - 'doorclosedcharge_003': ['collision_camera_025 (F)', 'collision_camera_041 (F)'], - 'doorclosedcharge_004': ['collision_camera_003 (F)', 'collision_camera_021 (F)'], - 'doorclosedpower_000': ['collision_camera_012 (F)', 'collision_camera_015 (F)'], - 'dooremmy_000': ['collision_camera_001 (F)', 'collision_camera_040 (F)'], - 'dooremmy_001': ['collision_camera_004 (F)', 'collision_camera_040 (F)'], - 'dooremmy_002': ['collision_camera_003 (F)', 'collision_camera_007 (F)'], - 'dooremmy_003': ['collision_camera_019 (F)', 'collision_camera_021 (F)'], - 'dooremmy_004': ['collision_camera_021 (F)', 'collision_camera_022 (F)'], - 'dooremmy_005': ['collision_camera_021 (F)', 'collision_camera_022 (F)'], - 'dooremmy_006': ['collision_camera_025 (F)', 'collision_camera_032 (F)'], - 'dooremmy_007': ['collision_camera_029 (F)', 'collision_camera_031 (F)'], - 'dooremmy_008': ['collision_camera_030 (F)', 'collision_camera_031 (F)'], - 'doorgrapplegrapple_000': ['collision_camera_018 (F)', - 'collision_camera_030 (F)'], - 'doorpowerpower': ['collision_camera_018 (F)', 'collision_camera_030 (F)'], - 'doorpowerpower_000': ['collision_camera_000 (F)', 'collision_camera_002 (F)'], - 'doorpowerpower_002': ['collision_camera_004 (F)', 'collision_camera_005 (F)'], - 'doorpowerpower_003': ['collision_camera_006 (F)', 'collision_camera_010 (F)'], - 'doorpowerpower_004': ['collision_camera_006 (F)', 'collision_camera_008 (F)'], - 'doorpowerpower_005': ['collision_camera_007 (F)', 'collision_camera_010 (F)'], - 'doorpowerpower_006': ['collision_camera_009 (F)', 'collision_camera_010 (F)'], - 'doorpowerpower_007': ['collision_camera_007 (F)', 'collision_camera_017 (F)'], - 'doorpowerpower_008': ['collision_camera_017 (F)', 'collision_camera_019 (F)'], - 'doorpowerpower_009': ['collision_camera_017 (F)', 'collision_camera_018 (F)'], - 'doorpowerpower_010': ['collision_camera_016 (F)', 'collision_camera_017 (F)'], - 'doorpowerpower_011': ['collision_camera_012 (F)', 'collision_camera_016 (F)'], - 'doorpowerpower_012': ['collision_camera_012 (F)', 'collision_camera_015 (F)'], - 'doorpowerpower_013': ['collision_camera_012 (F)', 'collision_camera_015 (F)'], - 'doorpowerpower_014': ['collision_camera_026 (F)', 'collision_camera_027 (F)'], - 'doorpowerpower_015': ['collision_camera_021 (F)', 'collision_camera_033 (F)'], - 'doorpowerpower_016': ['collision_camera_003 (F)', 'collision_camera_021 (F)'], - 'doorpowerpower_017': ['collision_camera_032 (F)', 'collision_camera_033 (F)'], - 'doorpowerpower_018': ['collision_camera_024 (F)', 'collision_camera_025 (F)'], - 'doorpowerpower_019': ['collision_camera_022 (F)', 'collision_camera_024 (F)'], - 'doorpowerpower_020': ['collision_camera_022 (F)', 'collision_camera_023 (F)'], - 'doorpowerpower_021': ['collision_camera_018 (F)', 'collision_camera_028 (F)'], - 'doorpowerpower_022': ['collision_camera_028 (F)', 'collision_camera_029 (F)'], - 'doorpowerpower_023': ['collision_camera_031 (F)', 'collision_camera_034 (F)'], - 'doorpowerpower_024': ['collision_camera_024 (F)', 'collision_camera_041 (F)'], - 'doorshieldmissile_000': ['collision_camera_012 (F)', - 'collision_camera_015 (F)'], - 'doorshutter_000': ['collision_camera_017 (F)'], - 'doorshutter_001': ['collision_camera_017 (F)'], - 'doorshutter_002': ['collision_camera_017 (F)'], - 'doorshutter_003': ['collision_camera_017 (F)'], - 'doorshutter_004': ['collision_camera_034 (F)'], - 'doorshutter_005': ['collision_camera_034 (F)'], - 'doorshutter_006': ['collision_camera_040 (F)'], - 'doorshutter_007': ['collision_camera_001 (F)', 'collision_camera_002 (F)'], - 'doorwavebeam_000': ['collision_camera_028 (F)', 'collision_camera_029 (F)'], - 'doorwavebeam_001': ['collision_camera_028 (F)', 'collision_camera_029 (F)'], - 'doorwavebeam_002': ['collision_camera_031 (F)', 'collision_camera_034 (F)'], - 'doorwavebeam_003': ['collision_camera_031 (F)', 'collision_camera_034 (F)'], - 'doorwavebeam_004': ['collision_camera_009 (F)', 'collision_camera_010 (F)'], - 'doorwavebeam_005': ['collision_camera_009 (F)', 'collision_camera_010 (F)'], - 'elevator_baselab_000': ['collision_camera_000 (F)'], - 'elevator_baselab_000_platform': ['collision_camera_000 (F)'], - 'elevator_baselab_001': ['collision_camera_008 (F)'], - 'elevator_baselab_001_platform': ['collision_camera_008 (F)'], - 'elevator_shipyard_000': ['collision_camera_028 (F)'], - 'elevator_shipyard_000_platform': ['collision_camera_028 (F)'], - 'emmy_sanc_deactivated': ['collision_camera_040 (F)'], - 'emmyvalve_reg_gen_000': ['collision_camera_040 (F)'], - 'emmyvalve_reg_gen_001': ['collision_camera_040 (F)'], - 'emmyvalve_reg_gen_002': ['collision_camera_003 (F)', - 'collision_camera_040 (F)'], - 'emmyvalve_reg_gen_003': ['collision_camera_003 (F)'], - 'emmyvalve_reg_gen_004': ['collision_camera_021 (F)'], - 'emmyvalve_reg_gen_005': ['collision_camera_021 (F)'], - 'emmyvalve_reg_gen_006': ['collision_camera_033 (F)'], - 'emmyvalve_reg_gen_007': ['collision_camera_031 (F)'], - 'emmyvalve_reg_gen_008': ['collision_camera_034 (F)'], - 'emmyvalve_reg_gen_009': ['collision_camera_034 (F)'], - 'emmyvalve_reg_gen_010': ['collision_camera_034 (F)'], - 'emmyvalve_reg_gen_011': ['collision_camera_034 (F)'], - 'emmyvalve_reg_gen_012': ['collision_camera_034 (F)'], - 'emmyvalve_reg_gen_013': ['collision_camera_034 (F)'], - 'emmyvalve_reg_gen_014': ['collision_camera_034 (F)'], - 'emmyvalve_reg_gen_015': ['collision_camera_034 (F)'], - 'energyrecharge_000': ['collision_camera_018 (F)'], - 'energyrecharge_000_platform': ['collision_camera_018 (F)'], - 'energyrecharge_001': ['collision_camera_019 (F)'], - 'env_frozen_gen_000': ['collision_camera_010 (F)'], - 'env_frozen_gen_001': ['collision_camera_018 (F)'], - 'ev_chozowall': ['collision_camera_040 (F)'], - 'ev_entercu_cv_001': ['collision_camera_034 (F)', 'collision_camera_038_A (F)'], - 'ev_gatesealed_sanc_000': ['collision_camera_012 (F)', 'collision_camera_014 (F)'], - 'ev_ph2drain_activator': ['collision_camera_038_A (F)'], - 'ev_ph2drain_platform': ['collision_camera_038_A (F)'], - 'fan_reg_000': ['collision_camera_006 (F)'], - 'fedship_hol': ['collision_camera_018 (F)'], - 'footstepplatform_000': ['collision_camera_034 (F)'], - 'footstepplatform_001': ['collision_camera_034 (F)'], - 'footstepplatform_002': ['collision_camera_040 (F)'], - 'footstepplatform_003': ['collision_camera_002 (F)'], - 'fx_cold_door': ['collision_camera_006 (F)', 'collision_camera_010 (F)'], - 'fx_cold_door_000': ['collision_camera_007 (F)', 'collision_camera_010 (F)'], - 'fx_cold_door_001': ['collision_camera_009 (F)', 'collision_camera_010 (F)'], - 'fx_cold_door_002': ['collision_camera_017 (F)', 'collision_camera_018 (F)'], - 'fx_cold_door_003': ['collision_camera_018 (F)', 'collision_camera_028 (F)'], - 'grapplepulloff1x2_000': ['collision_camera_019 (F)'], - 'grapplepulloff1x2_002': ['collision_camera_018 (F)'], - 'grapplepulloff1x2_003': ['collision_camera_009 (F)'], - 'grappleswingpoint_000': ['collision_camera_001 (F)'], - 'grappleswingpoint_001': ['collision_camera_002 (F)'], - 'item_energyfragment': ['collision_camera_025 (F)'], - 'item_energyfragment_000': ['collision_camera_009 (F)'], - 'item_energyfragment_001': ['collision_camera_020 (F)'], - 'item_energyfragment_002': ['collision_camera_002 (F)'], - 'item_missiletank_000': ['collision_camera_013 (F)'], - 'item_missiletank_001': ['collision_camera_011 (F)'], - 'item_missiletank_002': ['collision_camera_012 (F)'], - 'item_missiletank_003': ['collision_camera_030 (F)'], - 'item_missiletank_004': ['collision_camera_026 (F)'], - 'item_missiletank_005': ['collision_camera_011 (F)'], - 'item_missiletankplus_000': ['collision_camera_012 (F)'], - 'item_missiletankplus_001': ['collision_camera_006 (F)'], - 'item_powerbombtank_000': ['collision_camera_040 (F)'], - 'item_powerbombtank_001': ['collision_camera_017 (F)'], - 'itemsphere_spacejump': ['collision_camera_012 (F)'], - 'magnetsurface': ['collision_camera_002 (F)'], - 'magnetsurface_000': ['collision_camera_032 (F)'], - 'magnetsurface_001': ['collision_camera_004 (F)'], - 'magnetsurface_002': ['collision_camera_012 (F)'], - 'magnetsurface_003': ['collision_camera_012 (F)'], - 'magnetsurface_004': ['collision_camera_012 (F)'], - 'magnetsurface_005': ['collision_camera_003 (F)'], - 'magnetsurface_006': ['collision_camera_021 (F)'], - 'magnetsurface_007': ['collision_camera_021 (F)'], - 'magnetsurface_008': ['collision_camera_003 (F)'], - 'magnetsurface_009': ['collision_camera_033 (F)'], - 'magnetsurface_010': ['collision_camera_021 (F)'], - 'magnetsurface_011': ['collision_camera_021 (F)'], - 'magnetsurface_012': ['collision_camera_021 (F)'], - 'magnetsurface_013': ['collision_camera_021 (F)'], - 'magnetsurface_014': ['collision_camera_021 (F)'], - 'magnetsurface_015': ['collision_camera_021 (F)'], - 'magnetsurface_016': ['collision_camera_033 (F)'], - 'magnetsurface_017': ['collision_camera_002 (F)'], - 'magnetsurface_018': ['collision_camera_032 (F)'], - 'magnetsurface_019': ['collision_camera_034 (F)'], - 'magnetsurface_020': ['collision_camera_003 (F)'], - 'magnetsurface_021': ['collision_camera_003 (F)'], - 'magnetsurface_022': ['collision_camera_003 (F)'], - 'magnetsurface_023': ['collision_camera_003 (F)'], - 'magnetsurface_024': ['collision_camera_031 (F)'], - 'maproom': ['collision_camera_023 (F)'], - 'maproom_platform': ['collision_camera_023 (F)'], - 'mblauncher_exit_gen_000': ['collision_camera_034 (F)'], - 'mblauncher_launcher_gen_000': [], - 'mlm_block_000': ['collision_camera_024 (F)'], - 'mlm_block_001': ['collision_camera_015 (F)'], - 'mlm_block_002': ['collision_camera_019 (F)'], - 'mlm_block_003': ['collision_camera_030 (F)'], - 'mlm_point_000': ['collision_camera_024 (F)'], - 'mlm_point_001': ['collision_camera_024 (F)'], - 'mlm_point_002': ['collision_camera_024 (F)'], - 'mlm_point_003': ['collision_camera_024 (F)'], - 'mlm_point_004': ['collision_camera_024 (F)'], - 'mlm_point_005': ['collision_camera_015 (F)'], - 'mlm_point_006': ['collision_camera_015 (F)'], - 'mlm_point_007': ['collision_camera_015 (F)'], - 'mlm_point_008': ['collision_camera_015 (F)'], - 'mlm_point_009': ['collision_camera_015 (F)'], - 'mlm_point_010': ['collision_camera_019 (F)'], - 'mlm_point_011': ['collision_camera_019 (F)'], - 'mlm_point_012': ['collision_camera_019 (F)'], - 'mlm_point_013': ['collision_camera_019 (F)'], - 'mlm_point_014': ['collision_camera_019 (F)'], - 'mlm_point_015': ['collision_camera_030 (F)'], - 'mlm_point_016': ['collision_camera_030 (F)'], - 'mlm_point_017': ['collision_camera_030 (F)'], - 'mlm_point_018': ['collision_camera_030 (F)'], - 'mlm_point_019': ['collision_camera_030 (F)'], - 'savestation_000': ['collision_camera_029 (F)'], - 'savestation_000_platform': ['collision_camera_029 (F)'], - 'savestation_001': ['collision_camera_041 (F)'], - 'savestation_001_platform': ['collision_camera_041 (F)'], - 'spacejump_marker_000': ['collision_camera_012 (F)'], - 'spacejump_marker_001': ['collision_camera_012 (F)'], - 'spacejump_marker_002': ['collision_camera_012 (F)'], - 'tunnelframe': ['collision_camera_031 (F)', 'collision_camera_034 (F)'], - 'tunnelframe_000': ['collision_camera_034 (F)', 'collision_camera_038_A (F)'], - 'teleporter_000': ['collision_camera_007 (F)'], - 'teleporter_000_platform': ['collision_camera_007 (F)'], - 'totalrechargestation_000': ['collision_camera_002 (F)'], - 'totalrechargestation_001': ['collision_camera_024 (F)'], - 'wagontrain_forest_000': ['collision_camera_014 (F)'], - 'wagontrain_forest_000_platform': ['collision_camera_014 (F)'], - 'waterzone_000': ['collision_camera_012 (F)'], - 'waterzone_001': ['collision_camera_001 (F)'], - 'waterzone_002': ['collision_camera_033 (F)'], - 'waterzone_003': ['collision_camera_034 (F)'], - 'waterzone_004': ['collision_camera_001 (F)'], - 'waterzone_005': ['collision_camera_030 (F)'], - 'waterzone_006': ['collision_camera_038_A (F)'], - 'weightactivatedplatform_energy_000': ['collision_camera_019 (F)'], - 'weightactivatedplatform_total_000': ['collision_camera_002 (F)'], - 'weightactivatedplatform_total_001': ['collision_camera_024 (F)'], - 'zipline_bottom_gen_000': ['collision_camera_034 (F)'], - 'zipline_bottom_gen_002': ['collision_camera_033 (F)'], - 'zipline_bottom_gen_004': ['collision_camera_032 (F)']}, - 's080_shipyard': {'AP_10': ['collision_camera_003 (H)'], - 'CAM_Default': ['collision_camera_001 (H)'], - 'CAM_Far_Atrium': ['collision_camera_004 (H)'], - 'CAM_PreElite': ['collision_camera_006 (H)'], - 'CAM_PreElite2': ['collision_camera_006 (H)'], - 'CAM_Train': ['collision_camera_001 (H)'], - 'CamRailTrain': ['collision_camera_001 (H)'], - 'CameraRailAtriumEscape': ['collision_camera_004 (H)'], - 'CameraRailAtriumEscape_Left': ['collision_camera_004 (H)'], - 'CameraRailAtriumEscape_Right': ['collision_camera_004 (H)'], - 'CameraRail_PreElite': ['collision_camera_006 (H)'], - 'CoolShineLeftBottomVisited': ['collision_camera_004 (H)'], - 'CoolShineLeftTopVisited': ['collision_camera_004 (H)'], - 'CoolShineRightBottomVisited': ['collision_camera_016 (H)'], - 'CoolShineRightTopVisited': ['collision_camera_004 (H)'], - 'CoolShineUpViewed': ['collision_camera_004 (H)'], - 'CoolShineUpVisited': ['collision_camera_004 (H)'], - 'LM_Samus_Ship': ['collision_camera_008 (H)'], - 'LS_EmmyZone': ['collision_camera_012 (H)'], - 'PRP_CUDeactivated': ['collision_camera_012 (H)'], - 'PRP_EmmyShipyard': ['collision_camera_014 (H)'], - 'SP_AccessPoint_10': ['collision_camera_004 (H)'], - 'SP_AccessPoint_10B': ['collision_camera_009 (H)'], - 'SP_Checkpoint_CommanderX': ['collision_camera_020 (H)'], - 'SP_Checkpoint_Dead_CWX_Elite': ['collision_camera_005 (H)'], - 'SP_Checkpoint_Dead_ChozoWarriorX': ['collision_camera_014 (H)'], - 'SP_Checkpoint_EliteChozoWarriorX': ['collision_camera_006 (H)'], - 'SP_Checkpoint_Endgame': ['collision_camera_008 (H)'], - 'SP_Checkpoint_Escape': ['collision_camera_020 (H)'], - 'SP_Checkpoint_PowerBomb': ['collision_camera_011 (H)'], - 'SP_Checkpoint_StrongReaction': ['collision_camera_009 (H)'], - 'SP_Emmy': ['collision_camera_013 (H)'], - 'StartPoint0': ['collision_camera_001 (H)'], - 'TG_Activation_Escape_Sequence': ['collision_camera_020 (H)'], - 'TG_ChangeCamera_005_B': ['collision_camera_005 (H)'], - 'TG_ChangeCamera_006_B': ['collision_camera_006 (H)'], - 'TG_ChangeCamera_009_B': ['collision_camera_009 (H)'], - 'TG_ChangeCamera_009_C': ['collision_camera_009 (H)'], - 'TG_ChangeCamera_013_B': ['collision_camera_013 (H)'], - 'TG_ChangeCamera_013_C': ['collision_camera_013 (H)'], - 'TG_ChangeCamera_014_B': ['collision_camera_014 (H)'], - 'TG_CoolShineLeftBottom': ['collision_camera_004 (H)'], - 'TG_CoolShineLeftTop': ['collision_camera_004 (H)'], - 'TG_CoolShineRightBottom': ['collision_camera_016 (H)'], - 'TG_CoolShineRightTop': ['collision_camera_004 (H)'], - 'TG_CoolShineUp': ['collision_camera_004 (H)'], - 'TG_Cool_Shinespark_Begin': ['collision_camera_004 (H)'], - 'TG_Cool_Shinespark_End': ['collision_camera_004 (H)'], - 'TG_EscapeSequence_Drop_01': ['collision_camera_015 (H)'], - 'TG_EscapeSequence_Drop_02': ['collision_camera_015 (H)'], - 'TG_EscapeSequence_Drop_03': ['collision_camera_011 (H)'], - 'TG_EscapeSequence_Drop_04': ['collision_camera_004 (H)'], - 'accesspoint_000': ['collision_camera_003 (H)'], - 'ammorecharge_000': ['collision_camera_004 (H)'], - 'ammorecharge_000_platform': ['collision_camera_004 (H)'], - 'block_cut43': ['collision_camera_014 (H)'], - 'block_hyperbeam_000': ['collision_camera_004 (H)'], - 'block_pbtube': ['collision_camera_004 (H)'], - 'block_pbtube_003': ['collision_camera_004 (H)'], - 'block_pbtube_2': ['collision_camera_013 (H)'], - 'breakablehint_000': ['collision_camera_009 (H)'], - 'breakablehint_001': ['collision_camera_006 (H)'], - 'breakabletilegroup_000': ['collision_camera_020 (H)'], - 'breakabletilegroup_001': ['collision_camera_019 (H)'], - 'breakabletilegroup_002': ['collision_camera_019 (H)'], - 'breakabletilegroup_003': ['collision_camera_019 (H)'], - 'breakabletilegroup_004': ['collision_camera_018 (H)'], - 'breakabletilegroup_006': ['collision_camera_018 (H)'], - 'breakabletilegroup_007': ['collision_camera_018 (H)'], - 'breakabletilegroup_008': ['collision_camera_018 (H)'], - 'breakabletilegroup_009': ['collision_camera_018 (H)'], - 'breakabletilegroup_010': ['collision_camera_018 (H)'], - 'breakabletilegroup_011': ['collision_camera_015 (H)'], - 'breakabletilegroup_012': ['collision_camera_016 (H)'], - 'breakabletilegroup_013': ['collision_camera_016 (H)'], - 'breakabletilegroup_014': ['collision_camera_016 (H)'], - 'breakabletilegroup_015': ['collision_camera_016 (H)'], - 'breakabletilegroup_016': ['collision_camera_016 (H)'], - 'breakabletilegroup_017': ['collision_camera_016 (H)'], - 'breakabletilegroup_018': ['collision_camera_016 (H)'], - 'breakabletilegroup_020': ['collision_camera_016 (H)'], - 'breakabletilegroup_021': ['collision_camera_016 (H)'], - 'breakabletilegroup_022': ['collision_camera_016 (H)'], - 'breakabletilegroup_023': ['collision_camera_016 (H)'], - 'breakabletilegroup_025': ['collision_camera_016 (H)'], - 'breakabletilegroup_026': ['collision_camera_016 (H)'], - 'breakabletilegroup_027': ['collision_camera_016 (H)'], - 'breakabletilegroup_028': ['collision_camera_016 (H)'], - 'breakabletilegroup_029': ['collision_camera_016 (H)'], - 'breakabletilegroup_030': ['collision_camera_009 (H)'], - 'breakabletilegroup_031': ['collision_camera_004 (H)'], - 'breakabletilegroup_032': ['collision_camera_004 (H)'], - 'breakabletilegroup_033': ['collision_camera_010 (H)'], - 'breakabletilegroup_034': ['collision_camera_011 (H)'], - 'breakabletilegroup_035': ['collision_camera_015 (H)'], - 'breakabletilegroup_036': ['collision_camera_002 (H)'], - 'breakabletilegroup_037': ['collision_camera_015 (H)'], - 'breakabletilegroup_038': ['collision_camera_002 (H)'], - 'breakabletilegroup_039': ['collision_camera_002 (H)'], - 'breakabletilegroup_040': ['collision_camera_002 (H)'], - 'breakabletilegroup_041': ['collision_camera_002 (H)'], - 'breakabletilegroup_042': ['collision_camera_002 (H)'], - 'breakabletilegroup_043': ['collision_camera_002 (H)'], - 'breakabletilegroup_044': ['collision_camera_016 (H)'], - 'breakabletilegroup_045': ['collision_camera_010 (H)'], - 'breakabletilegroup_046': ['collision_camera_009 (H)'], - 'breakabletilegroup_047': ['collision_camera_011 (H)'], - 'breakabletilegroup_049': ['collision_camera_006 (H)'], - 'breakablevignette_Escape_001': ['collision_camera_015 (H)'], - 'breakablevignette_Escape_002': ['collision_camera_016 (H)'], - 'capsulelaunchershipyard_000': ['collision_camera_007 (H)'], - 'centralunitmagmacontroller_000': ['collision_camera_012 (H)'], - 'centralunitshipyard': ['collision_camera_012 (H)'], - 'doorclosedpower_000': ['collision_camera_003 (H)', 'collision_camera_009 (H)'], - 'doorclosedpower_001': ['collision_camera_009 (H)', 'collision_camera_010 (H)'], - 'dooremmy_000': ['collision_camera_010 (H)', 'collision_camera_011 (H)'], - 'dooremmy_001': ['collision_camera_010 (H)', 'collision_camera_011 (H)'], - 'dooremmy_002': ['collision_camera_013 (H)', 'collision_camera_015 (H)'], - 'dooremmy_003': ['collision_camera_013 (H)', 'collision_camera_015 (H)'], - 'doorpowerclosed_000': ['collision_camera_009 (H)', 'collision_camera_010 (H)'], - 'doorpowerclosed_001': ['collision_camera_011 (H)', 'collision_camera_014 (H)'], - 'doorpowerpower_000': ['collision_camera_001 (H)', 'collision_camera_004 (H)'], - 'doorpowerpower_001': ['collision_camera_003 (H)', 'collision_camera_004 (H)'], - 'doorpowerpower_002': ['collision_camera_003 (H)', 'collision_camera_009 (H)'], - 'doorpowerpower_004': ['collision_camera_000 (H)', 'collision_camera_002 (H)'], - 'doorpowerpower_005': ['collision_camera_004 (H)', 'collision_camera_006 (H)'], - 'doorpowerpower_006': ['collision_camera_005 (H)', 'collision_camera_006 (H)'], - 'doorpowerpower_007': ['collision_camera_005 (H)', 'collision_camera_007 (H)'], - 'doorwavebeam': ['collision_camera_005 (H)', 'collision_camera_006 (H)'], - 'doorwavebeam_000': ['collision_camera_009 (H)', 'collision_camera_010 (H)'], - 'doorwavebeam_001': ['collision_camera_011 (H)', 'collision_camera_014 (H)'], - 'doorwavebeam_002': ['collision_camera_004 (H)', 'collision_camera_006 (H)'], - 'doorwavebeam_003': ['collision_camera_003 (H)', 'collision_camera_009 (H)'], - 'elevator_sanctuary_000': ['collision_camera_000 (H)'], - 'elevator_sanctuary_000_platform': ['collision_camera_000 (H)'], - 'elevator_skybase_000_platform': ['collision_camera_007 (H)'], - 'emmyvalve_reg_gen_000': ['collision_camera_013 (H)'], - 'emmyvalve_reg_gen_001': ['collision_camera_014 (H)'], - 'escape_explosion_big': ['collision_camera_008 (H)'], - 'escape_explosion_big_000': ['collision_camera_008 (H)'], - 'escape_explosion_big_001': ['collision_camera_008 (H)'], - 'escape_explosion_big_002': ['collision_camera_008 (H)'], - 'escape_explosion_big_003': ['collision_camera_008 (H)'], - 'escape_explosion_big_004': ['collision_camera_008 (H)'], - 'escape_explosion_big_005': ['collision_camera_008 (H)'], - 'escape_explosion_big_006': ['collision_camera_008 (H)'], - 'escape_explosion_big_008': ['collision_camera_008 (H)'], - 'escape_explosion_big_009': ['collision_camera_008 (H)'], - 'escape_explosion_big_010': ['collision_camera_008 (H)'], - 'escape_explosion_big_011': ['collision_camera_008 (H)'], - 'escape_explosion_big_012': ['collision_camera_008 (H)'], - 'escape_explosion_big_013': ['collision_camera_008 (H)'], - 'escape_explosion_big_014': ['collision_camera_008 (H)'], - 'escape_explosion_big_015': ['collision_camera_004 (H)'], - 'escape_explosion_big_016': ['collision_camera_004 (H)'], - 'escape_explosion_big_017': ['collision_camera_004 (H)'], - 'escape_explosion_big_018': ['collision_camera_004 (H)'], - 'escape_explosion_big_019': ['collision_camera_004 (H)'], - 'escape_explosion_big_020': ['collision_camera_004 (H)'], - 'escape_explosion_big_021': ['collision_camera_004 (H)'], - 'escape_explosion_big_022': ['collision_camera_004 (H)'], - 'escape_explosion_big_023': ['collision_camera_004 (H)'], - 'escape_explosion_big_024': ['collision_camera_004 (H)'], - 'escape_explosion_big_025': ['collision_camera_004 (H)'], - 'escape_explosion_big_026': ['collision_camera_004 (H)'], - 'escape_explosion_big_027': ['collision_camera_019 (H)'], - 'escape_explosion_big_028': ['collision_camera_018 (H)'], - 'escape_explosion_big_029': ['collision_camera_019 (H)'], - 'escape_explosion_big_030': ['collision_camera_018 (H)'], - 'escape_explosion_big_031': ['collision_camera_018 (H)'], - 'escape_explosion_big_032': ['collision_camera_015 (H)'], - 'escape_explosion_big_033': ['collision_camera_015 (H)'], - 'escape_explosion_big_034': ['collision_camera_015 (H)'], - 'escape_explosion_big_035': ['collision_camera_013 (H)'], - 'escape_explosion_big_036': ['collision_camera_013 (H)'], - 'escape_explosion_big_037': ['collision_camera_013 (H)'], - 'escape_explosion_big_038': ['collision_camera_012 (H)'], - 'escape_explosion_big_039': ['collision_camera_012 (H)'], - 'escape_explosion_big_040': ['collision_camera_012 (H)'], - 'escape_explosion_big_041': ['collision_camera_011 (H)'], - 'escape_explosion_big_042': ['collision_camera_011 (H)'], - 'escape_explosion_big_043': ['collision_camera_010 (H)'], - 'escape_explosion_big_044': ['collision_camera_010 (H)'], - 'escape_explosion_big_045': ['collision_camera_010 (H)'], - 'escape_explosion_big_046': ['collision_camera_010 (H)'], - 'escape_explosion_big_047': ['collision_camera_010 (H)'], - 'escape_explosion_big_048': ['collision_camera_011 (H)'], - 'escape_explosion_big_049': ['collision_camera_011 (H)'], - 'escape_explosion_big_050': ['collision_camera_016 (H)'], - 'escape_explosion_big_051': ['collision_camera_016 (H)'], - 'escape_explosion_big_052': ['collision_camera_016 (H)'], - 'escape_explosion_big_053': ['collision_camera_016 (H)'], - 'escape_explosion_big_054': ['collision_camera_016 (H)'], - 'escape_explosion_big_055': ['collision_camera_016 (H)'], - 'escape_explosion_big_056': ['collision_camera_016 (H)'], - 'escape_explosion_big_057': ['collision_camera_016 (H)'], - 'escape_explosion_big_058': ['collision_camera_016 (H)'], - 'escape_explosion_big_059': ['collision_camera_016 (H)'], - 'escape_explosion_big_060': ['collision_camera_016 (H)'], - 'escape_explosion_big_061': ['collision_camera_016 (H)'], - 'escape_explosion_big_062': ['collision_camera_016 (H)'], - 'escape_explosion_big_063': ['collision_camera_016 (H)'], - 'escape_explosion_big_064': ['collision_camera_016 (H)'], - 'escape_explosion_big_065': ['collision_camera_016 (H)'], - 'escape_explosion_big_066': ['collision_camera_016 (H)'], - 'escape_explosion_big_067': ['collision_camera_016 (H)'], - 'escape_explosion_big_068': ['collision_camera_004 (H)'], - 'escape_explosion_big_069': ['collision_camera_004 (H)'], - 'escape_explosion_big_070': ['collision_camera_008 (H)'], - 'escape_explosion_big_071': ['collision_camera_008 (H)'], - 'escape_explosion_medium': ['collision_camera_011 (H)'], - 'escape_explosion_medium_000': ['collision_camera_011 (H)'], - 'escape_explosion_medium_001': ['collision_camera_010 (H)'], - 'escape_explosion_medium_002': ['collision_camera_010 (H)'], - 'escape_explosion_medium_003': ['collision_camera_010 (H)'], - 'escape_explosion_medium_004': ['collision_camera_010 (H)'], - 'escape_explosion_medium_005': ['collision_camera_011 (H)'], - 'escape_explosion_medium_006': ['collision_camera_016 (H)'], - 'escape_explosion_medium_007': ['collision_camera_016 (H)'], - 'escape_explosion_medium_008': ['collision_camera_016 (H)'], - 'escape_explosion_medium_009': ['collision_camera_016 (H)'], - 'escape_explosion_medium_010': ['collision_camera_016 (H)'], - 'escape_explosion_medium_011': ['collision_camera_016 (H)'], - 'escape_explosion_medium_012': ['collision_camera_016 (H)'], - 'escape_explosion_medium_013': ['collision_camera_016 (H)'], - 'escape_explosion_medium_014': ['collision_camera_016 (H)'], - 'escape_explosion_medium_015': ['collision_camera_016 (H)'], - 'escape_explosion_medium_016': ['collision_camera_016 (H)'], - 'escape_explosion_medium_017': ['collision_camera_016 (H)'], - 'escape_explosion_medium_018': ['collision_camera_016 (H)'], - 'escape_explosion_medium_019': ['collision_camera_016 (H)'], - 'escape_explosion_medium_020': ['collision_camera_004 (H)'], - 'escape_explosion_medium_021': ['collision_camera_004 (H)'], - 'escape_explosion_medium_022': ['collision_camera_004 (H)'], - 'escape_explosion_medium_023': ['collision_camera_004 (H)'], - 'escape_explosion_medium_024': ['collision_camera_004 (H)'], - 'escape_explosion_medium_025': ['collision_camera_011 (H)'], - 'escape_explosion_medium_026': ['collision_camera_010 (H)'], - 'escape_explosion_medium_027': ['collision_camera_016 (H)'], - 'escape_explosion_medium_028': ['collision_camera_016 (H)'], - 'escape_explosion_medium_029': ['collision_camera_016 (H)'], - 'escape_explosion_medium_030': ['collision_camera_016 (H)'], - 'escape_explosion_medium_031': ['collision_camera_016 (H)'], - 'escape_explosion_medium_032': ['collision_camera_016 (H)'], - 'escape_explosion_medium_033': ['collision_camera_004 (H)'], - 'escape_explosion_medium_034': ['collision_camera_019 (H)'], - 'escape_explosion_medium_035': ['collision_camera_018 (H)'], - 'escape_explosion_medium_036': ['collision_camera_019 (H)'], - 'escape_explosion_medium_037': ['collision_camera_018 (H)'], - 'escape_explosion_medium_038': ['collision_camera_018 (H)'], - 'escape_explosion_medium_039': ['collision_camera_018 (H)'], - 'escape_explosion_medium_040': ['collision_camera_015 (H)'], - 'escape_explosion_medium_041': ['collision_camera_015 (H)'], - 'escape_explosion_medium_042': ['collision_camera_015 (H)'], - 'escape_explosion_medium_043': ['collision_camera_013 (H)'], - 'escape_explosion_medium_044': ['collision_camera_013 (H)'], - 'escape_explosion_medium_045': ['collision_camera_013 (H)'], - 'escape_explosion_medium_046': ['collision_camera_012 (H)'], - 'escape_explosion_medium_047': ['collision_camera_012 (H)'], - 'escape_explosion_medium_048': ['collision_camera_012 (H)'], - 'escape_explosion_medium_049': ['collision_camera_016 (H)'], - 'escape_explosion_medium_050': ['collision_camera_004 (H)'], - 'escape_explosion_medium_051': ['collision_camera_004 (H)'], - 'escape_explosion_medium_052': ['collision_camera_004 (H)'], - 'escape_explosion_medium_053': ['collision_camera_004 (H)'], - 'escape_explosion_medium_054': ['collision_camera_004 (H)'], - 'escape_explosion_medium_055': ['collision_camera_004 (H)'], - 'escape_explosion_medium_056': ['collision_camera_004 (H)'], - 'escape_explosion_medium_057': ['collision_camera_004 (H)'], - 'escape_explosion_medium_058': ['collision_camera_004 (H)'], - 'escape_explosion_medium_059': ['collision_camera_004 (H)'], - 'escape_explosion_medium_060': ['collision_camera_008 (H)'], - 'escape_explosion_medium_061': ['collision_camera_008 (H)'], - 'escape_explosion_medium_062': ['collision_camera_008 (H)'], - 'escape_explosion_medium_063': ['collision_camera_008 (H)'], - 'escape_explosion_medium_064': ['collision_camera_008 (H)'], - 'escape_explosion_medium_065': ['collision_camera_008 (H)'], - 'escape_explosion_medium_066': ['collision_camera_008 (H)'], - 'escape_explosion_medium_067': ['collision_camera_008 (H)'], - 'escape_explosion_medium_068': ['collision_camera_008 (H)'], - 'escape_explosion_medium_069': ['collision_camera_008 (H)'], - 'escape_explosion_medium_070': ['collision_camera_008 (H)'], - 'escape_explosion_medium_071': ['collision_camera_008 (H)'], - 'escape_explosion_medium_072': ['collision_camera_008 (H)'], - 'escape_explosion_path_01': ['collision_camera_015 (H)'], - 'escape_explosion_path_02': ['collision_camera_015 (H)'], - 'escape_explosion_path_03': ['collision_camera_011 (H)'], - 'escape_explosion_small': ['collision_camera_011 (H)'], - 'escape_explosion_small_000': ['collision_camera_019 (H)'], - 'escape_explosion_small_001': ['collision_camera_018 (H)'], - 'escape_explosion_small_002': ['collision_camera_018 (H)'], - 'escape_explosion_small_003': ['collision_camera_015 (H)'], - 'escape_explosion_small_004': ['collision_camera_015 (H)'], - 'escape_explosion_small_005': ['collision_camera_013 (H)'], - 'escape_explosion_small_006': ['collision_camera_013 (H)'], - 'escape_explosion_small_007': ['collision_camera_012 (H)'], - 'escape_explosion_small_008': ['collision_camera_012 (H)'], - 'escape_explosion_small_009': ['collision_camera_018 (H)'], - 'escape_explosion_small_010': ['collision_camera_019 (H)'], - 'escape_explosion_small_011': ['collision_camera_019 (H)'], - 'escape_explosion_small_012': ['collision_camera_018 (H)'], - 'escape_explosion_small_013': ['collision_camera_015 (H)'], - 'escape_explosion_small_014': ['collision_camera_013 (H)'], - 'escape_explosion_small_015': ['collision_camera_012 (H)'], - 'escape_explosion_small_016': ['collision_camera_011 (H)'], - 'escape_explosion_small_017': ['collision_camera_010 (H)'], - 'escape_explosion_small_018': ['collision_camera_010 (H)'], - 'escape_explosion_small_019': ['collision_camera_010 (H)'], - 'escape_explosion_small_020': ['collision_camera_010 (H)'], - 'escape_explosion_small_021': ['collision_camera_010 (H)'], - 'escape_explosion_small_022': ['collision_camera_011 (H)'], - 'escape_explosion_small_023': ['collision_camera_011 (H)'], - 'escape_explosion_small_024': ['collision_camera_016 (H)'], - 'escape_explosion_small_025': ['collision_camera_016 (H)'], - 'escape_explosion_small_026': ['collision_camera_016 (H)'], - 'escape_explosion_small_027': ['collision_camera_016 (H)'], - 'escape_explosion_small_028': ['collision_camera_016 (H)'], - 'escape_explosion_small_029': ['collision_camera_016 (H)'], - 'escape_explosion_small_030': ['collision_camera_016 (H)'], - 'escape_explosion_small_031': ['collision_camera_016 (H)'], - 'escape_explosion_small_032': ['collision_camera_016 (H)'], - 'escape_explosion_small_033': ['collision_camera_016 (H)'], - 'escape_explosion_small_034': ['collision_camera_016 (H)'], - 'escape_explosion_small_035': ['collision_camera_016 (H)'], - 'escape_explosion_small_036': ['collision_camera_016 (H)'], - 'escape_explosion_small_037': ['collision_camera_016 (H)'], - 'escape_explosion_small_038': ['collision_camera_016 (H)'], - 'escape_explosion_small_039': ['collision_camera_016 (H)'], - 'escape_explosion_small_040': ['collision_camera_016 (H)'], - 'escape_explosion_small_041': ['collision_camera_016 (H)'], - 'escape_explosion_small_042': ['collision_camera_016 (H)'], - 'escape_explosion_small_043': ['collision_camera_016 (H)'], - 'escape_explosion_small_044': ['collision_camera_004 (H)'], - 'escape_explosion_small_045': ['collision_camera_004 (H)'], - 'escape_explosion_small_046': ['collision_camera_004 (H)'], - 'escape_explosion_small_047': ['collision_camera_004 (H)'], - 'escape_explosion_small_048': ['collision_camera_004 (H)'], - 'escape_explosion_small_049': ['collision_camera_004 (H)'], - 'escape_explosion_small_050': ['collision_camera_004 (H)'], - 'escape_explosion_small_051': ['collision_camera_004 (H)'], - 'escape_explosion_small_052': ['collision_camera_004 (H)'], - 'escape_explosion_small_053': ['collision_camera_004 (H)'], - 'escape_explosion_small_054': ['collision_camera_004 (H)'], - 'escape_explosion_small_055': ['collision_camera_004 (H)'], - 'escape_explosion_small_056': ['collision_camera_008 (H)'], - 'escape_explosion_small_057': ['collision_camera_008 (H)'], - 'escape_explosion_small_058': ['collision_camera_008 (H)'], - 'escape_explosion_small_059': ['collision_camera_008 (H)'], - 'escape_explosion_small_060': ['collision_camera_008 (H)'], - 'escape_explosion_small_061': ['collision_camera_008 (H)'], - 'escape_explosion_small_062': ['collision_camera_008 (H)'], - 'escape_explosion_small_063': ['collision_camera_008 (H)'], - 'escape_explosion_small_064': ['collision_camera_008 (H)'], - 'escape_explosion_small_065': ['collision_camera_008 (H)'], - 'escape_explosion_small_066': ['collision_camera_008 (H)'], - 'escape_explosion_small_067': ['collision_camera_008 (H)'], - 'escape_explosion_small_068': ['collision_camera_008 (H)'], - 'escape_glass_01': ['collision_camera_004 (H)'], - 'escape_glass_02': ['collision_camera_004 (H)'], - 'escape_glass_03': ['collision_camera_004 (H)'], - 'ev_escape_1': ['collision_camera_015 (H)'], - 'ev_escape_2_end': ['collision_camera_011 (H)'], - 'ev_escape_2_init': ['collision_camera_011 (H)'], - 'ev_escape_3': ['collision_camera_004 (H)'], - 'ev_escape_4': ['collision_camera_015 (H)'], - 'ev_evacuation': ['collision_camera_020 (H)'], - 'ev_shi_ray02_005': [], - 'ev_shi_rayimpact01': ['collision_camera_009 (H)'], - 'grapplepulloff1x2': ['collision_camera_002 (H)', 'collision_camera_009 (H)'], - 'grapplepulloff1x2_000': ['collision_camera_002 (H)'], - 'grapplepulloff1x2_001': ['collision_camera_006 (H)'], - 'item_missiletank': ['collision_camera_002 (H)'], - 'item_missiletank_000': ['collision_camera_006 (H)'], - 'item_powerbombtank_000': ['collision_camera_009 (H)'], - 'mapev_atriumdebris': ['collision_camera_004 (H)'], - 'sg_vignette000': ['collision_camera_004 (H)'], - 'sg_vignette001': ['collision_camera_016 (H)'], - 'totalrechargestation_000': ['collision_camera_015 (H)'], - 'totalrechargestation_001': ['collision_camera_006 (H)'], - 'trigger_PowerBombObtained': ['collision_camera_014 (H)'], - 'wagontrain_forest_000': ['collision_camera_001 (H)'], - 'wagontrain_forest_000_platform': ['collision_camera_001 (H)'], - 'weightactivatedplatform_access_000': ['collision_camera_003 (H)'], - 'weightactivatedplatform_total_000': ['collision_camera_015 (H)'], - 'weightactivatedplatform_total_001': ['collision_camera_006 (H)']}, - 's090_skybase': { - 'CAM_Default': ['collision_camera_001 (I)'], - 'CAM_Far': ['collision_camera_001 (I)'], - 'CAM_Near': ['collision_camera_002 (I)'], - 'CAM_Near_Left': ['collision_camera_002 (I)'], - 'CAM_Near_Right': ['collision_camera_002 (I)'], - 'SP_Checkpoint_Commander': ['collision_camera_002 (I)'], - 'StartPoint0': ['collision_camera_001 (I)'], - 'TG_ChangeCamera_002_Far': ['collision_camera_002 (I)'], - 'TG_ChangeCamera_002_Near': ['collision_camera_002 (I)'], - 'TG_ChangeInterp_002': ['collision_camera_002 (I)'], - 'TG_Snapshot_Checkpoint_Commander': ['collision_camera_002 (I)'], - 'accesspoint_vignette': ['collision_camera_005 (I)'], - 'accesspointcommander_000': ['collision_camera_005 (I)'], - 'block_pbcolumn_000': ['collision_camera_002 (I)'], - 'camerarailpath_000': ['collision_camera_001 (I)'], - 'camerarailpath_Raven': ['collision_camera_002 (I)'], - 'capsule_commander_000': [], - 'capsuleelevatorskybase_000': ['collision_camera_001 (I)'], - 'commander_elevator': ['collision_camera_002 (I)'], - 'doorpowerpower_000': ['collision_camera_000 (I)', 'collision_camera_001 (I)'], - 'doorpowerpower_001': ['collision_camera_000 (I)', 'collision_camera_002 (I)'], - 'elevator_shipyard_000_platform': ['collision_camera_001 (I)'], - 'energyfield': ['collision_camera_004 (I)'], - 'energyfield_grabs': ['collision_camera_004 (I)'], - 'savestation_000': ['collision_camera_000 (I)'], - 'savestation_000_platform': ['collision_camera_000 (I)'], - 'skybase_000': [], - 'totalrechargestation_000': ['collision_camera_001 (I)'], - 'weightactivatedplatform_commanderelevator_000': ['collision_camera_002 (I)'], - 'weightactivatedplatform_total_000': ['collision_camera_001 (I)']}} + "s010_cave": { + "AP_01": ["collision_camera_068 (A)"], + "AP_02": ["collision_camera_065 (A)"], + "AccessPointTutoTrigger": ["collision_camera_068 (A)"], + "CAM_Default": [], + "CAM_Far": ["collision_camera_023 (A)"], + "CAM_Far_Chasing": ["collision_camera_023 (A)"], + "CamTunnel": ["collision_camera_055 (A)"], + "CamTunnel_R": ["collision_camera_055 (A)"], + "Cam_PreChain": ["collision_camera_026 (A)"], + "Door001 (CG-CG)": ["collision_camera_013 (A)", "collision_camera_014 (A)"], + "Door002 (CG-CG)": ["collision_camera_000_Init (A)", "collision_camera_013 (A)"], + "Door003 (PW-PW)": ["collision_camera_013 (A)", "collision_camera_062 (A)"], + "Door003_missileShield": ["collision_camera_013 (A)", "collision_camera_062 (A)"], + "Door004 (PW-PW)": ["collision_camera_013 (A)", "collision_camera_062 (A)"], + "Door004 (PW-PW)_001": ["collision_camera_062 (A)", "collision_camera_086 (A)"], + "Door005 (PW-PW)": ["collision_camera_045 (A)", "collision_camera_054 (A)"], + "Door006 (CG-CG)": ["collision_camera_000 (A)", "collision_camera_001 (A)"], + "Door007 (CG-CG)": ["collision_camera_001 (A)", "collision_camera_002 (A)"], + "Door008 (PW-PW)": ["collision_camera_002 (A)", "collision_camera_068 (A)"], + "Door009 (PW-PW)": ["collision_camera_000 (A)", "collision_camera_068 (A)"], + "Door010 (CL-PW,OP)": ["collision_camera_003 (A)", "collision_camera_016 (A)"], + "Door011 (CG-CG)": ["collision_camera_003 (A)", "collision_camera_004 (A)"], + "Door012 (PW-PW, MISSILE)": ["collision_camera_003 (A)", "collision_camera_063 (A)"], + "Door014 (CG-CG)": ["collision_camera_005 (A)", "collision_camera_018 (A)"], + "Door015 (CG-CG)": ["collision_camera_017 (A)", "collision_camera_049 (A)"], + "Door016 (PW-PW)": ["collision_camera_015 (A)", "collision_camera_017 (A)"], + "Door017 (CU)_000": ["collision_camera_049 (A)"], + "Door018 (CG-CL,OP)": ["collision_camera_005 (A)", "collision_camera_017 (A)"], + "Door020 (PW-PW)": ["collision_camera_008 (A)", "collision_camera_009 (A)"], + "Door021 (PW-PW)": ["collision_camera_058 (A)", "collision_camera_060 (A)"], + "Door021 (PW-PW)_000": ["collision_camera_059 (A)", "collision_camera_060 (A)"], + "Door022 (PW-PW) ": ["collision_camera_056 (A)", "collision_camera_058 (A)"], + "Door022 (PW-PW) _000": ["collision_camera_056 (A)", "collision_camera_059 (A)"], + "Door023 (PW-PW)": ["collision_camera_012 (A)", "collision_camera_056 (A)"], + "Door024 (PW-PW)": ["collision_camera_011 (A)", "collision_camera_012 (A)"], + "Door025 (PW-PW)": ["collision_camera_009 (A)", "collision_camera_048 (A)"], + "Door026 (PW-PW)": ["collision_camera_006 (A)", "collision_camera_008 (A)"], + "Door028": ["collision_camera_008 (A)", "collision_camera_009 (A)"], + "Door029 (CG-CL,OP)": ["collision_camera_021 (A)", "collision_camera_065 (A)"], + "Door030 (PW-PW)": ["collision_camera_050 (A)", "collision_camera_065 (A)"], + "Door032 (CG-CG)": ["collision_camera_022 (A)", "collision_camera_023 (A)"], + "Door033 (PW-PW)": ["collision_camera_066 (A)", "collision_camera_067 (A)"], + "Door034 (PW-PW)": ["collision_camera_025 (A)", "collision_camera_066 (A)"], + "Door035 (PW-PW)": ["collision_camera_024 (A)", "collision_camera_025 (A)"], + "Door036 (PW-PW)": ["collision_camera_023 (A)", "collision_camera_024 (A)"], + "Door037 (CG-CG)": ["collision_camera_023_B (A)", "collision_camera_024 (A)"], + "Door038 (PW-PW)": ["collision_camera_004 (A)", "collision_camera_063 (A)"], + "Door038 (PW-PW)_000": ["collision_camera_004 (A)", "collision_camera_072 (A)"], + "Door041 (TH)": ["collision_camera_006 (A)", "collision_camera_008 (A)"], + "Door042 (PW-PW) ": ["collision_camera_065 (A)", "collision_camera_070 (A)"], + "Door044 (TH)": ["collision_camera_021 (A)", "collision_camera_022 (A)"], + "Door045 (TH)": ["collision_camera_022 (A)", "collision_camera_067 (A)"], + "Door046 (PW-CL,OP)": ["collision_camera_066 (A)", "collision_camera_067 (A)"], + "Door049 (PR-PR)": ["collision_camera_050 (A)", "collision_camera_073 (A)"], + "Door050 (TH)": ["collision_camera_006 (A)", "collision_camera_015 (A)"], + "Door052": ["collision_camera_072 (A)", "collision_camera_073 (A)"], + "Door053": ["collision_camera_026 (A)", "collision_camera_055 (A)"], + "Door054": ["collision_camera_011 (A)", "collision_camera_055 (A)"], + "Door055": ["collision_camera_026 (A)", "collision_camera_028 (A)"], + "Door055 (PW-PW)": ["collision_camera_003 (A)", "collision_camera_016 (A)"], + "Door056": ["collision_camera_011 (A)", "collision_camera_028 (A)"], + "Door056 (CU)": ["collision_camera_064 (A)", "collision_camera_074 (A)"], + "Door057": ["collision_camera_026 (A)", "collision_camera_029 (A)"], + "Door057 (TH)": ["collision_camera_065 (A)", "collision_camera_070 (A)"], + "Door058": ["collision_camera_029 (A)", "collision_camera_031 (A)"], + "Door058 (PW-PW)": ["collision_camera_016 (A)", "collision_camera_064 (A)"], + "Door059": ["collision_camera_030 (A)", "collision_camera_031 (A)"], + "Door059 (CL-PW)": ["collision_camera_017 (A)", "collision_camera_049 (A)"], + "Door059_missileShield": ["collision_camera_030 (A)", "collision_camera_031 (A)"], + "Door060": ["collision_camera_024 (A)", "collision_camera_078 (A)"], + "Door062": ["collision_camera_077 (A)", "collision_camera_078 (A)"], + "Door062 (PW-PW, Special)": ["collision_camera_005 (A)", "collision_camera_006 (A)"], + "Door063": ["collision_camera_077 (A)", "collision_camera_079 (A)"], + "Door064": ["collision_camera_076 (A)", "collision_camera_088 (A)"], + "Door065": ["collision_camera_032 (A)", "collision_camera_076 (A)"], + "Door066": ["collision_camera_032 (A)", "collision_camera_034 (A)"], + "Door067": ["collision_camera_032 (A)", "collision_camera_089 (A)"], + "Door069": ["collision_camera_033 (A)", "collision_camera_089 (A)"], + "Door069_missileShield": ["collision_camera_033 (A)", "collision_camera_089 (A)"], + "Door070": ["collision_camera_080 (A)", "collision_camera_081 (A)"], + "Door070_missileShield": ["collision_camera_080 (A)", "collision_camera_081 (A)"], + "Door073": ["collision_camera_081 (A)", "collision_camera_085 (A)"], + "Door074": ["collision_camera_085 (A)", "collision_camera_056 (A)"], + "Door075": ["collision_camera_081 (A)", "collision_camera_082 (A)"], + "Door076": ["collision_camera_082 (A)", "collision_camera_056 (A)"], + "Door077": ["collision_camera_082 (A)", "collision_camera_091 (A)"], + "Door078": ["collision_camera_086 (A)", "collision_camera_091 (A)"], + "DoorEmmy01": ["collision_camera_054 (A)", "collision_camera_061 (A)"], + "DoorEmmy02": ["collision_camera_060 (A)", "collision_camera_075 (A)"], + "DoorEmmy03": ["collision_camera_011 (A)", "collision_camera_051 (A)"], + "DoorEmmy05": ["collision_camera_009 (A)", "collision_camera_088 (A)"], + "DoorEmmy06": ["collision_camera_008 (A)", "collision_camera_070 (A)"], + "DoorEmmy07": ["collision_camera_008 (A)", "collision_camera_070 (A)"], + "DoorEmmy08": ["collision_camera_050 (A)", "collision_camera_071 (A)"], + "DoorEmmy10": ["collision_camera_004 (A)", "collision_camera_005 (A)"], + "DoorEmmy10_000": ["collision_camera_004 (A)", "collision_camera_005 (A)"], + "DoorEmmy11": ["collision_camera_003 (A)", "collision_camera_018 (A)"], + "DoorFrame_001": ["collision_camera_048 (A)", "collision_camera_051 (A)"], + "DoorFrame_004": ["collision_camera_010 (A)", "collision_camera_075 (A)"], + "DoorFrame_005": ["collision_camera_010 (A)", "collision_camera_075 (A)"], + "DoorFrame_006": ["collision_camera_010 (A)", "collision_camera_069 (A)"], + "DoorFrame_007": ["collision_camera_010 (A)", "collision_camera_069 (A)"], + "DoorFrame_009": ["collision_camera_015 (A)", "collision_camera_017 (A)"], + "DoorFrame_010": ["collision_camera_015 (A)", "collision_camera_017 (A)"], + "DoorFrame_011": ["collision_camera_015 (A)", "collision_camera_017 (A)"], + "DoorFrame_012": ["collision_camera_015 (A)", "collision_camera_069 (A)"], + "DoorFrame_014": ["collision_camera_006 (A)", "collision_camera_053 (A)"], + "DoorFrame_015": ["collision_camera_008 (A)", "collision_camera_071 (A)"], + "DoorFrame_016": ["collision_camera_008 (A)", "collision_camera_071 (A)"], + "DoorFrame_017": ["collision_camera_010 (A)", "collision_camera_053 (A)"], + "DoorPowerPower_001": ["collision_camera_008 (A)", "collision_camera_071 (A)"], + "FreeAimTutoTriggerEnter": ["collision_camera_000 (A)"], + "FreeAimTutoTriggerExit": ["collision_camera_000 (A)"], + "HiddenBlocksTutoTriggerEnter": ["collision_camera_000 (A)"], + "HiddenBlocksTutoTriggerExit": ["collision_camera_000 (A)"], + "IT_VARIA_GEN_001": ["collision_camera_031 (A)"], + "ItemSphere_ChargeBeam": ["collision_camera_014 (A)"], + "ItemSphere_GrappleBeam": ["collision_camera_033 (A)"], + "ItemSphere_ScrewAttack": ["collision_camera_081 (A)"], + "Item_EnergyTank001": ["collision_camera_001 (A)"], + "Item_MissileTank001": ["collision_camera_005 (A)"], + "Item_MissileTank002": ["collision_camera_015 (A)"], + "Item_MissileTank003": ["collision_camera_056 (A)"], + "Item_MissileTank003_1": ["collision_camera_003 (A)"], + "Item_MissileTank004": ["collision_camera_011 (A)"], + "Item_MissileTank005": ["collision_camera_021 (A)"], + "Item_MissileTank006": ["collision_camera_067 (A)"], + "Item_MissileTank007": ["collision_camera_023_B (A)"], + "Item_MissileTank009": ["collision_camera_016 (A)"], + "Item_MissileTank010": ["collision_camera_054 (A)"], + "Item_MissileTank011": ["collision_camera_070 (A)"], + "Item_MissileTank012": ["collision_camera_078 (A)"], + "Item_MissileTank014": ["collision_camera_081 (A)"], + "Item_MissileTank015": ["collision_camera_082 (A)"], + "Item_MissileTank016": ["collision_camera_013 (A)"], + "LE_CentraUnitDestroyedProto": ["collision_camera_074 (A)"], + "LE_Elevator_FromMagma": ["collision_camera_077 (A)"], + "LE_GateProtoEmmy": ["collision_camera_016 (A)"], + "LE_MagnetSurface_01": ["collision_camera_005 (A)"], + "LE_MagnetSurface_03": ["collision_camera_005 (A)"], + "LE_MagnetSurface_03_000": ["collision_camera_005 (A)"], + "LE_MagnetSurface_05": ["collision_camera_015 (A)"], + "LE_MagnetSurface_05_000": ["collision_camera_017 (A)"], + "LE_MagnetSurface_06": ["collision_camera_069 (A)"], + "LE_MagnetSurface_07": ["collision_camera_010 (A)"], + "LE_MagnetSurface_08": ["collision_camera_010 (A)"], + "LE_MagnetSurface_09": ["collision_camera_010 (A)"], + "LE_MagnetSurface_09_000": ["collision_camera_048 (A)"], + "LE_MagnetSurface_10": ["collision_camera_023_B (A)"], + "LE_MagnetSurface_11": ["collision_camera_005 (A)"], + "LE_MagnetSurface_12": ["collision_camera_006 (A)"], + "LE_MagnetSurface_15": ["collision_camera_077 (A)"], + "LE_MagnetSurface_16": ["collision_camera_077 (A)"], + "LE_MagnetSurface_17": ["collision_camera_026 (A)"], + "LE_MagnetSurface_19": ["collision_camera_073 (A)"], + "LE_MagnetSurface_20": ["collision_camera_078 (A)"], + "LE_MagnetSurface_21": ["collision_camera_079 (A)"], + "LE_MagnetSurface_23": ["collision_camera_088 (A)"], + "LE_MagnetSurface_24": ["collision_camera_032 (A)"], + "LE_MagnetSurface_25": ["collision_camera_032 (A)"], + "LE_MagnetSurface_26": ["collision_camera_032 (A)"], + "LE_MagnetSurface_29": ["collision_camera_005 (A)"], + "LE_MagnetSurface_30": ["collision_camera_005 (A)"], + "LE_MagnetSurface_31": ["collision_camera_005 (A)"], + "LE_MagnetSurface_32": ["collision_camera_022 (A)"], + "LE_MagnetSurface_34": ["collision_camera_022 (A)"], + "LE_MagnetSurface_35": ["collision_camera_054 (A)"], + "LE_Platform_Elevator_FromMagma": ["collision_camera_077 (A)"], + "LE_Platform_Teleport_FromMagma": ["collision_camera_011 (A)"], + "LE_Platform_Teleport_FromMagma_frozen": ["collision_camera_011 (A)"], + "LE_Teleport_FromMagma": ["collision_camera_011 (A)"], + "LE_WorldGraph": [], + "LE_zipline_bottom_gen_001_001": ["collision_camera_079 (A)"], + "LE_zipline_bottom_gen_001_001_frozen": ["collision_camera_079 (A)"], + "LE_zipline_bottom_gen_001_002": ["collision_camera_078 (A)"], + "LE_zipline_right_gen_001": ["collision_camera_050 (A)"], + "LE_zipline_right_gen_001_frozen": ["collision_camera_050 (A)"], + "LM_AfterCentralUnitCavesDestroyed_000": ["collision_camera_090 (A)"], + "LM_AfterEmmyProtoClimbSequence_Emmy": ["collision_camera_064 (A)"], + "LM_AfterEmmyProtoClimbSequence_Samus": ["collision_camera_064 (A)"], + "LM_EmmyCaveStartGoAwayHack": ["collision_camera_008 (A)"], + "LM_EmmyDestroySearchLandmark01": ["collision_camera_017 (A)"], + "LM_EmmyEntrancePoint_000": ["collision_camera_071 (A)"], + "LM_EmmyEntrancePoint_001": ["collision_camera_009 (A)"], + "LM_EmmyEntrancePoint_002": ["collision_camera_009 (A)"], + "LM_EmmyEntrancePoint_003": ["collision_camera_051 (A)"], + "LM_EmmyEntrancePoint_004": ["collision_camera_051 (A)"], + "LM_EmmyEntrancePoint_005": ["collision_camera_010 (A)"], + "LM_EmmyEntrancePoint_006": ["collision_camera_010 (A)"], + "LM_EmmyEntrancePoint_008": ["collision_camera_061 (A)"], + "LM_EmmyEntrancePoint_009": ["collision_camera_061 (A)"], + "LM_EmmyEntrancePoint_010": ["collision_camera_010 (A)"], + "LM_EmmyEntrancePoint_011": ["collision_camera_006 (A)"], + "LM_EmmyEntrancePoint_012": ["collision_camera_006 (A)"], + "LM_EmmyEntrancePoint_013": ["collision_camera_053 (A)"], + "LM_EmmyGlobalSL_end_000A": ["collision_camera_048 (A)"], + "LM_EmmyGlobalSL_end_000B": ["collision_camera_048 (A)"], + "LM_EmmyGlobalSL_end_000C": ["collision_camera_051 (A)"], + "LM_EmmyGlobalSL_end_003": ["collision_camera_017 (A)"], + "LM_EmmyGlobalSL_end_003b": ["collision_camera_015 (A)"], + "LM_EmmyGlobalSL_end_003c": ["collision_camera_017 (A)"], + "LM_EmmyGlobalSL_start_000": ["collision_camera_048 (A)"], + "LM_EmmyGlobalSL_start_001": ["collision_camera_048 (A)"], + "LM_EmmyGlobalSL_start_002": ["collision_camera_051 (A)"], + "LM_EmmyGlobalSL_start_003a": ["collision_camera_015 (A)"], + "LM_EmmyGlobalSL_start_003b": ["collision_camera_017 (A)"], + "LM_EmmyGrabOverride_000": ["collision_camera_071 (A)"], + "LM_EmmyGrabOverride_001": ["collision_camera_071 (A)"], + "LM_EmmyTunnelChaseLandmark01": ["collision_camera_015 (A)"], + "LM_Emmy_WaterPlant": ["collision_camera_075 (A)"], + "LM_EnterEmmyZoneSecondTime": ["collision_camera_006 (A)"], + "LM_PROTOEMMY_AFTER_CU": ["collision_camera_016 (A)"], + "LM_PROTOEMMY_AFTER_CU_001": ["collision_camera_064 (A)"], + "LM_PROTOEMMY_AFTER_CU_002": ["collision_camera_064 (A)"], + "LM_SamusPerceptionModifier_Focus": ["collision_camera_071 (A)"], + "LM_SamusPerceptionPosition": ["collision_camera_015 (A)"], + "LM_SamusPerceptionPosition_001": ["collision_camera_015 (A)"], + "LM_SamusPerceptionPosition_002": ["collision_camera_048 (A)"], + "LM_SamusPerceptionPosition_003": ["collision_camera_061 (A)"], + "LM_SamusPerceptionPosition_004": ["collision_camera_015 (A)"], + "LM_TutoFocus_EmmyNoFocusTutorialPoint": ["collision_camera_009 (A)"], + "LM_TutoFocus_EmmyTPPoint": ["collision_camera_071 (A)"], + "LS_CentralUnitArea": ["collision_camera_090 (A)"], + "LS_ChangeCamera_003_B": ["collision_camera_003 (A)"], + "LS_ChangeCamera_FX_01": ["collision_camera_048 (A)"], + "LS_EMMYIMPASSABLE_01": ["collision_camera_075 (A)"], + "LS_EMMYIMPASSABLE_02": ["collision_camera_075 (A)"], + "LS_EMMYIMPASSABLE_03": ["collision_camera_075 (A)"], + "LS_EMMYIMPASSABLE_04": ["collision_camera_075 (A)"], + "LS_EMMYIMPASSABLE_05": ["collision_camera_010 (A)"], + "LS_EMMYIMPASSABLE_06": ["collision_camera_048 (A)", "collision_camera_051 (A)"], + "LS_EMMYIMPASSABLE_07": ["collision_camera_048 (A)"], + "LS_EMMYIMPASSABLE_09": ["collision_camera_009 (A)"], + "LS_EMMYIMPASSABLE_10": ["collision_camera_009 (A)"], + "LS_EMMYIMPASSABLE_11": ["collision_camera_009 (A)"], + "LS_EMMYIMPASSABLE_12": ["collision_camera_009 (A)"], + "LS_EMMYIMPASSABLE_13": ["collision_camera_009 (A)"], + "LS_EMMYIMPASSABLE_14": ["collision_camera_008 (A)"], + "LS_EMMYIMPASSABLE_16": ["collision_camera_006 (A)"], + "LS_EMMYIMPASSABLE_17": ["collision_camera_006 (A)"], + "LS_EMMYIMPASSABLE_18": ["collision_camera_005 (A)"], + "LS_EMMYIMPASSABLE_19": ["collision_camera_049 (A)"], + "LS_EMMYIMPASSABLE_20": ["collision_camera_049 (A)"], + "LS_EMMYIMPASSABLE_22": ["collision_camera_015 (A)"], + "LS_EMMYIMPASSABLE_23": ["collision_camera_015 (A)"], + "LS_EMMYIMPASSABLE_24": ["collision_camera_015 (A)"], + "LS_EMMYIMPASSABLE_25": ["collision_camera_015 (A)"], + "LS_EMMYIMPASSABLE_26": ["collision_camera_015 (A)"], + "LS_EMMYIMPASSABLE_27": ["collision_camera_015 (A)"], + "LS_EMMYIMPASSABLE_28": ["collision_camera_008 (A)"], + "LS_EMMYIMPASSABLE_29": ["collision_camera_071 (A)"], + "LS_EMMYIMPASSABLE_30": ["collision_camera_008 (A)"], + "LS_EMMYIMPASSABLE_32": ["collision_camera_008 (A)"], + "LS_EMMYIMPASSABLE_33": ["collision_camera_069 (A)"], + "LS_EMMYIMPASSABLE_34": ["collision_camera_010 (A)"], + "LS_EMMYIMPASSABLE_35": ["collision_camera_006 (A)"], + "LS_EMMYIMPASSABLE_36": ["collision_camera_008 (A)"], + "LS_EMMYIMPASSABLE_37": ["collision_camera_051 (A)"], + "LS_EMMYIMPASSABLE_38": ["collision_camera_017 (A)"], + "LS_EMMYIMPASSABLE_39": ["collision_camera_010 (A)"], + "LS_EMMYIMPASSABLE_40": ["collision_camera_048 (A)"], + "LS_EMMYIMPASSABLE_41": ["collision_camera_010 (A)"], + "LS_EMMYIMPASSABLE_42": ["collision_camera_010 (A)"], + "LS_EMMYIMPASSABLE_43": ["collision_camera_049 (A)"], + "LS_EMMYIMPASSABLE_44": ["collision_camera_009 (A)"], + "LS_EMMYIMPASSABLE_45": ["collision_camera_005 (A)", "collision_camera_018 (A)"], + "LS_EMMYIMPASSABLE_46": ["collision_camera_071 (A)"], + "LS_EMMYIMPASSABLE_47": ["collision_camera_005 (A)"], + "LS_EMMYIMPASSABLE_48": ["collision_camera_048 (A)", "collision_camera_051 (A)"], + "LS_EmmyCavePresentationForbiddenEdges": ["collision_camera_006 (A)"], + "LS_EmmyEndStagger_000": ["collision_camera_008 (A)"], + "LS_EmmyGlobalGL_emmy_003a": ["collision_camera_015 (A)"], + "LS_EmmyGlobalSL_000": ["collision_camera_009 (A)"], + "LS_EmmyGlobalSL_001": ["collision_camera_048 (A)"], + "LS_EmmyGlobalSL_002": [], + "LS_EmmyGlobalSL_edges_000": ["collision_camera_048 (A)"], + "LS_EmmyGlobalSL_emmy_000": ["collision_camera_048 (A)"], + "LS_EmmyGlobalSL_emmy_003b": ["collision_camera_015 (A)"], + "LS_EmmyGlobalSL_forbidden_000": ["collision_camera_048 (A)"], + "LS_EmmyGlobalSL_samus_000": ["collision_camera_048 (A)"], + "LS_EmmyGrabOverride_000": ["collision_camera_071 (A)"], + "LS_EmmyGrabOverride_001": ["collision_camera_071 (A)"], + "LS_EmmyProtoZone": ["collision_camera_064 (A)"], + "LS_EmmyZone": ["collision_camera_005 (A)"], + "LS_IMPASSABLE_PROTO01": ["collision_camera_016 (A)"], + "LS_PATROLEMMYACTIVATOR_01": ["collision_camera_005 (A)"], + "LS_PATROLEMMYACTIVATOR_02": ["collision_camera_005 (A)"], + "LS_PATROLEMMYACTIVATOR_03": ["collision_camera_006 (A)"], + "LS_PATROLEMMYACTIVATOR_04": ["collision_camera_006 (A)"], + "LS_PATROLEMMYACTIVATOR_05": ["collision_camera_008 (A)"], + "LS_PATROLEMMYACTIVATOR_06": ["collision_camera_008 (A)"], + "LS_PATROLEMMYACTIVATOR_07": ["collision_camera_009 (A)"], + "LS_PATROLEMMYACTIVATOR_08": ["collision_camera_048 (A)"], + "LS_PATROLEMMYACTIVATOR_09": ["collision_camera_051 (A)"], + "LS_PATROLEMMYACTIVATOR_10": ["collision_camera_075 (A)"], + "LS_PATROLEMMYACTIVATOR_11": ["collision_camera_010 (A)"], + "LS_PATROLEMMYACTIVATOR_12": ["collision_camera_015 (A)"], + "LS_PATROLEMMYACTIVATOR_13": ["collision_camera_017 (A)"], + "LS_PATROLEMMYACTIVATOR_14": ["collision_camera_017 (A)"], + "LS_PATROLEMMYACTIVATOR_15": ["collision_camera_017 (A)"], + "LS_PATROLEMMY_01": ["collision_camera_005 (A)"], + "LS_PATROLEMMY_02": ["collision_camera_005 (A)"], + "LS_PATROLEMMY_03": ["collision_camera_005 (A)"], + "LS_PATROLEMMY_04": ["collision_camera_006 (A)"], + "LS_PATROLEMMY_05": ["collision_camera_006 (A)"], + "LS_PATROLEMMY_06": ["collision_camera_008 (A)"], + "LS_PATROLEMMY_07": ["collision_camera_070 (A)"], + "LS_PATROLEMMY_08": ["collision_camera_048 (A)"], + "LS_PATROLEMMY_09": ["collision_camera_051 (A)"], + "LS_PATROLEMMY_10": ["collision_camera_075 (A)"], + "LS_PATROLEMMY_11": [], + "LS_PATROLEMMY_12": ["collision_camera_010 (A)"], + "LS_PATROLEMMY_13": ["collision_camera_017 (A)"], + "LS_PATROLEMMY_14": ["collision_camera_017 (A)"], + "LS_PATROLEMMY_15": ["collision_camera_017 (A)"], + "LS_PATROLTUTOFOCUS": ["collision_camera_008 (A)"], + "LS_RinkaLifeArea_000": ["collision_camera_090 (A)"], + "LS_ToAvoidCornerReposition_000": ["collision_camera_051 (A)"], + "LS_ToAvoidCornerReposition_001": ["collision_camera_017 (A)"], + "MapOptionsTutoTriggerEnter": [], + "MapOptionsTutoTriggerExit": [], + "MapRoomTutoTriggerEnter": ["collision_camera_058 (A)"], + "MapRoomTutoTriggerExit": [], + "MeleeTutoTriggerEnter": ["collision_camera_003 (A)"], + "MeleeTutoTriggerEnter_002": ["collision_camera_003 (A)"], + "MeleeTutoTriggerEnter_003": ["collision_camera_003 (A)"], + "MeleeTutoTriggerExit": ["collision_camera_003 (A)"], + "MeleeTutoTriggerExit_002": ["collision_camera_003 (A)"], + "MeleeTutoTriggerExit_003": ["collision_camera_003 (A)"], + "MissileTutoObserver": ["collision_camera_000 (A)"], + "MissileTutoTriggerEnter": ["collision_camera_000 (A)"], + "MissileTutoTriggerExit": ["collision_camera_000 (A)"], + "PRP_CV_AccessPoint001": ["collision_camera_068 (A)"], + "PRP_CV_AccessPoint001_WeightPlate": ["collision_camera_068 (A)"], + "PRP_CV_AccessPoint002": ["collision_camera_065 (A)"], + "PRP_CV_AccessPoint002_WeightPlate": ["collision_camera_065 (A)"], + "PRP_CV_AmmoStation001": ["collision_camera_000 (A)"], + "PRP_CV_AmmoStation001_WeightPlate": ["collision_camera_000 (A)"], + "PRP_CV_CentralUnitCaves": ["collision_camera_090 (A)"], + "PRP_CV_CentralUnitProto": ["collision_camera_074 (A)"], + "PRP_CV_EnergyStation001": ["collision_camera_054 (A)"], + "PRP_CV_EnergyStation001_WeightPlate": ["collision_camera_054 (A)"], + "PRP_CV_EnergyStation002": ["collision_camera_011 (A)"], + "PRP_CV_EnergyStation002_WeightPlate": ["collision_camera_011 (A)"], + "PRP_CV_MapStation001": ["collision_camera_058 (A)"], + "PRP_CV_MapStation001_WeightPlate": ["collision_camera_058 (A)"], + "PRP_CV_PlatformCaveWaterWeightPlate": ["collision_camera_010 (A)"], + "PRP_CV_PlatformCaveWater_B": ["collision_camera_010 (A)"], + "PRP_CV_PlatformMagnet3Left": ["collision_camera_005 (A)"], + "PRP_CV_PlatformMagnet4Down": ["collision_camera_015 (A)"], + "PRP_CV_PlatformMagnet5Down": ["collision_camera_006 (A)"], + "PRP_CV_SaveStation001": ["collision_camera_063 (A)"], + "PRP_CV_SaveStation001_WeightPlate": ["collision_camera_063 (A)"], + "PRP_CV_SaveStation002": ["collision_camera_025 (A)"], + "PRP_CV_SaveStation002_WeightPlate": ["collision_camera_025 (A)"], + "PRP_CV_SaveStation003": ["collision_camera_012 (A)"], + "PRP_CV_SaveStation003_WeightPlate": ["collision_camera_012 (A)"], + "PRP_CV_SaveStation004": ["collision_camera_076 (A)"], + "PRP_CV_SaveStation004_WeightPlate": ["collision_camera_076 (A)"], + "PRP_CV_ThermalDevice": ["collision_camera_067 (A)"], + "PRP_CV_ThermalDevice_WeightPlate": ["collision_camera_067 (A)"], + "PRP_CV_watercave01a": ["collision_camera_004 (A)"], + "PRP_CV_watercave01b": ["collision_camera_004 (A)"], + "PRP_CV_watercave02": [], + "PRP_CV_watercave05": ["collision_camera_000 (A)"], + "PRP_CV_watercave07": ["collision_camera_004 (A)"], + "PRP_CV_watercave08a": ["collision_camera_057 (A)"], + "PRP_CV_watercave08b": ["collision_camera_060 (A)"], + "PRP_CV_watercave09": ["collision_camera_011 (A)"], + "PRP_CV_watercave10": ["collision_camera_054 (A)"], + "PRP_CV_watercave10_001": ["collision_camera_054 (A)"], + "PRP_DB_CV_000": ["collision_camera_048 (A)"], + "PRP_DB_CV_002": ["collision_camera_006 (A)"], + "PRP_DB_CV_003": ["collision_camera_004 (A)"], + "PRP_DB_CV_006": ["collision_camera_000 (A)"], + "PRP_DB_CV_007": ["collision_camera_022 (A)"], + "PRP_DB_CV_008": ["collision_camera_060 (A)"], + "PRP_DB_CV_010": ["collision_camera_013 (A)"], + "PRP_DB_CV_014": ["collision_camera_003 (A)"], + "PRP_DB_CV_020": ["collision_camera_004 (A)"], + "PRP_TotalR_000": ["collision_camera_081 (A)"], + "PRP_TotalR_001": ["collision_camera_070 (A)"], + "PRP_TotalR_Platform_000": ["collision_camera_081 (A)"], + "PRP_TotalR_Platform_001": ["collision_camera_070 (A)"], + "ProtoEmmyTrigger": ["collision_camera_016 (A)"], + "SG_Cave_Cannons": ["collision_camera_090 (A)"], + "SPBCentralUnitTutoTrigger": [], + "SPRTutoTrigger_000": ["collision_camera_074 (A)"], + "SP_Cave_CUCannon_000": ["collision_camera_090 (A)"], + "SP_Checkpoint_AccessPoint_002": ["collision_camera_050 (A)"], + "SP_Checkpoint_AccessPoint_1B": ["collision_camera_000 (A)"], + "SP_Checkpoint_AccessPoint_2B": ["collision_camera_021 (A)"], + "SP_Checkpoint_CURoom": ["collision_camera_074 (A)"], + "SP_Checkpoint_CentralUnit": ["collision_camera_049 (A)"], + "SP_Checkpoint_ChainReaction": ["collision_camera_026 (A)"], + "SP_Checkpoint_ChargeBeam": ["collision_camera_014 (A)"], + "SP_Checkpoint_ChozoWarriorCave": ["collision_camera_082 (A)"], + "SP_Checkpoint_Cooldown": ["collision_camera_081 (A)"], + "SP_Checkpoint_Dead_ChozoWarriorX": ["collision_camera_091 (A)"], + "SP_Checkpoint_EmmyCave": ["collision_camera_005 (A)"], + "SP_Checkpoint_EmmyCavePhase2": ["collision_camera_090 (A)"], + "SP_Checkpoint_Grapple": ["collision_camera_033 (A)"], + "SP_Checkpoint_MagnetGlove": ["collision_camera_017 (A)"], + "SP_Checkpoint_OpticalCamo": ["collision_camera_020 (A)"], + "SP_Checkpoint_Post_ChainReaction": ["collision_camera_030 (A)"], + "SP_Checkpoint_Pre_ChozoWarriorX": ["collision_camera_056 (A)"], + "SP_Checkpoint_ProtoEmmy": ["collision_camera_003 (A)"], + "SP_Checkpoint_Scorpius": ["collision_camera_072 (A)"], + "SP_Checkpoint_ScrewAttack": ["collision_camera_081 (A)"], + "SP_Checkpoint_ThermalDevice": ["collision_camera_067 (A)"], + "SP_Checkpoint_VariaSuit": ["collision_camera_031 (A)"], + "SP_Checkpoint_WaterValve": ["collision_camera_060 (A)"], + "SP_Emmy": ["collision_camera_006 (A)"], + "SP_EmmyProto": ["collision_camera_016 (A)"], + "SlideTutoTriggerEnter": ["collision_camera_000 (A)"], + "SlideTutoTriggerExit": ["collision_camera_000 (A)"], + "StartPoint0": ["collision_camera_000_Init (A)"], + "TG_ChainReaction_001": ["collision_camera_026 (A)"], + "TG_ChainReaction_002": ["collision_camera_026 (A)"], + "TG_ChainReaction_003": ["collision_camera_026 (A)"], + "TG_ChainReaction_BigExplosion": ["collision_camera_030 (A)"], + "TG_ChainReaction_Camera_000": ["collision_camera_026 (A)"], + "TG_ChainReaction_Camera_001": ["collision_camera_026 (A)"], + "TG_ChainReaction_Camera_002": ["collision_camera_026 (A)"], + "TG_ChainReaction_Camera_003": ["collision_camera_026 (A)"], + "TG_ChainReaction_Camera_004": ["collision_camera_026 (A)"], + "TG_ChainReaction_Camera_005": ["collision_camera_026 (A)"], + "TG_ChainReaction_Camera_006": ["collision_camera_030 (A)"], + "TG_ChainReaction_ChangeFinalSetup": ["collision_camera_030 (A)"], + "TG_ChainReaction_SteamJet_001": ["collision_camera_026 (A)"], + "TG_ChainReaction_SteamJet_002": ["collision_camera_026 (A)"], + "TG_ChainReaction_SteamJet_003": ["collision_camera_026 (A)"], + "TG_ChainReaction_SteamJet_004": ["collision_camera_026 (A)"], + "TG_ChainReaction_SteamJet_005": ["collision_camera_026 (A)"], + "TG_ChainReaction_SteamJet_006": ["collision_camera_026 (A)"], + "TG_ChainReaction_SteamJet_007": ["collision_camera_026 (A)"], + "TG_ChainReaction_SteamJet_008": ["collision_camera_026 (A)"], + "TG_ChainReaction_SteamJet_009": ["collision_camera_026 (A)"], + "TG_ChainReaction_SteamJet_010": ["collision_camera_026 (A)"], + "TG_ChainReaction_SteamJet_011": ["collision_camera_026 (A)"], + "TG_ChainReaction_SteamJet_012": ["collision_camera_026 (A)"], + "TG_ChainReaction_SteamJet_013": ["collision_camera_026 (A)"], + "TG_ChainReaction_SteamJet_014": ["collision_camera_026 (A)"], + "TG_ChainReaction_SteamJet_015": ["collision_camera_026 (A)"], + "TG_ChainReaction_SteamJet_016": ["collision_camera_026 (A)"], + "TG_ChainReaction_SteamJet_017": ["collision_camera_026 (A)"], + "TG_ChainReaction_SteamJet_018": ["collision_camera_026 (A)"], + "TG_ChainReaction_SteamJet_019": ["collision_camera_026 (A)"], + "TG_ChainReaction_SteamJet_020": ["collision_camera_026 (A)"], + "TG_ChangeCamera_003_B": ["collision_camera_003 (A)"], + "TG_ChangeCamera_003_C": ["collision_camera_003 (A)"], + "TG_ChangeCamera_015_B": ["collision_camera_015 (A)"], + "TG_ChangeCamera_023_B": ["collision_camera_023_B (A)"], + "TG_ChangeCamera_031_B": ["collision_camera_031 (A)"], + "TG_ChangeCamera_048_B": ["collision_camera_048 (A)"], + "TG_ChangeCamera_048_C": ["collision_camera_048 (A)"], + "TG_ChangeCamera_050_B": ["collision_camera_050 (A)"], + "TG_ChangeCamera_056_B": ["collision_camera_056 (A)"], + "TG_ChangeCamera_056_C": ["collision_camera_056 (A)"], + "TG_ChangeCamera_064B": ["collision_camera_064 (A)"], + "TG_ChangeCamera_091_B": ["collision_camera_091 (A)"], + "TG_ChangeCamera_FX_01": ["collision_camera_048 (A)"], + "TG_DisableCamera_048": ["collision_camera_010 (A)", "collision_camera_051 (A)"], + "TG_EmmyCavePresentationForbiddenEdges": ["collision_camera_006 (A)"], + "TG_EmmyCavePresentationForbiddenEdgesEnd": ["collision_camera_006 (A)"], + "TG_EmmyCaveSnapshot": ["collision_camera_049 (A)"], + "TG_EmmyCaveStartVisualConeHack": ["collision_camera_071 (A)"], + "TG_EmmyEndStagger_000": ["collision_camera_008 (A)"], + "TG_EmmyGrabOverride_000": ["collision_camera_071 (A)"], + "TG_EmmyGrabOverride_001": ["collision_camera_071 (A)"], + "TG_EmmyPerceptionModifier": ["collision_camera_015 (A)"], + "TG_EmmyPerceptionModifier_001": ["collision_camera_015 (A)"], + "TG_EmmyPerceptionModifier_002": ["collision_camera_048 (A)"], + "TG_EmmyPerceptionModifier_003": ["collision_camera_010 (A)"], + "TG_EmmyPerceptionModifier_004": ["collision_camera_015 (A)"], + "TG_EmmyPerceptionModifier_Focus": ["collision_camera_008 (A)"], + "TG_EmmySpawnSequence_Samus": ["collision_camera_006 (A)"], + "TG_EmmyTunnelChaseDeviation": ["collision_camera_015 (A)"], + "TG_IgnoreFloorSlideUpperBodySubmerged": ["collision_camera_004 (A)"], + "TG_MusicChange_ScrewAttack_StatueRoom": ["collision_camera_081 (A)"], + "TG_PATROLEMMYACTIVATOR_01": ["collision_camera_005 (A)"], + "TG_PATROLEMMYACTIVATOR_02": ["collision_camera_005 (A)"], + "TG_PATROLEMMYACTIVATOR_03": ["collision_camera_006 (A)"], + "TG_PATROLEMMYACTIVATOR_04": ["collision_camera_006 (A)"], + "TG_PATROLEMMYACTIVATOR_05": ["collision_camera_008 (A)"], + "TG_PATROLEMMYACTIVATOR_06": ["collision_camera_070 (A)"], + "TG_PATROLEMMYACTIVATOR_07": ["collision_camera_009 (A)"], + "TG_PATROLEMMYACTIVATOR_08": ["collision_camera_048 (A)"], + "TG_PATROLEMMYACTIVATOR_09": ["collision_camera_011 (A)"], + "TG_PATROLEMMYACTIVATOR_10": ["collision_camera_060 (A)"], + "TG_PATROLEMMYACTIVATOR_11": ["collision_camera_010 (A)"], + "TG_PATROLEMMYACTIVATOR_12": ["collision_camera_015 (A)"], + "TG_PATROLEMMYACTIVATOR_13": ["collision_camera_017 (A)"], + "TG_PATROLEMMYACTIVATOR_14": ["collision_camera_017 (A)"], + "TG_PATROLEMMYACTIVATOR_15": ["collision_camera_049 (A)"], + "TG_PROTOEMMY_ACTIVATE": ["collision_camera_064 (A)"], + "TG_PROTOEMMY_ACTIVATE_TIMER": ["collision_camera_064 (A)"], + "TG_PROTOEMMY_BEHAVIOR": ["collision_camera_064 (A)"], + "TG_PROTOEMMY_BEHAVIOR_001": ["collision_camera_064 (A)"], + "TG_PROTOEMMY_BEHAVIOR_002": ["collision_camera_064 (A)"], + "TG_PROTOEMMY_BEHAVIOR_003": ["collision_camera_064 (A)"], + "TG_Snapshot_Checkpoint_EmmyCave": ["collision_camera_006 (A)"], + "TG_StartCUCombat_001": ["collision_camera_090 (A)"], + "TG_TutoFocus_Caves": ["collision_camera_050 (A)"], + "TG_TutoFocus_Caves_001": ["collision_camera_009 (A)"], + "TG_WaterValve_Tuto": ["collision_camera_075 (A)"], + "Watervalve_fillmap": ["collision_camera_010 (A)"], + "block_slide_reg_001": ["collision_camera_048 (A)"], + "box_grapple_cv_001": ["collision_camera_033 (A)"], + "box_weight_cv_001": ["collision_camera_069 (A)"], + "box_weight_cv_001_col": ["collision_camera_069 (A)"], + "box_wide_cv_001": ["collision_camera_069 (A)"], + "breakablecave016": ["collision_camera_070 (A)"], + "breakablecave017": ["collision_camera_070 (A)"], + "breakablecave019": ["collision_camera_081 (A)"], + "breakablehint_000": ["collision_camera_009 (A)"], + "breakablehint_001": ["collision_camera_016 (A)"], + "breakablehint_002": ["collision_camera_011 (A)"], + "breakablehint_003": ["collision_camera_067 (A)"], + "breakablehint_004": ["collision_camera_081 (A)"], + "breakablehint_005": ["collision_camera_062 (A)"], + "breakablehint_006": ["collision_camera_051 (A)"], + "breakablehint_007": ["collision_camera_003 (A)"], + "burnertrapcav01": ["collision_camera_023_B (A)"], + "burnertrapcav01_000": ["collision_camera_023_B (A)"], + "camRail_PreChain": ["collision_camera_026 (A)"], + "camRail_mbTunnel": ["collision_camera_055 (A)"], + "camerarailpath_MagmaCorridor": ["collision_camera_023 (A)"], + "centralunitcave_000": ["collision_camera_090 (A)"], + "db_dif_cv_002": ["collision_camera_056 (A)"], + "db_reg_cv_021": ["collision_camera_022 (A)"], + "db_reg_cv_022": ["collision_camera_011 (A)"], + "db_reg_cv_023": ["collision_camera_011 (A)"], + "door_frblack_gen_003": ["collision_camera_017 (A)", "collision_camera_049 (A)"], + "door_frblack_gen_004": ["collision_camera_017 (A)", "collision_camera_049 (A)"], + "door_frblack_gen_005": ["collision_camera_049 (A)"], + "door_frblack_gen_006": ["collision_camera_015 (A)", "collision_camera_017 (A)"], + "door_frblack_gen_007": ["collision_camera_015 (A)"], + "door_frblack_gen_008": ["collision_camera_017 (A)", "collision_camera_049 (A)"], + "door_frblack_gen_009": ["collision_camera_017 (A)", "collision_camera_049 (A)"], + "door_frblack_gen_010": ["collision_camera_017 (A)"], + "door_frblack_gen_011": ["collision_camera_015 (A)", "collision_camera_017 (A)"], + "door_frblack_protoemmy": ["collision_camera_016 (A)", "collision_camera_064 (A)"], + "door_frblack_protoemmy_000": ["collision_camera_016 (A)", "collision_camera_064 (A)"], + "door_frblack_protoemmy_001": ["collision_camera_064 (A)", "collision_camera_074 (A)"], + "door_shield_plasma_000": ["collision_camera_081 (A)", "collision_camera_085 (A)"], + "door_shield_plasma_001": ["collision_camera_082 (A)"], + "door_shield_plasma_002": ["collision_camera_082 (A)"], + "door_shield_plasma_003": ["collision_camera_081 (A)", "collision_camera_085 (A)"], + "doorclosedgrapple_000": ["collision_camera_033 (A)", "collision_camera_089 (A)"], + "doorclosedpower_000": ["collision_camera_010 (A)", "collision_camera_051 (A)"], + "doorgrapplegrapple": ["collision_camera_081 (A)", "collision_camera_082 (A)"], + "doorpresenceframe_000": ["collision_camera_022 (A)", "collision_camera_050 (A)"], + "doorpresenceframe_001": ["collision_camera_024 (A)", "collision_camera_079 (A)"], + "doorshieldsupermissile_000": ["collision_camera_011 (A)", "collision_camera_055 (A)"], + "doorshutter_000": ["collision_camera_030 (A)"], + "doorwavebeam_000": ["collision_camera_010 (A)", "collision_camera_051 (A)"], + "doorwidebeam_000": ["collision_camera_008 (A)", "collision_camera_009 (A)"], + "elevator_aqua_000_platform": ["collision_camera_080 (A)"], + "elevator_aqua_000_platform_frozen": ["collision_camera_080 (A)"], + "elevator_baselab_000": ["collision_camera_034 (A)"], + "elevator_baselab_000_platform": ["collision_camera_034 (A)"], + "elevator_with_cutscene_aqua_000": ["collision_camera_080 (A)"], + "env_frozen_gen_001_000": ["collision_camera_091 (A)"], + "env_frozen_gen_001_001": ["collision_camera_062 (A)"], + "env_frozen_gen_001_002": ["collision_camera_082 (A)"], + "env_heat_gen_001_001": ["collision_camera_023_B (A)"], + "env_heat_gen_001_002": ["collision_camera_078 (A)"], + "env_heat_gen_001_003": ["collision_camera_028 (A)"], + "env_heat_gen_001_004": ["collision_camera_029 (A)"], + "env_heat_gen_001_CR_001": ["collision_camera_026 (A)"], + "env_heat_gen_001_CR_002": ["collision_camera_026 (A)"], + "env_heat_gen_001_CR_003": ["collision_camera_026 (A)"], + "env_heat_gen_001_CR_004": ["collision_camera_026 (A)"], + "env_heat_gen_001_CR_005": ["collision_camera_026 (A)"], + "env_heat_gen_001_CR_END": ["collision_camera_026 (A)"], + "ev_chainreaction_cv_001": ["collision_camera_026 (A)"], + "ev_chainreaction_cv_001_a": ["collision_camera_026 (A)"], + "ev_chainreaction_cv_001_b": ["collision_camera_011 (A)"], + "ev_chainreaction_cv_002": ["collision_camera_026 (A)"], + "ev_chainreaction_cv_003": ["collision_camera_026 (A)"], + "ev_chainreaction_cv_004": ["collision_camera_026 (A)"], + "ev_chainreaction_cv_004_a": ["collision_camera_026 (A)"], + "ev_chainreaction_cv_005": ["collision_camera_026 (A)"], + "ev_chainreaction_cv_006": ["collision_camera_026 (A)"], + "ev_chainreaction_cv_007": ["collision_camera_011 (A)"], + "ev_chainreaction_cv_009": ["collision_camera_011 (A)"], + "ev_chainreaction_cv_009_B": ["collision_camera_011 (A)"], + "ev_chainreaction_cv_010": ["collision_camera_028 (A)"], + "ev_chainreaction_cv_010_b": ["collision_camera_028 (A)"], + "ev_chainreaction_cv_012": ["collision_camera_011 (A)"], + "ev_chainreaction_cv_fx_000": ["collision_camera_026 (A)"], + "ev_chainreaction_cv_fx_001": ["collision_camera_026 (A)"], + "ev_chainreaction_cv_fx_002": ["collision_camera_026 (A)"], + "ev_chainreaction_cv_fx_003": ["collision_camera_026 (A)"], + "ev_chainreaction_cv_fx_004": ["collision_camera_026 (A)"], + "ev_chainreaction_cv_fx_005": ["collision_camera_026 (A)"], + "ev_chainreaction_cv_fx_006": ["collision_camera_026 (A)"], + "ev_chainreaction_cv_fx_007": ["collision_camera_026 (A)"], + "ev_chainreaction_cv_fx_008": ["collision_camera_026 (A)"], + "ev_chainreaction_cv_fx_009": ["collision_camera_026 (A)"], + "ev_chainreaction_cv_fx_010": ["collision_camera_026 (A)"], + "ev_chainreaction_cv_fx_011": ["collision_camera_026 (A)"], + "ev_chainreaction_cv_fx_012": ["collision_camera_026 (A)"], + "ev_chainreaction_cv_fx_013": ["collision_camera_026 (A)"], + "ev_chainreaction_cv_fx_014": ["collision_camera_026 (A)"], + "ev_chainreaction_cv_fx_015": ["collision_camera_026 (A)"], + "ev_chainreaction_cv_fx_016": ["collision_camera_026 (A)"], + "ev_chainreaction_cv_fx_018": ["collision_camera_026 (A)"], + "ev_chainreaction_deviceheat": ["collision_camera_026 (A)"], + "ev_chainreaction_weightactivatedplatform": ["collision_camera_026 (A)"], + "ev_entercu_cv_001": ["collision_camera_049 (A)"], + "ev_piston_cv_002": ["collision_camera_017 (A)"], + "ev_protoemmy_chasemusic": ["collision_camera_064 (A)"], + "footstepplatform_000": ["collision_camera_030 (A)"], + "fx_cold_door": ["collision_camera_013 (A)", "collision_camera_062 (A)"], + "fx_cold_door_000": ["collision_camera_062 (A)", "collision_camera_086 (A)"], + "fx_cold_door_001": ["collision_camera_086 (A)", "collision_camera_091 (A)"], + "fx_cold_door_002": ["collision_camera_081 (A)", "collision_camera_082 (A)"], + "fx_heat_door": ["collision_camera_028 (A)"], + "fx_heat_door_000": ["collision_camera_026 (A)", "collision_camera_028 (A)"], + "fx_heat_door_001": ["collision_camera_029 (A)", "collision_camera_031 (A)"], + "fx_heat_door_002": ["collision_camera_024 (A)", "collision_camera_078 (A)"], + "fx_heat_door_003": ["collision_camera_023_B (A)", "collision_camera_024 (A)"], + "fx_heat_door_004": ["collision_camera_077 (A)", "collision_camera_078 (A)"], + "fx_heat_door_005": ["collision_camera_026 (A)", "collision_camera_055 (A)"], + "fx_heat_tunnel_000": ["collision_camera_026 (A)"], + "fxsmokepipesyellowadorn01_000": ["collision_camera_016 (A)"], + "fxsmokepipesyellowadorn01_012": ["collision_camera_016 (A)"], + "fxsmokepipesyellowadorn01_013": ["collision_camera_016 (A)"], + "fxsmokepipesyellowadorn01_014": ["collision_camera_016 (A)"], + "fxsmokepipesyellowadorn01_015": ["collision_camera_016 (A)"], + "grapplepulloff1x2_001": ["collision_camera_081 (A)"], + "grapplepulloff1x2_002": ["collision_camera_030 (A)"], + "grappleswingpoint_000": ["collision_camera_089 (A)"], + "heatroomfx_001_01": ["collision_camera_026 (A)"], + "heatroomfx_001_02": ["collision_camera_026 (A)"], + "heatroomfx_001_03": ["collision_camera_026 (A)"], + "heatroomfx_001_04": ["collision_camera_026 (A)"], + "heatroomfx_001_05": ["collision_camera_026 (A)"], + "heatroomfx_001_06": ["collision_camera_026 (A)"], + "heatroomfx_002_01": ["collision_camera_026 (A)"], + "heatroomfx_002_02": ["collision_camera_026 (A)"], + "heatroomfx_002_03": ["collision_camera_026 (A)"], + "heatroomfx_003_01": ["collision_camera_026 (A)"], + "heatroomfx_003_02": ["collision_camera_026 (A)"], + "heatroomfx_003_03": ["collision_camera_026 (A)"], + "heatroomfx_003_04": ["collision_camera_026 (A)"], + "heatroomfx_003_05": ["collision_camera_026 (A)"], + "heatroomfx_003_06": ["collision_camera_026 (A)"], + "heatroomfx_004_01": ["collision_camera_026 (A)"], + "heatroomfx_004_02": ["collision_camera_026 (A)"], + "heatroomfx_004_03": ["collision_camera_026 (A)"], + "heatroomfx_004_04": ["collision_camera_026 (A)"], + "heatroomfx_004_05": ["collision_camera_026 (A)"], + "heatroomfx_005_01": ["collision_camera_026 (A)"], + "heatroomfx_005_02": ["collision_camera_026 (A)"], + "heatroomfx_005_03": ["collision_camera_026 (A)"], + "heatroomfx_005_04": ["collision_camera_026 (A)"], + "heatroomfx_END_01": ["collision_camera_026 (A)"], + "heatroomfx_END_02": ["collision_camera_026 (A)"], + "instancefx_036": ["collision_camera_060 (A)"], + "instancefx_037": ["collision_camera_060 (A)"], + "instancefx_038": ["collision_camera_060 (A)"], + "item_energyfragment_000": ["collision_camera_086 (A)"], + "item_energyfragment_001": ["collision_camera_056 (A)"], + "item_energytank_000": ["collision_camera_030 (A)"], + "item_missiletank_000": ["collision_camera_050 (A)"], + "item_missiletank_001": ["collision_camera_009 (A)"], + "item_missiletank_002": ["collision_camera_081 (A)"], + "item_missiletank_003": ["collision_camera_011 (A)"], + "item_missiletank_004": ["collision_camera_051 (A)"], + "item_missiletank_005": ["collision_camera_003 (A)"], + "item_missiletank_006": ["collision_camera_080 (A)"], + "item_missiletankplus_000": ["collision_camera_086 (A)"], + "item_missiletankplus_001": ["collision_camera_029 (A)"], + "item_powerbombtank_000": ["collision_camera_010 (A)"], + "lavazone_001": [], + "lavazone_002": ["collision_camera_028 (A)"], + "lavazone_003": ["collision_camera_023_B (A)"], + "logicactiontrigger_000": ["collision_camera_064 (A)"], + "logicactiontrigger_001": [], + "platformtrapgrapple5right": ["collision_camera_015 (A)"], + "rail_magnet_PlatformMagnet3Left": ["collision_camera_005 (A)"], + "rail_magnet_PlatformMagnet4Down": ["collision_camera_015 (A)"], + "rail_magnet_PlatformMagnet5Down": ["collision_camera_006 (A)"], + "spawnpointrinka_000": ["collision_camera_090 (A)"], + "spawnpointrinka_001": ["collision_camera_090 (A)"], + "spraypipe_cave": ["collision_camera_056 (A)"], + "steammag01_005": ["collision_camera_077 (A)"], + "steammag01_006": ["collision_camera_077 (A)"], + "steammag01_007": ["collision_camera_077 (A)"], + "steammag01_008": ["collision_camera_077 (A)"], + "steammag01_009": ["collision_camera_077 (A)"], + "steammag01_chainreaction_001": ["collision_camera_026 (A)"], + "steammag01_chainreaction_002": ["collision_camera_026 (A)"], + "steammag01_chainreaction_003": ["collision_camera_026 (A)"], + "steammag01_chainreaction_004": ["collision_camera_026 (A)"], + "steammag01_chainreaction_005": ["collision_camera_026 (A)"], + "steammag01_chainreaction_006": ["collision_camera_026 (A)"], + "steammag01_chainreaction_007": ["collision_camera_026 (A)"], + "steammag01_chainreaction_008": ["collision_camera_026 (A)"], + "steammag01_chainreaction_009": ["collision_camera_026 (A)"], + "steammag01_chainreaction_010": ["collision_camera_026 (A)"], + "steammag01_chainreaction_011": ["collision_camera_026 (A)"], + "steammag01_chainreaction_012": ["collision_camera_026 (A)"], + "steammag01_chainreaction_013": ["collision_camera_026 (A)"], + "steammag01_chainreaction_014": ["collision_camera_026 (A)"], + "steammag01_chainreaction_015": ["collision_camera_026 (A)"], + "steammag01_chainreaction_016": ["collision_camera_026 (A)"], + "steammag01_chainreaction_017": ["collision_camera_026 (A)"], + "steammag01_chainreaction_018": ["collision_camera_026 (A)"], + "steammag01_chainreaction_019": ["collision_camera_026 (A)"], + "steammag01_chainreaction_020": ["collision_camera_026 (A)"], + "steammag01_chainreaction_old": ["collision_camera_026 (A)"], + "steammag01_chainreaction_old_000": ["collision_camera_029 (A)"], + "steamprotoemmy": ["collision_camera_064 (A)"], + "steamprotoemmy_000": ["collision_camera_016 (A)"], + "steamprotoemmy_001": ["collision_camera_016 (A)"], + "steamprotoemmy_002": ["collision_camera_016 (A)"], + "teleport_baselab_000": ["collision_camera_008 (A)"], + "teleport_baselab_000_platform": ["collision_camera_008 (A)"], + "teleport_baselab_000_platform_frozen": ["collision_camera_008 (A)"], + "teleporter_magma_000": ["collision_camera_081 (A)"], + "teleporter_magma_000_platform": ["collision_camera_081 (A)"], + "teleporter_magma_000_platform_frozen": ["collision_camera_081 (A)"], + "trap_rot_cv_001": ["collision_camera_081 (A)"], + "trap_rot_cv_003": ["collision_camera_056 (A)"], + "trap_thermal_horizontal_000": ["collision_camera_011 (A)"], + "trap_thermal_horizontal_001": ["collision_camera_011 (A)"], + "waterbeforemaproom": ["collision_camera_056 (A)"], + "waterzone_000": ["collision_camera_081 (A)"], + "waterzone_001": ["collision_camera_081 (A)"], + "waterzone_002": ["collision_camera_081 (A)"], + "waterzone_003": [], + }, + "s020_magma": { + "AP_03": ["collision_camera_002 (C)"], + "AP_03B": ["collision_camera_058 (C)"], + "CAM_Default": ["collision_camera_046 (C)"], + "CAM_Far": ["collision_camera_009 (C)", "collision_camera_CooldownX (C)"], + "CAM_NewPath": ["collision_camera_042 (C)"], + "CAM_ToKraid_MetroClose": ["collision_camera_024 (C)"], + "CAM_ToKraid_MetroClose_2": ["collision_camera_024 (C)"], + "CAM_ToKraid_MetroClose_3": ["collision_camera_024 (C)"], + "CAM_Transition_Left_0": ["collision_camera_009 (C)"], + "CAM_Transition_Right_0": ["collision_camera_009 (C)"], + "CAM_Transition_Right_1": ["collision_camera_009 (C)"], + "CamRail_KraidFace": ["collision_camera_023 (C)"], + "Cam_KraidFace": ["collision_camera_023 (C)"], + "Cam_KraidFace_Close": ["collision_camera_023 (C)"], + "CameraRail_PathToKraid": ["collision_camera_024 (C)"], + "Disable_CamToKraid": ["collision_camera_061 (C)"], + "LE_Elevator_FromCave": ["collision_camera_000 (C)"], + "LE_Platform_Elevator_FromCave": ["collision_camera_000 (C)"], + "LE_Platform_Teleport_FromCave": ["collision_camera_025 (C)"], + "LE_Teleport_FromCave": ["collision_camera_025 (C)"], + "LE_WorldGraph": ["collision_camera_046 (C)"], + "LM_EmmyDestroySearch_001": ["collision_camera_036 (C)"], + "LM_EmmyEntrancePoint_000": ["collision_camera_020 (C)"], + "LM_EmmyEntrancePoint_002": ["collision_camera_046 (C)"], + "LM_EmmyEntrancePoint_003": ["collision_camera_046 (C)"], + "LM_EmmyEntrancePoint_004": ["collision_camera_020 (C)"], + "LM_EmmyEntrancePoint_005": ["collision_camera_010 (C)"], + "LM_EmmyEntrancePoint_006": ["collision_camera_010 (C)"], + "LM_EmmyEntrancePoint_007": ["collision_camera_059 (C)"], + "LM_EmmyEntrancePoint_008": ["collision_camera_028 (C)"], + "LM_EmmyEntrancePoint_009": ["collision_camera_028 (C)"], + "LM_EmmyEntrancePoint_010": ["collision_camera_028 (C)"], + "LM_EmmyEntrancePoint_012": ["collision_camera_029 (C)"], + "LM_EmmyEntrancePoint_013": ["collision_camera_036 (C)"], + "LM_EmmyEntrancePoint_014": ["collision_camera_022 (C)"], + "LM_EmmyEntrancePoint_015": ["collision_camera_035 (C)"], + "LM_EmmyEntrancePoint_017": ["collision_camera_046 (C)"], + "LM_EmmyEntrancePoint_019": ["collision_camera_032 (C)"], + "LM_EmmyEntrancePoint_020": ["collision_camera_010 (C)"], + "LM_EmmyEntrancePoint_021": ["collision_camera_032 (C)"], + "LM_EmmyEntrancePoint_024": ["collision_camera_046 (C)"], + "LM_EmmyEntrancePoint_025": ["collision_camera_010 (C)"], + "LS_EmmyForbidden_000": ["collision_camera_032 (C)"], + "LS_EmmyForbidden_001": ["collision_camera_032 (C)"], + "LS_EmmyForbidden_002": ["collision_camera_032 (C)"], + "LS_EmmyForbidden_003": ["collision_camera_046 (C)"], + "LS_EmmyForbidden_004": ["collision_camera_059 (C)"], + "LS_EmmyForbidden_005": ["collision_camera_032 (C)"], + "LS_EmmyForbidden_006": ["collision_camera_020 (C)"], + "LS_EmmyForbidden_007": ["collision_camera_046 (C)"], + "LS_EmmyForbidden_009": ["collision_camera_028 (C)"], + "LS_EmmyForbidden_010": ["collision_camera_029 (C)"], + "LS_EmmyForbidden_011": ["collision_camera_035 (C)"], + "LS_EmmyForbidden_012": ["collision_camera_035 (C)"], + "LS_EmmyForbidden_013": ["collision_camera_036 (C)"], + "LS_EmmyForbidden_014": ["collision_camera_036 (C)"], + "LS_EmmyForbidden_015": ["collision_camera_020 (C)"], + "LS_EmmyForbidden_016": ["collision_camera_020 (C)"], + "LS_EmmyForbidden_017": ["collision_camera_035 (C)"], + "LS_EmmyForbidden_018": ["collision_camera_046 (C)"], + "LS_EmmyForbidden_019": ["collision_camera_032 (C)"], + "LS_EmmyForbidden_020": ["collision_camera_032 (C)"], + "LS_EmmyForbidden_021": ["collision_camera_032 (C)"], + "LS_EmmyForbidden_022": ["collision_camera_020 (C)"], + "LS_EmmyForbidden_023": ["collision_camera_036 (C)"], + "LS_EmmyForbidden_024": ["collision_camera_010 (C)"], + "LS_EmmyForbidden_025": ["collision_camera_032 (C)"], + "LS_EmmyForbidden_026": ["collision_camera_020 (C)"], + "LS_EmmyForbidden_027": ["collision_camera_036 (C)"], + "LS_EmmyForbidden_028": ["collision_camera_036 (C)"], + "LS_EmmyZone": ["collision_camera_020 (C)"], + "LS_MagmaRinkaLifeArea_000": ["collision_camera_037 (C)"], + "LS_PATROLEMMY_01": ["collision_camera_052 (C)"], + "LS_PATROLEMMY_02": ["collision_camera_020 (C)"], + "LS_PATROLEMMY_03": ["collision_camera_032 (C)"], + "LS_PATROLEMMY_04": ["collision_camera_034 (C)", "collision_camera_055 (C)"], + "LS_PATROLEMMY_05": ["collision_camera_013 (C)"], + "LS_PATROLEMMY_06": ["collision_camera_028 (C)"], + "LS_PATROLEMMY_07": [], + "LS_PATROLEMMY_08": ["collision_camera_059 (C)"], + "LS_PATROLEMMY_09": ["collision_camera_036 (C)"], + "LS_PATROLEMMY_10": ["collision_camera_036 (C)"], + "LS_PATROLEMMY_11": ["collision_camera_032 (C)"], + "LS_PATROLEMMY_12": ["collision_camera_035 (C)"], + "LS_PATROLEMMY_13": ["collision_camera_052 (C)"], + "LS_PATROLEMMY_14": ["collision_camera_046 (C)"], + "SG_Magma_Cannons_000": ["collision_camera_037 (C)"], + "SP_AccessPoint_3": ["collision_camera_000 (C)"], + "SP_AccessPoint_3_B": ["collision_camera_025 (C)"], + "SP_Checkpoint_CentralUnit": ["collision_camera_036 (C)"], + "SP_Checkpoint_CooldownX": ["collision_camera_004 (C)"], + "SP_Checkpoint_Dead_CooldownX": ["collision_camera_009 (C)", "collision_camera_CooldownX (C)"], + "SP_Checkpoint_Dead_Kraid": ["collision_camera_063 (C)"], + "SP_Checkpoint_EmmyMagma": ["collision_camera_052 (C)"], + "SP_Checkpoint_EmmyMagmaPhase2": ["collision_camera_037 (C)"], + "SP_Checkpoint_Kraid": ["collision_camera_061 (C)"], + "SP_Checkpoint_MorphBall": ["collision_camera_036 (C)"], + "SP_Checkpoint_PistonLeft": ["collision_camera_038 (C)"], + "SP_Checkpoint_PistonRight": ["collision_camera_012 (C)"], + "SP_Checkpoint_WideBeam": ["collision_camera_041 (C)"], + "SP_DiffusionBeam": ["collision_camera_044 (C)"], + "SP_Emmy": ["collision_camera_046 (C)"], + "SP_Magma_CUCannon_000": ["collision_camera_037 (C)"], + "SP_Magma_CUCannon_001": ["collision_camera_037 (C)"], + "SP_Magma_CUCannon_002": ["collision_camera_037 (C)"], + "SP_Magma_CUCannon_003": ["collision_camera_037 (C)"], + "StartPoint0": ["collision_camera_000 (C)"], + "TG_ChangeCamera_000_B": ["collision_camera_000 (C)"], + "TG_ChangeCamera_009_B": ["collision_camera_009 (C)"], + "TG_ChangeCamera_009_C": ["collision_camera_009 (C)"], + "TG_ChangeCamera_015_B": ["collision_camera_015 (C)"], + "TG_ChangeCamera_023_B": ["collision_camera_023 (C)"], + "TG_ChangeCamera_025_B": ["collision_camera_025 (C)"], + "TG_ChangeCamera_026_B": ["collision_camera_026 (C)"], + "TG_ChangeCamera_051_B": ["collision_camera_051 (C)"], + "TG_CombatCU": [], + "TG_Diffusion_MusicChange": ["collision_camera_044 (C)"], + "TG_Diffusion_MusicChange_000": ["collision_camera_044 (C)"], + "TG_EmmyUnlockDoors": ["collision_camera_028 (C)"], + "TG_FadeActivation_CooldownX_000": ["collision_camera_004 (C)"], + "TG_InsideTunnelMusicChange": ["collision_camera_053 (C)"], + "TG_PATROLEMMYACTIVATOR_01": ["collision_camera_046 (C)"], + "TG_PATROLEMMYACTIVATOR_02": ["collision_camera_020 (C)"], + "TG_PATROLEMMYACTIVATOR_03": ["collision_camera_032 (C)"], + "TG_PATROLEMMYACTIVATOR_04": ["collision_camera_032 (C)"], + "TG_PATROLEMMYACTIVATOR_05": ["collision_camera_013 (C)"], + "TG_PATROLEMMYACTIVATOR_06": ["collision_camera_028 (C)"], + "TG_PATROLEMMYACTIVATOR_07": ["collision_camera_027 (C)"], + "TG_PATROLEMMYACTIVATOR_08": ["collision_camera_059 (C)"], + "TG_PATROLEMMYACTIVATOR_09": ["collision_camera_038 (C)"], + "TG_PATROLEMMYACTIVATOR_10": ["collision_camera_036 (C)"], + "TG_PATROLEMMYACTIVATOR_11": [], + "TG_PATROLEMMYACTIVATOR_12": ["collision_camera_031 (C)"], + "TG_PATROLEMMYACTIVATOR_13": ["collision_camera_046 (C)"], + "TG_PATROLEMMYACTIVATOR_14": ["collision_camera_046 (C)"], + "TG_PistonLeft_MusicChange": ["collision_camera_038 (C)"], + "TG_PistonLeft_MusicChange_000": ["collision_camera_042 (C)"], + "TG_PistonRight_MusicChange": ["collision_camera_012 (C)"], + "TG_PostCoolDownX_MusicChange": ["collision_camera_009 (C)", "collision_camera_CooldownX (C)"], + "TG_Subarea_043_MusicChange": ["collision_camera_043 (C)"], + "TG_TutoOC_Enter": ["collision_camera_046 (C)"], + "TG_TutoOC_Exit": ["collision_camera_020 (C)"], + "TG_ZoomOutQuit": ["collision_camera_042 (C)"], + "accesspoint": ["collision_camera_002 (C)"], + "accesspoint_000": ["collision_camera_058 (C)"], + "accesspoint_platform": ["collision_camera_002 (C)"], + "accesspoint_platform_000": ["collision_camera_058 (C)"], + "ammorecharge_000": ["collision_camera_023 (C)"], + "block_slide_reg_002": ["collision_camera_024 (C)"], + "box_magnet_mg_004": ["collision_camera_042 (C)"], + "box_magnet_mg_01_000": ["collision_camera_015 (C)"], + "box_wide_cv_001": ["collision_camera_040 (C)"], + "box_wide_cv_002": ["collision_camera_048 (C)"], + "breakablemag001": ["collision_camera_007 (C)"], + "breakablemag002": ["collision_camera_000 (C)"], + "breakablemag003": ["collision_camera_009 (C)"], + "breakablemag004": ["collision_camera_019 (C)"], + "breakablemag005": ["collision_camera_020 (C)"], + "breakablemag007": ["collision_camera_036 (C)"], + "breakablemag008": ["collision_camera_036 (C)"], + "breakablemag009": ["collision_camera_051 (C)"], + "breakablemag010": ["collision_camera_024 (C)"], + "breakablemag012": ["collision_camera_015 (C)"], + "breakablemag013": ["collision_camera_019 (C)"], + "breakablemag014": ["collision_camera_019 (C)"], + "camerarailpath": ["collision_camera_042 (C)"], + "centralunitmagma_000": ["collision_camera_037 (C)"], + "centralunitmagmacontroller": ["collision_camera_037 (C)"], + "cooldownxbosslavacarpet": ["collision_camera_009 (C)", "collision_camera_CooldownX (C)"], + "db_dif_mg_001": ["collision_camera_051 (C)"], + "db_dif_mg_002": ["collision_camera_044 (C)"], + "db_dside_mg_001b_000": ["collision_camera_026 (C)"], + "db_dside_mg_002": ["collision_camera_027 (C)"], + "db_dside_mg_002b_000": ["collision_camera_025 (C)"], + "db_dside_mg_003": ["collision_camera_026 (C)"], + "db_dside_mg_003b_000": ["collision_camera_045 (C)"], + "db_dside_mg_004": ["collision_camera_015 (C)"], + "db_hdoor_mg_001": ["collision_camera_016 (C)"], + "db_hdoor_mg_002": ["collision_camera_052 (C)"], + "db_hdoor_mg_002b_000": ["collision_camera_052 (C)"], + "db_reg_mg_017": ["collision_camera_023 (C)"], + "db_reg_mg_019": ["collision_camera_024 (C)"], + "db_reg_mg_020": ["collision_camera_061 (C)"], + "db_reg_mg_021": ["collision_camera_061 (C)"], + "deviceheat": ["collision_camera_004 (C)"], + "deviceheat_001": ["collision_camera_034 (C)"], + "deviceheat_002": ["collision_camera_042 (C)"], + "deviceheat_camerafar_000": ["collision_camera_042 (C)"], + "door_frblack_gen_000": ["collision_camera_036 (C)"], + "door_frblack_gen_001": ["collision_camera_022 (C)", "collision_camera_035 (C)", "collision_camera_036 (C)"], + "door_frblack_gen_002": ["collision_camera_028 (C)", "collision_camera_036 (C)"], + "doorcentralunit": ["collision_camera_036 (C)"], + "doorchargecharge": ["collision_camera_018 (C)", "collision_camera_042 (C)"], + "doorchargecharge_001": ["collision_camera_012 (C)", "collision_camera_013 (C)"], + "doorchargecharge_002": ["collision_camera_012 (C)", "collision_camera_045 (C)"], + "doorchargecharge_003": ["collision_camera_006 (C)", "collision_camera_012 (C)"], + "doorchargecharge_005": ["collision_camera_020 (C)", "collision_camera_046 (C)"], + "doorchargecharge_007": ["collision_camera_009 (C)", "collision_camera_049 (C)"], + "doorclosedcharge": ["collision_camera_032 (C)", "collision_camera_046 (C)"], + "doorclosedcharge_001": ["collision_camera_010 (C)", "collision_camera_032 (C)"], + "doorclosedcharge_002": ["collision_camera_014 (C)", "collision_camera_018 (C)"], + "doorclosedpower_000": ["collision_camera_044 (C)", "collision_camera_051 (C)"], + "doorclosedpower_001": ["collision_camera_052 (C)", "collision_camera_053 (C)"], + "dooremmy": ["collision_camera_010 (C)", "collision_camera_013 (C)"], + "dooremmy_001": ["collision_camera_031 (C)", "collision_camera_032 (C)"], + "dooremmy_002": ["collision_camera_032 (C)", "collision_camera_034 (C)"], + "dooremmy_003": ["collision_camera_020 (C)", "collision_camera_052 (C)"], + "dooremmy_004": ["collision_camera_022 (C)", "collision_camera_030 (C)"], + "dooremmy_005": ["collision_camera_031 (C)", "collision_camera_035 (C)"], + "dooremmy_006": ["collision_camera_035 (C)", "collision_camera_040 (C)"], + "dooremmy_007": ["collision_camera_027 (C)", "collision_camera_028 (C)"], + "dooremmy_008": ["collision_camera_023 (C)", "collision_camera_028 (C)"], + "dooremmy_009": ["collision_camera_023 (C)", "collision_camera_028 (C)"], + "doorframe": ["collision_camera_025 (C)", "collision_camera_043 (C)"], + "doorframepresence": ["collision_camera_020 (C)", "collision_camera_059 (C)"], + "doorframepresence_001": ["collision_camera_012 (C)", "collision_camera_045 (C)"], + "doorgrapplegrapple": ["collision_camera_051 (C)", "collision_camera_052 (C)"], + "doorgrapplegrapple_000": ["collision_camera_014 (C)", "collision_camera_015 (C)"], + "doorheat_001": ["collision_camera_004 (C)", "collision_camera_007 (C)"], + "doorheat_004": ["collision_camera_040 (C)", "collision_camera_042 (C)"], + "doorpowerpower": ["collision_camera_000 (C)", "collision_camera_006 (C)"], + "doorpowerpower_000": ["collision_camera_032 (C)", "collision_camera_046 (C)"], + "doorpowerpower_001": ["collision_camera_006 (C)", "collision_camera_015 (C)"], + "doorpowerpower_002": ["collision_camera_000 (C)", "collision_camera_002 (C)"], + "doorpowerpower_003": ["collision_camera_002 (C)", "collision_camera_004 (C)"], + "doorpowerpower_004": ["collision_camera_004 (C)", "collision_camera_007 (C)"], + "doorpowerpower_007": ["collision_camera_025 (C)", "collision_camera_062 (C)"], + "doorpowerpower_008": ["collision_camera_025 (C)", "collision_camera_064 (C)"], + "doorpowerpower_009": ["collision_camera_025 (C)", "collision_camera_058 (C)"], + "doorpowerpower_010": ["collision_camera_027 (C)", "collision_camera_058 (C)"], + "doorpowerpower_011": ["collision_camera_028 (C)", "collision_camera_029 (C)"], + "doorpowerpower_012": ["collision_camera_024 (C)", "collision_camera_061 (C)"], + "doorpowerpower_013": ["collision_camera_022 (C)", "collision_camera_029 (C)"], + "doorpowerpower_014": ["collision_camera_030 (C)", "collision_camera_031 (C)"], + "doorpowerpower_015": ["collision_camera_032 (C)", "collision_camera_046 (C)"], + "doorpowerpower_016": ["collision_camera_010 (C)", "collision_camera_032 (C)"], + "doorpowerpower_017": ["collision_camera_033 (C)", "collision_camera_034 (C)"], + "doorpowerpower_018": ["collision_camera_018 (C)", "collision_camera_033 (C)"], + "doorpowerpower_019": ["collision_camera_004 (C)", "collision_camera_007 (C)"], + "doorpowerpower_020": ["collision_camera_016 (C)", "collision_camera_042 (C)"], + "doorpowerpower_021": ["collision_camera_040 (C)", "collision_camera_041 (C)"], + "doorpowerpower_022": ["collision_camera_013 (C)", "collision_camera_014 (C)"], + "doorpowerpower_023": ["collision_camera_014 (C)", "collision_camera_045 (C)"], + "doorpowerpower_025": ["collision_camera_016 (C)", "collision_camera_048 (C)"], + "doorpowerpower_026": ["collision_camera_009 (C)", "collision_camera_021 (C)"], + "doorpowerpower_027": ["collision_camera_019 (C)", "collision_camera_052 (C)"], + "doorpowerpower_028": ["collision_camera_023 (C)", "collision_camera_064 (C)"], + "doorpowerpower_029": ["collision_camera_023 (C)", "collision_camera_043 (C)"], + "doorpowerpower_030": ["collision_camera_035 (C)", "collision_camera_036 (C)"], + "doorpresenceframe_000": ["collision_camera_014 (C)", "collision_camera_018 (C)"], + "doorshieldmissile": ["collision_camera_044 (C)", "collision_camera_051 (C)"], + "doorshutter_000": ["collision_camera_010 (C)"], + "doorshutter_001": ["collision_camera_020 (C)", "collision_camera_046 (C)"], + "doorshutter_002": ["collision_camera_028 (C)", "collision_camera_059 (C)"], + "doorwavebeam_000": ["collision_camera_052 (C)", "collision_camera_053 (C)"], + "doorwidebeam_000": ["collision_camera_035 (C)", "collision_camera_036 (C)"], + "emmyvalve_reg_gen_000": ["collision_camera_046 (C)"], + "emmyvalve_reg_gen_001": ["collision_camera_020 (C)"], + "emmyvalve_reg_gen_002": ["collision_camera_028 (C)"], + "emmyvalve_reg_gen_003": ["collision_camera_059 (C)"], + "emmyvalve_reg_gen_004": ["collision_camera_028 (C)"], + "emmyvalve_reg_gen_005": ["collision_camera_046 (C)"], + "emmyvalve_reg_gen_006": ["collision_camera_020 (C)"], + "emmyvalve_reg_gen_007": ["collision_camera_036 (C)"], + "emmyvalve_reg_gen_008": ["collision_camera_028 (C)"], + "emmyvalve_reg_gen_009": ["collision_camera_022 (C)"], + "emmyvalve_reg_gen_010": ["collision_camera_035 (C)"], + "emmyvalve_reg_gen_011": ["collision_camera_046 (C)"], + "emmyvalve_reg_gen_012": ["collision_camera_032 (C)"], + "emmyvalve_reg_gen_013": ["collision_camera_028 (C)"], + "emmyvalve_reg_gen_014": ["collision_camera_020 (C)"], + "emmyvalve_reg_gen_015": ["collision_camera_029 (C)"], + "emmyvalve_reg_gen_016": ["collision_camera_028 (C)"], + "emmyvalve_reg_gen_017": ["collision_camera_028 (C)"], + "emmyvalve_reg_gen_018": ["collision_camera_036 (C)"], + "emmyvalve_reg_gen_019": ["collision_camera_036 (C)"], + "emmyvalve_reg_gen_020": ["collision_camera_020 (C)"], + "emmyvalve_reg_gen_021": ["collision_camera_020 (C)"], + "emmyvalve_reg_gen_022": ["collision_camera_046 (C)"], + "emmyvalve_reg_gen_023": ["collision_camera_032 (C)"], + "emmyvalve_reg_gen_024": ["collision_camera_032 (C)"], + "energyrecharge": ["collision_camera_018 (C)"], + "env_heat_gen_001": ["collision_camera_015 (C)"], + "env_heat_gen_002": ["collision_camera_021 (C)"], + "env_heat_gen_003": ["collision_camera_026 (C)"], + "env_heat_gen_004": ["collision_camera_053 (C)"], + "env_heat_gen_005": ["collision_camera_038 (C)"], + "env_heat_gen_006": ["collision_camera_049 (C)"], + "env_heat_gen_007": ["collision_camera_012 (C)"], + "ev_dspiston_heat_000": ["collision_camera_042 (C)"], + "ev_dspiston_mg_001": ["collision_camera_031 (C)"], + "ev_hpiston_mg_001": ["collision_camera_009 (C)", "collision_camera_CooldownX (C)"], + "ev_hpiston_mg_001_off": ["collision_camera_009 (C)", "collision_camera_CooldownX (C)"], + "ev_lavapump_mg_001": ["collision_camera_009 (C)"], + "ev_tpiston_heat_000": ["collision_camera_012 (C)"], + "ev_tpiston_mg_001": ["collision_camera_014 (C)"], + "fan_cooldown_000": ["collision_camera_009 (C)"], + "footstepplatform_000": ["collision_camera_010 (C)"], + "footstepplatform_001": ["collision_camera_020 (C)"], + "footstepplatform_002": ["collision_camera_028 (C)"], + "fusiblebox_000": ["collision_camera_009 (C)", "collision_camera_CooldownX (C)"], + "fusiblebox_broken_000": ["collision_camera_009 (C)", "collision_camera_CooldownX (C)"], + "fx_heat_door": ["collision_camera_009 (C)", "collision_camera_049 (C)"], + "fx_heat_door_000": ["collision_camera_009 (C)", "collision_camera_021 (C)"], + "fx_heat_door_001": ["collision_camera_052 (C)", "collision_camera_053 (C)"], + "fx_heat_door_002": ["collision_camera_019 (C)", "collision_camera_052 (C)"], + "fx_heat_door_003": ["collision_camera_051 (C)", "collision_camera_052 (C)"], + "fx_heat_door_004": ["collision_camera_023 (C)", "collision_camera_043 (C)"], + "fx_heat_door_005": ["collision_camera_018 (C)", "collision_camera_042 (C)"], + "fx_heat_door_006": ["collision_camera_016 (C)", "collision_camera_042 (C)"], + "fx_heat_door_007": ["collision_camera_016 (C)", "collision_camera_048 (C)"], + "fx_heat_door_008": ["collision_camera_006 (C)", "collision_camera_015 (C)"], + "fx_heat_door_009": ["collision_camera_006 (C)", "collision_camera_012 (C)"], + "fx_heat_door_010": ["collision_camera_012 (C)", "collision_camera_045 (C)"], + "fx_heat_door_011": ["collision_camera_012 (C)", "collision_camera_013 (C)"], + "fx_heat_door_012": ["collision_camera_014 (C)", "collision_camera_015 (C)"], + "fx_heat_tunnel_000": ["collision_camera_025 (C)"], + "fx_heat_tunnel_001": ["collision_camera_027 (C)"], + "fx_heat_tunnel_002": ["collision_camera_045 (C)"], + "grapplepulloff1x2": ["collision_camera_044 (C)"], + "grapplepulloff1x2_000": ["collision_camera_053 (C)"], + "grapplepulloff1x2_001": ["collision_camera_026 (C)"], + "instanceactor_085": ["collision_camera_053 (C)"], + "instanceactor_086": ["collision_camera_053 (C)"], + "instanceactor_087": ["collision_camera_053 (C)"], + "instanceactor_088": ["collision_camera_053 (C)"], + "instanceactor_089": ["collision_camera_053 (C)"], + "instanceactor_091": ["collision_camera_053 (C)"], + "instanceactor_092": ["collision_camera_053 (C)"], + "instanceactor_093": ["collision_camera_053 (C)"], + "instanceactor_297": ["collision_camera_036 (C)"], + "instanceactor_298": ["collision_camera_036 (C)"], + "instanceactor_299": ["collision_camera_036 (C)"], + "instancefx_032": ["collision_camera_049 (C)"], + "item_energyfragment_000": ["collision_camera_053 (C)"], + "item_energyfragment_001": ["collision_camera_042 (C)"], + "item_energytank_000": ["collision_camera_042 (C)"], + "item_missiletank": ["collision_camera_000 (C)"], + "item_missiletank_000": ["collision_camera_040 (C)"], + "item_missiletank_001": ["collision_camera_021 (C)"], + "item_missiletank_002": ["collision_camera_049 (C)"], + "item_missiletank_003": ["collision_camera_051 (C)"], + "item_missiletank_004": ["collision_camera_028 (C)"], + "item_missiletank_005": ["collision_camera_026 (C)"], + "item_missiletank_006": ["collision_camera_026 (C)"], + "item_missiletank_007": ["collision_camera_048 (C)"], + "item_missiletank_008": ["collision_camera_009 (C)"], + "item_missiletank_009": ["collision_camera_015 (C)"], + "item_missiletank_010": ["collision_camera_045 (C)"], + "item_missiletank_011": ["collision_camera_055 (C)"], + "item_missiletank_012": ["collision_camera_061 (C)"], + "item_missiletankplus_000": ["collision_camera_025 (C)"], + "item_powerbombtank_000": ["collision_camera_015 (C)"], + "item_powerbombtank_001": ["collision_camera_044 (C)"], + "item_powerbombtank_002": ["collision_camera_029 (C)"], + "itemsphere_diffusionbeam": ["collision_camera_044 (C)"], + "lavazone": ["collision_camera_012 (C)"], + "lavazone_000": [], + "lavazone_001": ["collision_camera_049 (C)"], + "lavazone_002": ["collision_camera_021 (C)"], + "lavazone_003": ["collision_camera_019 (C)"], + "lavazone_004": ["collision_camera_019 (C)"], + "lavazone_005": [], + "lavazone_006": ["collision_camera_051 (C)"], + "lavazone_007": ["collision_camera_061 (C)"], + "lavazone_008": ["collision_camera_061 (C)"], + "lavazone_009": ["collision_camera_024 (C)"], + "lavazone_010": ["collision_camera_024 (C)"], + "lavazone_011": ["collision_camera_038 (C)"], + "lavazone_012": ["collision_camera_043 (C)"], + "lavazone_013": ["collision_camera_026 (C)"], + "lavazone_014": ["collision_camera_015 (C)"], + "lavazone_015": ["collision_camera_063 (C)"], + "magnetsurface": ["collision_camera_019 (C)"], + "magnetsurface_000": ["collision_camera_019 (C)"], + "magnetsurface_001": ["collision_camera_051 (C)"], + "magnetsurface_002": ["collision_camera_063 (C)"], + "magnetsurface_003": ["collision_camera_036 (C)"], + "magnetsurface_004": ["collision_camera_028 (C)"], + "magnetsurface_005": ["collision_camera_032 (C)"], + "magnetsurface_006": ["collision_camera_036 (C)"], + "magnetsurface_007": ["collision_camera_035 (C)"], + "magnetsurface_008": ["collision_camera_031 (C)"], + "magnetsurface_009": ["collision_camera_031 (C)"], + "magnetsurface_010": ["collision_camera_031 (C)"], + "magnetsurface_011": ["collision_camera_032 (C)"], + "magnetsurface_012": ["collision_camera_042 (C)"], + "magnetsurface_013": ["collision_camera_014 (C)"], + "magnetsurface_014": ["collision_camera_028 (C)"], + "magnetsurface_015": ["collision_camera_042 (C)"], + "magnetsurface_016": ["collision_camera_055 (C)"], + "magnetsurface_017": ["collision_camera_009 (C)"], + "magnetsurface_018": ["collision_camera_010 (C)"], + "magnetsurface_019": ["collision_camera_000 (C)"], + "magnetsurface_020": ["collision_camera_000 (C)"], + "magnetsurface_021": ["collision_camera_014 (C)"], + "magnetsurface_022": ["collision_camera_018 (C)"], + "magnetsurface_023": ["collision_camera_028 (C)"], + "magnetsurface_024": ["collision_camera_020 (C)"], + "magnetsurface_025": ["collision_camera_046 (C)"], + "magnetsurface_026": ["collision_camera_032 (C)"], + "magnetsurface_027": ["collision_camera_032 (C)"], + "magnetsurface_028": ["collision_camera_010 (C)"], + "magnetsurface_029": ["collision_camera_028 (C)"], + "magnetsurface_030": ["collision_camera_036 (C)"], + "magnetsurface_031": ["collision_camera_028 (C)"], + "magnetsurface_032": ["collision_camera_029 (C)"], + "magnetsurface_033": ["collision_camera_059 (C)"], + "magnetsurface_034": ["collision_camera_059 (C)"], + "magnetsurface_035": ["collision_camera_020 (C)"], + "magnetsurface_036": ["collision_camera_020 (C)"], + "magnetsurface_037": ["collision_camera_020 (C)"], + "magnetsurface_038": ["collision_camera_046 (C)"], + "magnetsurface_039": ["collision_camera_032 (C)"], + "magnetsurface_040": ["collision_camera_032 (C)"], + "magnetsurface_041": ["collision_camera_032 (C)"], + "magnetsurface_042": ["collision_camera_010 (C)"], + "magnetsurface_043": ["collision_camera_010 (C)"], + "magnetsurface_044": ["collision_camera_063 (C)"], + "magnetsurface_045": ["collision_camera_061 (C)"], + "magnetsurface_046": ["collision_camera_026 (C)"], + "maproom": ["collision_camera_030 (C)"], + "maproom_platform": ["collision_camera_030 (C)"], + "mblauncher_exit_gen_001": ["collision_camera_009 (C)"], + "mblauncher_exit_gen_002": ["collision_camera_063 (C)", "collision_camera_063_Stage_002 (C)"], + "mblauncher_exit_gen_003": ["collision_camera_063 (C)", "collision_camera_063_Stage_002 (C)"], + "mblauncher_launcher_gen_001": ["collision_camera_004 (C)"], + "mblauncher_launcher_gen_002": ["collision_camera_063 (C)", "collision_camera_063_Stage_002 (C)"], + "mblauncher_launcher_gen_003": ["collision_camera_063 (C)", "collision_camera_063_Stage_002 (C)"], + "nofreezeroom_000": ["collision_camera_009 (C)", "collision_camera_CooldownX (C)"], + "pistonmag01": ["collision_camera_038 (C)"], + "pistonmag01_000": ["collision_camera_012 (C)"], + "pistonmag01_001": [], + "pistonmag01_off": [], + "pistonmag01_off_post": [], + "rail_magnet_mg_001": ["collision_camera_015 (C)"], + "rail_magnet_mg_003": ["collision_camera_042 (C)"], + "savestation_000": ["collision_camera_062 (C)"], + "savestation_000_platform": ["collision_camera_062 (C)"], + "savestation_001": ["collision_camera_033 (C)"], + "savestation_001_platform": ["collision_camera_033 (C)"], + "sg_vignette_prevent_001": ["collision_camera_026 (C)"], + "shootactivatormag01": ["collision_camera_038 (C)"], + "shootactivatormag01_000": ["collision_camera_012 (C)"], + "shootactivatormag01_001": [], + "shootactivatormag01fakeblock_000": ["collision_camera_012 (C)"], + "shootactivatoroff_000": [], + "shootactivatoroff_000_post": [], + "spawnpointrinka_000": ["collision_camera_037 (C)"], + "spawnpointrinka_001": ["collision_camera_037 (C)"], + "steammag01": ["collision_camera_000 (C)"], + "steammag01_000": ["collision_camera_000 (C)"], + "steammag01_001": ["collision_camera_000 (C)"], + "steammag01_002": ["collision_camera_000 (C)"], + "steammag01_003": ["collision_camera_000 (C)"], + "steammag01_004": ["collision_camera_000 (C)"], + "steammag01_005": ["collision_camera_000 (C)"], + "steammag01_006": ["collision_camera_000 (C)"], + "steammag01_007": ["collision_camera_000 (C)"], + "steammag01_008": ["collision_camera_000 (C)"], + "steammag01_009": ["collision_camera_000 (C)"], + "steammag01_010": ["collision_camera_040 (C)"], + "steammag01_011": ["collision_camera_040 (C)"], + "steammag01_012": ["collision_camera_040 (C)"], + "steammag01_013": ["collision_camera_040 (C)"], + "steammag01_014": ["collision_camera_038 (C)"], + "steammag01_015": ["collision_camera_038 (C)"], + "steammag01_016": ["collision_camera_012 (C)"], + "steammag01_017": ["collision_camera_012 (C)"], + "steammag01_018": ["collision_camera_012 (C)"], + "teleport_baselab_000": ["collision_camera_051 (C)"], + "teleport_baselab_000_platform": ["collision_camera_051 (C)"], + "teleporter_cave_000": ["collision_camera_015 (C)"], + "teleporter_cave_000_platform": ["collision_camera_015 (C)"], + "teleporter_forest_000": ["collision_camera_026 (C)"], + "teleporter_forest_000_platform": ["collision_camera_026 (C)"], + "totalrechargestation": ["collision_camera_007 (C)"], + "totalrechargestation_000": ["collision_camera_016 (C)"], + "trap_thermal_horizontal": ["collision_camera_042 (C)"], + "trap_thermal_horizontal_000": ["collision_camera_009 (C)"], + "trap_thermal_horizontal_001": ["collision_camera_010 (C)"], + "trap_thermal_horizontal_002": ["collision_camera_012 (C)"], + "trap_thermal_horizontal_003": ["collision_camera_032 (C)"], + "trap_thermal_horizontal_004": ["collision_camera_004 (C)"], + "trap_thermal_horizontal_005": ["collision_camera_009 (C)"], + "trap_thermal_horizontal_POSTCOOL": ["collision_camera_009 (C)"], + "trap_thermal_horizontal_PRECOOL": ["collision_camera_009 (C)"], + "videomanager_000": ["collision_camera_036 (C)"], + "wagontrain_baselab_000": ["collision_camera_041 (C)"], + "wagontrain_baselab_000_platform": ["collision_camera_041 (C)"], + "weightactivatedplatform_000": ["collision_camera_023 (C)"], + "weightactivatedplatform_002": ["collision_camera_018 (C)"], + "weightactivatedplatform_003": ["collision_camera_042 (C)"], + "weightactivatedplatform_004": ["collision_camera_034 (C)"], + "weightactivatedplatform_005": ["collision_camera_004 (C)"], + "weightactivatedplatform_006": ["collision_camera_042 (C)"], + "weightactivatedplatform_total": ["collision_camera_007 (C)"], + "weightactivatedplatform_total_000": ["collision_camera_016 (C)"], + "zipline_bottom_gen_001": [], + "zipline_bottom_gen_002": ["collision_camera_025 (C)"], + "zipline_bottom_gen_003": ["collision_camera_020 (C)"], + "zipline_right_gen_001": ["collision_camera_025 (C)"], + "zipline_right_gen_002": ["collision_camera_015 (C)"], + "zipline_right_gen_003": ["collision_camera_035 (C)"], + }, + "s030_baselab": { + "AP_04": [], + "AP_06": ["collision_camera_044 (D)"], + "CAM_Default": [], + "CAM_PowerGenerator": ["collision_camera_007 (D)"], + "CAM_ShakernautEvent": ["collision_camera_022 (D)"], + "CAM_Train": ["collision_camera_043 (D)"], + "CoolShineLeftVisited": ["collision_camera_016 (D)"], + "CoolShineUpViewed": ["collision_camera_016 (D)"], + "CoolShineUpVisited": ["collision_camera_016 (D)"], + "LE_WorldGraph": [], + "LM_EmmyDestroySearch": ["collision_camera_040 (D)"], + "LM_EmmyEntrancePoint_000": ["collision_camera_018 (D)"], + "LM_EmmyEntrancePoint_001": ["collision_camera_018 (D)"], + "LM_EmmyEntrancePoint_002": ["collision_camera_018 (D)"], + "LM_EmmyEntrancePoint_003": ["collision_camera_005 (D)"], + "LM_EmmyEntrancePoint_004": ["collision_camera_005 (D)"], + "LM_EmmyEntrancePoint_005": ["collision_camera_005 (D)"], + "LM_EmmyEntrancePoint_006": ["collision_camera_018 (D)"], + "LM_EmmyEntrancePoint_007": ["collision_camera_005 (D)"], + "LM_EmmyEntrancePoint_010": ["collision_camera_017 (D)"], + "LM_EmmyEntrancePoint_011": ["collision_camera_017 (D)"], + "LM_EmmyEntrancePoint_012": ["collision_camera_017 (D)"], + "LM_EmmyEntrancePoint_013": ["collision_camera_017 (D)"], + "LM_EmmyEntrancePoint_015": ["collision_camera_016 (D)"], + "LM_EmmyEntrancePoint_016": ["collision_camera_016 (D)"], + "LM_EmmyEntrancePoint_017": ["collision_camera_016 (D)"], + "LM_EmmyEntrancePoint_019": ["collision_camera_016 (D)"], + "LM_EmmyEntrancePoint_020": ["collision_camera_016 (D)"], + "LM_EmmyEntrancePoint_021": ["collision_camera_029 (D)"], + "LM_EmmyEntrancePoint_022": ["collision_camera_027 (D)"], + "LM_EmmyEntrancePoint_023": ["collision_camera_027 (D)"], + "LM_EmmyEntrancePoint_024": ["collision_camera_029 (D)"], + "LM_EmmyEntrancePoint_025": ["collision_camera_029 (D)"], + "LM_EmmyEntrancePoint_026": ["collision_camera_036 (D)"], + "LM_EmmyEntrancePoint_027": ["collision_camera_037 (D)"], + "LM_EmmyEntrancePoint_028": ["collision_camera_037 (D)"], + "LM_EmmyEntrancePoint_029": ["collision_camera_037 (D)"], + "LM_EmmyPresentation": ["collision_camera_018 (D)"], + "LM_EmmySpawnAfterAqua": ["collision_camera_037 (D)"], + "LS_EMMYIMPASSABLE_000": ["collision_camera_040 (D)"], + "LS_EMMYIMPASSABLE_001": ["collision_camera_017 (D)"], + "LS_EMMYIMPASSABLE_002": ["collision_camera_017 (D)"], + "LS_EMMYIMPASSABLE_003": ["collision_camera_036 (D)"], + "LS_EMMYIMPASSABLE_004": ["collision_camera_016 (D)"], + "LS_EMMYIMPASSABLE_005": ["collision_camera_016 (D)"], + "LS_EMMYIMPASSABLE_006": ["collision_camera_017 (D)"], + "LS_EMMYIMPASSABLE_007": ["collision_camera_027 (D)"], + "LS_EMMYIMPASSABLE_008": ["collision_camera_029 (D)"], + "LS_EMMYIMPASSABLE_009": ["collision_camera_029 (D)"], + "LS_EMMYIMPASSABLE_010": ["collision_camera_029 (D)"], + "LS_EMMYIMPASSABLE_011": ["collision_camera_040 (D)"], + "LS_EMMYIMPASSABLE_012": ["collision_camera_040 (D)"], + "LS_EMMYIMPASSABLE_013": ["collision_camera_040 (D)"], + "LS_EMMYIMPASSABLE_014": ["collision_camera_018 (D)"], + "LS_EMMYIMPASSABLE_015": ["collision_camera_005 (D)"], + "LS_EMMYIMPASSABLE_016": ["collision_camera_018 (D)"], + "LS_EMMYIMPASSABLE_017": ["collision_camera_027 (D)"], + "LS_EMMYIMPASSABLE_018": ["collision_camera_040 (D)"], + "LS_EMMYIMPASSABLE_019": ["collision_camera_040 (D)"], + "LS_EMMYIMPASSABLE_020": ["collision_camera_037 (D)"], + "LS_EMMYIMPASSABLE_021": ["collision_camera_005 (D)"], + "LS_EMMYIMPASSABLE_022": ["collision_camera_005 (D)"], + "LS_EMMYIMPASSABLE_023": ["collision_camera_005 (D)"], + "LS_EMMYIMPASSABLE_024": ["collision_camera_027 (D)"], + "LS_EMMYIMPASSABLE_025": ["collision_camera_037 (D)"], + "LS_EMMYIMPASSABLE_026": ["collision_camera_037 (D)"], + "LS_EMMYIMPASSABLE_027": ["collision_camera_037 (D)"], + "LS_EMMYIMPASSABLE_028": ["collision_camera_037 (D)"], + "LS_EMMYIMPASSABLE_029": ["collision_camera_037 (D)"], + "LS_EMMYIMPASSABLE_030": ["collision_camera_018 (D)"], + "LS_EMMYIMPASSABLE_031": ["collision_camera_037 (D)"], + "LS_EMMYIMPASSABLE_032": ["collision_camera_037 (D)"], + "LS_EMMYIMPASSABLE_033": ["collision_camera_029 (D)"], + "LS_EMMYIMPASSABLE_034": ["collision_camera_029 (D)"], + "LS_EMMYIMPASSABLE_035": ["collision_camera_029 (D)"], + "LS_EMMYIMPASSABLE_036": ["collision_camera_037 (D)"], + "LS_EMMYIMPASSABLE_037": ["collision_camera_016 (D)", "collision_camera_027 (D)"], + "LS_EmmyZone": ["collision_camera_018 (D)"], + "LS_Lab_RinkaLifeArea": ["collision_camera_038 (D)"], + "LS_PATROLEMMY_01": ["collision_camera_018 (D)"], + "LS_PATROLEMMY_02": ["collision_camera_018 (D)"], + "LS_PATROLEMMY_03": ["collision_camera_017 (D)"], + "LS_PATROLEMMY_04": ["collision_camera_016 (D)"], + "LS_PATROLEMMY_05": ["collision_camera_016 (D)"], + "LS_PATROLEMMY_06": ["collision_camera_016 (D)"], + "LS_PATROLEMMY_07": ["collision_camera_029 (D)"], + "LS_PATROLEMMY_08": ["collision_camera_029 (D)"], + "LS_PATROLEMMY_09": ["collision_camera_040 (D)"], + "LS_PATROLEMMY_10": ["collision_camera_040 (D)"], + "LS_PATROLEMMY_11": ["collision_camera_005 (D)"], + "LS_PATROLEMMY_12": ["collision_camera_040 (D)"], + "LS_PATROLEMMY_13": ["collision_camera_037 (D)"], + "LS_PATROLEMMY_14": ["collision_camera_037 (D)"], + "PoolViewed": ["collision_camera_025 (D)"], + "PoolVisited": ["collision_camera_025 (D)"], + "Rail_Train": ["collision_camera_043 (D)"], + "SG_Lab_Cannons": ["collision_camera_038 (D)"], + "SP_AccessPoint_4": ["collision_camera_013 (D)"], + "SP_Checkpoint_AfterAqua": ["collision_camera_045 (D)"], + "SP_Checkpoint_AfterDiffusion": ["collision_camera_008 (D)"], + "SP_Checkpoint_AfterProfessor": ["collision_camera_019 (D)"], + "SP_Checkpoint_Blackout": ["collision_camera_004 (D)"], + "SP_Checkpoint_Blackout2": ["collision_camera_020 (D)"], + "SP_Checkpoint_Bomb": ["collision_camera_021 (D)"], + "SP_Checkpoint_CentralUnit": ["collision_camera_040 (D)"], + "SP_Checkpoint_EmmyBaseLab": ["collision_camera_004 (D)"], + "SP_Checkpoint_EmmyLabPhase2": ["collision_camera_038 (D)"], + "SP_Checkpoint_SpeedBooster": ["collision_camera_040 (D)"], + "SP_Emmy": ["collision_camera_017 (D)"], + "SP_Lab_CUCannon": ["collision_camera_038 (D)"], + "SP_Lab_Rinka_000": ["collision_camera_038 (D)"], + "SP_Lab_Rinka_001": ["collision_camera_038 (D)"], + "SP_Lab_Rinka_002": ["collision_camera_038 (D)"], + "SP_WideBeam": ["collision_camera_006 (D)"], + "StartPoint0": ["collision_camera_043 (D)"], + "TG_CombatCU": ["collision_camera_038 (D)"], + "TG_Cool_Shinespark_Begin": ["collision_camera_016 (D)"], + "TG_Cool_Shinespark_End": ["collision_camera_016 (D)"], + "TG_EmmyLAB_Deactivation": ["collision_camera_004 (D)"], + "TG_EmmySpawnAfterAqua": ["collision_camera_045 (D)"], + "TG_EmmyUnlockDoors": ["collision_camera_037 (D)"], + "TG_MapCoolShineLeft": ["collision_camera_033 (D)"], + "TG_MapCoolShineUp": ["collision_camera_016 (D)"], + "TG_PATROLEMMYACTIVATOR_01": ["collision_camera_000 (D)"], + "TG_PATROLEMMYACTIVATOR_02": ["collision_camera_018 (D)"], + "TG_PATROLEMMYACTIVATOR_03": ["collision_camera_017 (D)"], + "TG_PATROLEMMYACTIVATOR_04": ["collision_camera_026 (D)"], + "TG_PATROLEMMYACTIVATOR_05": ["collision_camera_033 (D)"], + "TG_PATROLEMMYACTIVATOR_06": ["collision_camera_015 (D)"], + "TG_PATROLEMMYACTIVATOR_07": ["collision_camera_027 (D)"], + "TG_PATROLEMMYACTIVATOR_08": ["collision_camera_031 (D)"], + "TG_PATROLEMMYACTIVATOR_09": ["collision_camera_029 (D)"], + "TG_PATROLEMMYACTIVATOR_10": ["collision_camera_039 (D)"], + "TG_PATROLEMMYACTIVATOR_11": ["collision_camera_005 (D)"], + "TG_PATROLEMMYACTIVATOR_12": ["collision_camera_040 (D)"], + "TG_PATROLEMMYACTIVATOR_13": ["collision_camera_037 (D)"], + "TG_PATROLEMMYACTIVATOR_14": ["collision_camera_037 (D)"], + "TG_VisitLauncherSection": ["collision_camera_021 (D)"], + "TG_VisitPool": ["collision_camera_025 (D)"], + "VisitLauncherSection": ["collision_camera_021 (D)"], + "accesspoint_000": ["collision_camera_014 (D)"], + "accesspoint_000_platform": ["collision_camera_014 (D)"], + "accesspoint_001": ["collision_camera_044 (D)"], + "accesspoint_001_platform": ["collision_camera_044 (D)"], + "ammorecharge_001": ["collision_camera_034 (D)"], + "ammorecharge_001_platform": ["collision_camera_034 (D)"], + "box_grapple_cv_001": ["collision_camera_003 (D)"], + "box_wide_cv_001": ["collision_camera_002 (D)"], + "box_wide_cv_002": ["collision_camera_019 (D)"], + "box_wide_cv_003": ["collision_camera_001 (D)"], + "box_wide_cv_004": ["collision_camera_004 (D)"], + "camerarailpath_PowerGenerator": ["collision_camera_007 (D)"], + "camerarailpath_ShakernautEvent": ["collision_camera_022 (D)"], + "centralunitlaboratory": ["collision_camera_038 (D)"], + "centralunitmagmacontroller": ["collision_camera_038 (D)"], + "db_dif_b1_001": ["collision_camera_008 (D)"], + "db_dif_b1_002": ["collision_camera_017 (D)"], + "db_hdoor_b1_001": ["collision_camera_010 (D)"], + "db_reg_b1_001": ["collision_camera_025 (D)"], + "db_reg_b1_002": ["collision_camera_025 (D)"], + "db_reg_b1_003": ["collision_camera_024 (D)"], + "db_reg_b1_005": ["collision_camera_004 (D)"], + "door_frblack_gen_000": ["collision_camera_040 (D)"], + "door_frblack_gen_001": ["collision_camera_037 (D)", "collision_camera_040 (D)"], + "door_frblack_gen_002": ["collision_camera_037 (D)", "collision_camera_040 (D)"], + "doorcentralunit": ["collision_camera_040 (D)"], + "doorchargecharge_000": ["collision_camera_037 (D)", "collision_camera_040 (D)"], + "doorchargecharge_001": ["collision_camera_013 (D)", "collision_camera_014 (D)"], + "doorchargecharge_002": ["collision_camera_010 (D)", "collision_camera_013 (D)"], + "doorchargeclosed_000": ["collision_camera_005 (D)", "collision_camera_018 (D)"], + "doorchargeclosed_001": ["collision_camera_011 (D)", "collision_camera_012 (D)"], + "doorclosedcharge_000": ["collision_camera_033 (D)", "collision_camera_034 (D)"], + "dooremmy_000": ["collision_camera_004 (D)", "collision_camera_018 (D)"], + "dooremmy_001": ["collision_camera_002 (D)", "collision_camera_005 (D)"], + "dooremmy_002": ["collision_camera_003 (D)", "collision_camera_005 (D)"], + "dooremmy_003": ["collision_camera_017 (D)", "collision_camera_019 (D)"], + "dooremmy_004": ["collision_camera_017 (D)", "collision_camera_020 (D)"], + "dooremmy_005": ["collision_camera_016 (D)", "collision_camera_026 (D)"], + "dooremmy_006": ["collision_camera_015 (D)", "collision_camera_016 (D)"], + "dooremmy_007": ["collision_camera_016 (D)", "collision_camera_033 (D)"], + "dooremmy_008": ["collision_camera_027 (D)", "collision_camera_028 (D)"], + "dooremmy_009": ["collision_camera_029 (D)", "collision_camera_030 (D)"], + "dooremmy_010": ["collision_camera_036 (D)", "collision_camera_039 (D)"], + "dooremmy_011": ["collision_camera_034 (D)", "collision_camera_037 (D)"], + "dooremmy_012": ["collision_camera_037 (D)", "collision_camera_041 (D)"], + "doorframe_000": ["collision_camera_037 (D)", "collision_camera_040 (D)"], + "doorpowerclosed_000": ["collision_camera_021 (D)", "collision_camera_022 (D)"], + "doorpowerpower": ["collision_camera_029 (D)", "collision_camera_036 (D)"], + "doorpowerpower_000": ["collision_camera_000 (D)", "collision_camera_001 (D)"], + "doorpowerpower_001": ["collision_camera_000 (D)", "collision_camera_002 (D)"], + "doorpowerpower_002": ["collision_camera_016 (D)", "collision_camera_027 (D)"], + "doorpowerpower_003": ["collision_camera_027 (D)", "collision_camera_029 (D)"], + "doorpowerpower_004": ["collision_camera_014 (D)", "collision_camera_015 (D)"], + "doorpowerpower_007": ["collision_camera_010 (D)", "collision_camera_012 (D)"], + "doorpowerpower_009": ["collision_camera_031 (D)", "collision_camera_032 (D)"], + "doorpowerpower_010": ["collision_camera_004 (D)", "collision_camera_006 (D)"], + "doorpowerpower_011": ["collision_camera_008 (D)", "collision_camera_010 (D)"], + "doorpowerpower_012": ["collision_camera_016 (D)", "collision_camera_017 (D)"], + "doorpowerpower_013": ["collision_camera_019 (D)", "collision_camera_044 (D)"], + "doorpowerpower_014": ["collision_camera_019 (D)", "collision_camera_044 (D)"], + "doorpowerpower_015": ["collision_camera_001 (D)", "collision_camera_043 (D)"], + "doorpowerpower_016": ["collision_camera_039 (D)", "collision_camera_046 (D)"], + "doorpowerpower_017": ["collision_camera_041 (D)", "collision_camera_045 (D)"], + "doorpowerpower_018": ["collision_camera_008 (D)", "collision_camera_009 (D)"], + "doorpowerpower_019": ["collision_camera_004 (D)", "collision_camera_009 (D)"], + "doorpowerpower_020": ["collision_camera_007 (D)", "collision_camera_008 (D)"], + "doorpowerpower_021": ["collision_camera_006 (D)", "collision_camera_008 (D)"], + "doorpowerpower_022": ["collision_camera_020 (D)", "collision_camera_022 (D)"], + "doorpowerpower_023": ["collision_camera_022 (D)", "collision_camera_026 (D)"], + "doorpowerpower_025": ["collision_camera_022 (D)", "collision_camera_023 (D)"], + "doorpowerpower_026": ["collision_camera_023 (D)", "collision_camera_025 (D)"], + "doorpowerpower_027": ["collision_camera_024 (D)", "collision_camera_025 (D)"], + "doorpowerpower_028": ["collision_camera_025 (D)", "collision_camera_042 (D)"], + "doorpowerpower_029": ["collision_camera_028 (D)", "collision_camera_030 (D)"], + "doorpowerpower_030": ["collision_camera_025 (D)", "collision_camera_042 (D)"], + "doorshieldmissile_000": ["collision_camera_006 (D)", "collision_camera_008 (D)"], + "doorshieldmissile_001": ["collision_camera_021 (D)", "collision_camera_022 (D)"], + "doorshutter_001": ["collision_camera_018 (D)"], + "doorshutter_002": ["collision_camera_037 (D)"], + "doorshutter_004": ["collision_camera_005 (D)"], + "doorwidebeam_000": ["collision_camera_004 (D)", "collision_camera_006 (D)"], + "doorwidebeam_001": ["collision_camera_008 (D)", "collision_camera_010 (D)"], + "doorwidebeam_002": ["collision_camera_004 (D)", "collision_camera_006 (D)"], + "elevator_cave_000": ["collision_camera_011 (D)"], + "elevator_cave_000_platform": ["collision_camera_011 (D)"], + "elevator_forest_000": ["collision_camera_047 (D)"], + "elevator_forest_000_platform": ["collision_camera_047 (D)"], + "elevator_sanctuary_000": ["collision_camera_003 (D)"], + "elevator_sanctuary_000_platform": ["collision_camera_003 (D)"], + "elevator_sanctuary_001": ["collision_camera_019 (D)"], + "elevator_sanctuary_001_platform": ["collision_camera_019 (D)"], + "emergency_light_000": ["collision_camera_009 (D)"], + "emergency_light_001": ["collision_camera_008 (D)"], + "emergency_light_002": ["collision_camera_020 (D)"], + "emergency_light_003": ["collision_camera_022 (D)"], + "emergency_light_004": ["collision_camera_022 (D)"], + "emergency_light_005": ["collision_camera_026 (D)"], + "emergency_light_006": ["collision_camera_022 (D)"], + "emergency_light_007": ["collision_camera_025 (D)"], + "emergency_light_008": ["collision_camera_025 (D)"], + "emergency_light_009": ["collision_camera_028 (D)"], + "emergency_light_010": ["collision_camera_030 (D)"], + "emergency_light_011": ["collision_camera_023 (D)"], + "emergency_light_012": ["collision_camera_023 (D)"], + "emmyvalve_reg_gen_000": ["collision_camera_018 (D)"], + "emmyvalve_reg_gen_001": ["collision_camera_018 (D)"], + "emmyvalve_reg_gen_002": ["collision_camera_017 (D)", "collision_camera_018 (D)"], + "emmyvalve_reg_gen_003": ["collision_camera_017 (D)"], + "emmyvalve_reg_gen_004": ["collision_camera_016 (D)"], + "emmyvalve_reg_gen_005": ["collision_camera_016 (D)"], + "emmyvalve_reg_gen_008": ["collision_camera_027 (D)"], + "emmyvalve_reg_gen_009": ["collision_camera_029 (D)"], + "emmyvalve_reg_gen_010": ["collision_camera_036 (D)"], + "emmyvalve_reg_gen_011": ["collision_camera_040 (D)"], + "emmyvalve_reg_gen_012": ["collision_camera_037 (D)"], + "emmyvalve_reg_gen_013": ["collision_camera_040 (D)"], + "emmyvalve_reg_gen_014": ["collision_camera_017 (D)"], + "emmyvalve_reg_gen_015": ["collision_camera_017 (D)"], + "emmyvalve_reg_gen_016": ["collision_camera_037 (D)"], + "emmyvalve_reg_gen_017": ["collision_camera_037 (D)"], + "energyrecharge_000": ["collision_camera_015 (D)"], + "energyrecharge_000_platform": ["collision_camera_015 (D)"], + "energyrecharge_001": ["collision_camera_042 (D)"], + "energyrecharge_001_platform": ["collision_camera_042 (D)"], + "energyrecharge_002": ["collision_camera_001 (D)"], + "energyrecharge_002_platform": ["collision_camera_001 (D)"], + "env_frozen_gen_001": ["collision_camera_025 (D)"], + "env_heat_gen_001": ["collision_camera_013 (D)"], + "footstepplatform_001": ["collision_camera_018 (D)"], + "footstepplatform_002": ["collision_camera_037 (D)"], + "footstepplatform_004": ["collision_camera_005 (D)"], + "fx_cold_door": ["collision_camera_025 (D)", "collision_camera_042 (D)"], + "fx_cold_door_000": ["collision_camera_025 (D)", "collision_camera_042 (D)"], + "fx_cold_door_001": ["collision_camera_024 (D)", "collision_camera_025 (D)"], + "fx_cold_door_002": ["collision_camera_023 (D)", "collision_camera_025 (D)"], + "fx_heat_door": ["collision_camera_013 (D)", "collision_camera_014 (D)"], + "fx_heat_door_000": ["collision_camera_008 (D)", "collision_camera_010 (D)"], + "grapplepulloff1x2": ["collision_camera_026 (D)"], + "grapplepulloff1x2_000": ["collision_camera_012 (D)"], + "grapplepulloff1x2_001": ["collision_camera_012 (D)"], + "grapplepulloff1x2_002": ["collision_camera_020 (D)"], + "grapplepulloff1x2_003": ["collision_camera_035 (D)"], + "grapplepulloff1x2_005": ["collision_camera_030 (D)"], + "grapplepulloff1x2_006": ["collision_camera_011 (D)"], + "grapplepulloff1x2_007": ["collision_camera_004 (D)"], + "grappleswingpoint_000": ["collision_camera_004 (D)"], + "grappleswingpoint_001": ["collision_camera_004 (D)"], + "grappleswingpoint_002": ["collision_camera_004 (D)"], + "grappleswingpoint_003": ["collision_camera_004 (D)"], + "item_energyfragment_000": ["collision_camera_018 (D)"], + "item_energyfragment_001": ["collision_camera_010 (D)"], + "item_energyfragment_002": ["collision_camera_042 (D)"], + "item_energyfragment_003": ["collision_camera_040 (D)"], + "item_energytank": ["collision_camera_016 (D)"], + "item_missiletank": ["collision_camera_004 (D)"], + "item_missiletank_000": ["collision_camera_001 (D)"], + "item_missiletank_001": ["collision_camera_030 (D)"], + "item_missiletank_002": ["collision_camera_012 (D)"], + "item_missiletank_003": ["collision_camera_021 (D)"], + "item_missiletank_004": ["collision_camera_012 (D)"], + "item_missiletank_005": ["collision_camera_020 (D)"], + "item_missiletank_006": ["collision_camera_025 (D)"], + "item_missiletank_007": ["collision_camera_027 (D)"], + "item_missiletank_008": ["collision_camera_025 (D)"], + "item_missiletank_010": ["collision_camera_031 (D)"], + "item_missiletankplus_000": ["collision_camera_033 (D)"], + "item_powerbombtank_000": ["collision_camera_011 (D)"], + "item_powerbombtank_001": ["collision_camera_035 (D)"], + "item_powerbombtank_002": ["collision_camera_017 (D)"], + "itemsphere_bomb": ["collision_camera_021 (D)"], + "itemsphere_widebeam": ["collision_camera_006 (D)"], + "lavazone_000": ["collision_camera_012 (D)"], + "lavazone_001": ["collision_camera_010 (D)"], + "lavazone_002": ["collision_camera_013 (D)"], + "magnetsurface": ["collision_camera_027 (D)"], + "magnetsurface_000": ["collision_camera_001 (D)"], + "magnetsurface_001": ["collision_camera_017 (D)"], + "magnetsurface_002": ["collision_camera_001 (D)"], + "magnetsurface_003": ["collision_camera_002 (D)"], + "magnetsurface_004": ["collision_camera_037 (D)"], + "magnetsurface_005": ["collision_camera_011 (D)"], + "magnetsurface_006": ["collision_camera_008 (D)"], + "magnetsurface_007": ["collision_camera_037 (D)"], + "magnetsurface_008": ["collision_camera_017 (D)"], + "magnetsurface_009": ["collision_camera_015 (D)"], + "magnetsurface_010": ["collision_camera_016 (D)"], + "magnetsurface_011": ["collision_camera_016 (D)"], + "magnetsurface_012": ["collision_camera_027 (D)"], + "magnetsurface_013": ["collision_camera_037 (D)"], + "magnetsurface_014": ["collision_camera_016 (D)"], + "magnetsurface_015": ["collision_camera_016 (D)"], + "magnetsurface_016": ["collision_camera_037 (D)"], + "magnetsurface_017": ["collision_camera_016 (D)"], + "magnetsurface_018": ["collision_camera_037 (D)"], + "magnetsurface_019": ["collision_camera_037 (D)"], + "magnetsurface_020": ["collision_camera_027 (D)"], + "magnetsurface_021": ["collision_camera_029 (D)"], + "magnetsurface_022": ["collision_camera_029 (D)"], + "magnetsurface_023": ["collision_camera_029 (D)"], + "magnetsurface_024": ["collision_camera_036 (D)"], + "magnetsurface_025": ["collision_camera_037 (D)"], + "magnetsurface_026": ["collision_camera_036 (D)"], + "magnetsurface_027": ["collision_camera_005 (D)"], + "magnetsurface_028": ["collision_camera_039 (D)"], + "magnetsurface_029": ["collision_camera_031 (D)"], + "magnetsurface_030": ["collision_camera_018 (D)"], + "magnetsurface_031": ["collision_camera_016 (D)"], + "magnetsurface_032": ["collision_camera_016 (D)"], + "magnetsurface_033": ["collision_camera_016 (D)"], + "magnetsurface_034": ["collision_camera_025 (D)"], + "magnetsurface_035": ["collision_camera_017 (D)"], + "magnetsurface_036": ["collision_camera_017 (D)"], + "magnetsurface_037": ["collision_camera_016 (D)"], + "magnetsurface_038": ["collision_camera_016 (D)"], + "magnetsurface_039": ["collision_camera_022 (D)"], + "magnetsurface_040": ["collision_camera_025 (D)"], + "magnetsurface_041": ["collision_camera_037 (D)"], + "maproom_000": ["collision_camera_023 (D)"], + "maproom_000_platform": ["collision_camera_023 (D)"], + "mblauncher_exit_gen_001": ["collision_camera_022 (D)"], + "mblauncher_exit_gen_002": ["collision_camera_028 (D)"], + "mblauncher_exit_gen_003": ["collision_camera_002 (D)"], + "mblauncher_launcher_gen_001": ["collision_camera_021 (D)"], + "mblauncher_launcher_gen_002": ["collision_camera_026 (D)"], + "mblauncher_launcher_gen_003": ["collision_camera_031 (D)"], + "mblauncher_launcher_gen_004": ["collision_camera_030 (D)"], + "mblauncher_launcher_gen_005": ["collision_camera_031 (D)"], + "mblauncher_launcher_gen_006": ["collision_camera_030 (D)"], + "mblauncher_launcher_gen_007": ["collision_camera_011 (D)"], + "mlm_block_000": ["collision_camera_033 (D)"], + "mlm_point_000": ["collision_camera_033 (D)"], + "mlm_point_001": ["collision_camera_033 (D)"], + "mlm_point_002": ["collision_camera_033 (D)"], + "mlm_point_003": ["collision_camera_033 (D)"], + "mlm_point_004": ["collision_camera_033 (D)"], + "portal_trainwagon_left": [], + "powergenerator_001": ["collision_camera_007 (D)"], + "powergenerator_001_platform": ["collision_camera_007 (D)"], + "powergenerator_002": ["collision_camera_024 (D)"], + "powergenerator_002_platform": ["collision_camera_024 (D)"], + "powergeneratorengine_001": ["collision_camera_007 (D)"], + "powergeneratorengine_002": ["collision_camera_024 (D)"], + "savestation_000": ["collision_camera_000 (D)"], + "savestation_000_platform": ["collision_camera_000 (D)"], + "savestation_001": ["collision_camera_032 (D)"], + "savestation_001_platform": ["collision_camera_032 (D)"], + "teleport_cave_000": ["collision_camera_001 (D)"], + "teleport_cave_000_platform": ["collision_camera_001 (D)"], + "teleport_magma_000": ["collision_camera_008 (D)"], + "teleport_magma_000_platform": ["collision_camera_008 (D)"], + "totalrechargestation_000": ["collision_camera_022 (D)"], + "totalrechargestation_001": ["collision_camera_009 (D)"], + "wagontrain_aqua_000": ["collision_camera_046 (D)"], + "wagontrain_aqua_000_platform": ["collision_camera_046 (D)"], + "wagontrain_aqua_001_platform": ["collision_camera_045 (D)"], + "wagontrain_magma_000": ["collision_camera_043 (D)"], + "wagontrain_magma_000_platform": ["collision_camera_043 (D)"], + "wagontrain_with_portal_aqua_001": ["collision_camera_045 (D)"], + "waterzone_000": ["collision_camera_035 (D)"], + "waterzone_001": ["collision_camera_041 (D)"], + "waterzone_002": ["collision_camera_039 (D)"], + "waterzone_003": ["collision_camera_039 (D)"], + "waterzone_004": ["collision_camera_039 (D)"], + "waterzone_005": [], + "waterzone_006": ["collision_camera_025 (D)"], + "weightactivatedplatform_total_000": ["collision_camera_022 (D)"], + "weightactivatedplatform_total_001": ["collision_camera_009 (D)"], + "zipline_bottom_gen_000": ["collision_camera_029 (D)"], + "zipline_bottom_gen_002": ["collision_camera_016 (D)"], + "zipline_left_gen_002": ["collision_camera_016 (D)"], + "zipline_right_gen_001": ["collision_camera_017 (D)"], + "zipline_right_gen_002": ["collision_camera_016 (D)"], + }, + "s040_aqua": { + "AP_05": ["collision_camera_009 (B)"], + "AP_09": ["collision_camera_016 (B)"], + "CAM_Default": [], + "CAM_Far": ["collision_camera_001 (B)"], + "CAM_Train": ["collision_camera_003 (B)"], + "LE_Platform_Teleport_Secret": ["collision_camera_008 (B)"], + "LE_Teleport_Secret": ["collision_camera_008 (B)"], + "Rail_Train": ["collision_camera_003 (B)"], + "SP_AccessPoint_5": ["collision_camera_001 (B)"], + "SP_AccessPoint_9": ["collision_camera_021 (B)"], + "SP_AccessPoint_9B": ["collision_camera_017 (B)"], + "SP_Checkpoint_Cooldown": ["collision_camera_017 (B)"], + "SP_Checkpoint_Dead_2RCW": ["collision_camera_021 (B)"], + "SP_Checkpoint_Demolition": ["collision_camera_021 (B)"], + "SP_Checkpoint_DoorProfessor": ["collision_camera_001 (B)"], + "SP_Checkpoint_GhostDash": ["collision_camera_010 (B)"], + "SP_Checkpoint_GhostDashObtained": ["collision_camera_014 (B)"], + "SP_Checkpoint_GravitySuit": ["collision_camera_023_B (B)"], + "SP_Checkpoint_Hydrogiga": ["collision_camera_005 (B)"], + "SP_Checkpoint_Hydrogiga_Dead": ["collision_camera_028 (B)"], + "SP_Checkpoint_Trench": ["collision_camera_015 (B)"], + "SP_Checkpoint_TwoChozoRobots_Aqua": ["collision_camera_021 (B)"], + "StartPoint0": ["collision_camera_003 (B)"], + "TG_Cam010_MusicChange": ["collision_camera_013 (B)"], + "TG_Cam010_MusicChange_000": ["collision_camera_013 (B)"], + "TG_Cam010_MusicChange_001": ["collision_camera_010 (B)"], + "TG_Cam010_MusicChange_002": ["collision_camera_010 (B)"], + "TG_Cam010_MusicChange_003": ["collision_camera_015 (B)"], + "TG_ChangeCamera_001_B": ["collision_camera_001 (B)"], + "TG_ChangeCamera_002": ["collision_camera_002 (B)"], + "TG_ChangeCamera_021": ["collision_camera_021 (B)"], + "TG_ChangeCamera_023_Enter": [], + "TG_ChangeCamera_023_Exit": [], + "TG_ChangeCamera_10": ["collision_camera_010 (B)"], + "TG_ChangeCamera_15": ["collision_camera_015 (B)"], + "TG_FlashShiftClose": ["collision_camera_014 (B)"], + "TG_GravitySuit_MusicChange": ["collision_camera_023_B (B)"], + "TG_IgnoreHangHydrogigaArena": ["collision_camera_007 (B)"], + "TG_KeepDirection_000": ["collision_camera_028 (B)", "collision_camera_029 (B)"], + "TG_KeepDirection_001": ["collision_camera_007 (B)"], + "TG_MusicChange_021_nodelay": ["collision_camera_023_B (B)"], + "TG_MusicChange_021_nodelay_000": ["collision_camera_021 (B)"], + "TG_waterzone_010": ["collision_camera_010 (B)"], + "TG_waterzone_011": ["collision_camera_010 (B)"], + "TG_waterzone_012": ["collision_camera_010 (B)"], + "TG_waterzone_013": ["collision_camera_010 (B)"], + "TG_waterzone_014": ["collision_camera_010 (B)"], + "TG_waterzone_015": ["collision_camera_010 (B)"], + "TG_waterzone_016": ["collision_camera_010 (B)"], + "TG_waterzone_018": ["collision_camera_010 (B)"], + "TG_waterzone_027": ["collision_camera_010 (B)"], + "TriggerOpt_001": ["collision_camera_010 (B)"], + "TriggerOpt_002": ["collision_camera_010 (B)"], + "TriggerOpt_003": ["collision_camera_010 (B)"], + "TriggerOpt_004": ["collision_camera_010 (B)"], + "TriggerOpt_005": ["collision_camera_010 (B)"], + "TriggerOpt_006": ["collision_camera_010 (B)"], + "TriggerOpt_007": ["collision_camera_010 (B)"], + "accesspoint_000": ["collision_camera_009 (B)"], + "accesspoint_000_platform": ["collision_camera_009 (B)"], + "accesspoint_001": ["collision_camera_016 (B)"], + "accesspoint_001_platform": ["collision_camera_016 (B)"], + "aeiongd_statue": ["collision_camera_014 (B)"], + "ammorecharge_001": ["collision_camera_022 (B)"], + "ammorecharge_001_platform": ["collision_camera_022 (B)"], + "ammorecharge_002": ["collision_camera_008 (B)"], + "ammorecharge_002_platform": ["collision_camera_008 (B)"], + "box_magnet_aq_002": ["collision_camera_010 (B)"], + "camerarailpath": ["collision_camera_001 (B)"], + "db_reg_aq_001": ["collision_camera_002 (B)"], + "db_reg_aq_002": ["collision_camera_002 (B)"], + "db_reg_aq_003": ["collision_camera_010 (B)"], + "db_reg_aq_004": ["collision_camera_023_B (B)"], + "db_reg_aq_005": ["collision_camera_021 (B)"], + "db_reg_aq_007": ["collision_camera_002 (B)"], + "db_reg_aq_008": ["collision_camera_006 (B)"], + "db_reg_aq_009": ["collision_camera_008 (B)"], + "db_reg_aq_011": ["collision_camera_006 (B)"], + "db_reg_aq_012": ["collision_camera_015 (B)"], + "door_shield_plasma_002": ["collision_camera_010 (B)", "collision_camera_013 (B)"], + "door_shield_plasma_003": ["collision_camera_010 (B)", "collision_camera_013 (B)"], + "door_shield_plasma_004": ["collision_camera_010 (B)", "collision_camera_015 (B)"], + "doorclosedcharge_001": ["collision_camera_015 (B)", "collision_camera_021 (B)"], + "doorclosedcharge_002": ["collision_camera_010 (B)", "collision_camera_015 (B)"], + "doorclosedpower": ["collision_camera_010 (B)", "collision_camera_015 (B)"], + "doorframepresence": ["collision_camera_021 (B)", "collision_camera_022 (B)"], + "doorframepresence_000": ["collision_camera_021 (B)", "collision_camera_022 (B)"], + "doorgrapplegrapple_000": ["collision_camera_005 (B)", "collision_camera_008 (B)"], + "doorgrapplegrapple_001": ["collision_camera_006 (B)", "collision_camera_007 (B)"], + "doorpowerclosed_000": ["collision_camera_010 (B)", "collision_camera_014 (B)"], + "doorpowerpower_000": ["collision_camera_002 (B)", "collision_camera_003 (B)"], + "doorpowerpower_001": ["collision_camera_001 (B)", "collision_camera_002 (B)"], + "doorpowerpower_002": ["collision_camera_001 (B)", "collision_camera_009 (B)"], + "doorpowerpower_003": ["collision_camera_008 (B)", "collision_camera_009 (B)"], + "doorpowerpower_004": ["collision_camera_008 (B)", "collision_camera_010 (B)"], + "doorpowerpower_005": ["collision_camera_010 (B)", "collision_camera_011 (B)"], + "doorpowerpower_006": ["collision_camera_002 (B)", "collision_camera_012 (B)"], + "doorpowerpower_007": ["collision_camera_002 (B)", "collision_camera_004 (B)"], + "doorpowerpower_008": ["collision_camera_000 (B)", "collision_camera_001 (B)"], + "doorpowerpower_009": ["collision_camera_000 (B)", "collision_camera_008 (B)"], + "doorpowerpower_010": ["collision_camera_005 (B)", "collision_camera_029 (B)"], + "doorpowerpower_011": ["collision_camera_006 (B)", "collision_camera_030 (B)"], + "doorpowerpower_013": ["collision_camera_010 (B)", "collision_camera_013 (B)"], + "doorpowerpower_014": ["collision_camera_010 (B)", "collision_camera_013 (B)"], + "doorpowerpower_015": ["collision_camera_021 (B)", "collision_camera_023_B (B)"], + "doorpowerpower_016": ["collision_camera_021 (B)", "collision_camera_023_B (B)"], + "doorpowerpower_018": ["collision_camera_016 (B)", "collision_camera_021 (B)"], + "doorpowerpower_019": ["collision_camera_016 (B)", "collision_camera_017 (B)"], + "doorpowerpower_020": ["collision_camera_015 (B)", "collision_camera_018 (B)"], + "doorpowerpower_021": ["collision_camera_015 (B)", "collision_camera_018 (B)"], + "doorpowerpower_022": ["collision_camera_010 (B)", "collision_camera_026 (B)"], + "doorpowerpower_023": ["collision_camera_010 (B)", "collision_camera_026 (B)"], + "doorpowerpower_024": ["collision_camera_010 (B)", "collision_camera_025 (B)"], + "doorpowerpower_025": ["collision_camera_026 (B)", "collision_camera_027 (B)"], + "doorshieldmissile_000": ["collision_camera_010 (B)", "collision_camera_014 (B)"], + "doorshieldmissile_001": ["collision_camera_021 (B)", "collision_camera_023_B (B)"], + "doorshutter_000": ["collision_camera_010 (B)", "collision_camera_012 (B)"], + "doorshutter_001": ["collision_camera_010 (B)", "collision_camera_014 (B)"], + "doorshutter_002": ["collision_camera_008 (B)"], + "doorshutter_003": ["collision_camera_021 (B)"], + "doorshutter_004": ["collision_camera_021 (B)"], + "elevator_cave_000": ["collision_camera_017 (B)"], + "elevator_cave_000_platform": ["collision_camera_017 (B)"], + "elevator_forest_000": ["collision_camera_006 (B)"], + "elevator_forest_000_platform": ["collision_camera_006 (B)"], + "energyrecharge_000": ["collision_camera_006 (B)"], + "energyrecharge_000_platform": ["collision_camera_006 (B)"], + "energyrecharge_001": ["collision_camera_013 (B)"], + "energyrecharge_001_platform": ["collision_camera_013 (B)"], + "ev_aquadrain_left": ["collision_camera_002 (B)"], + "ev_aquadrain_right": ["collision_camera_002 (B)"], + "ev_demolition_block": ["collision_camera_021 (B)"], + "ev_demolition_db_001": ["collision_camera_021 (B)"], + "ev_demolition_db_002": ["collision_camera_021 (B)"], + "ev_demolition_db_003": ["collision_camera_021 (B)"], + "ev_demolition_debris": ["collision_camera_021 (B)"], + "ev_demolition_grapple": ["collision_camera_021 (B)"], + "ev_demolition_tunnel": ["collision_camera_021 (B)"], + "ev_doorprof": ["collision_camera_001 (B)"], + "ev_doorprof_open": ["collision_camera_001 (B)"], + "fan_reg": ["collision_camera_002 (B)"], + "footstepplatform_000": ["collision_camera_010 (B)"], + "footstepplatform_001": ["collision_camera_010 (B)"], + "footstepplatform_002": ["collision_camera_014 (B)"], + "footstepplatform_003": ["collision_camera_008 (B)"], + "grapplepulloff1x2_000": ["collision_camera_002 (B)"], + "grapplepulloff1x2_001": ["collision_camera_008 (B)"], + "grapplepulloff1x2_003": ["collision_camera_010 (B)"], + "grapplepulloff1x2_004": ["collision_camera_006 (B)"], + "grapplepulloff1x2_005": ["collision_camera_010 (B)"], + "grapplepulloff1x2_006": ["collision_camera_029 (B)"], + "grappleswingpoint_000": ["collision_camera_005 (B)"], + "grappleswingpoint_001": ["collision_camera_005 (B)"], + "grappleswingpoint_002": ["collision_camera_007 (B)"], + "grappleswingpoint_003": ["collision_camera_007 (B)"], + "instanceactor_001": ["collision_camera_003 (B)"], + "instanceactor_232": ["collision_camera_002 (B)"], + "instanceactor_233": ["collision_camera_002 (B)"], + "instanceactor_234": ["collision_camera_002 (B)"], + "instanceactor_235": ["collision_camera_002 (B)"], + "instanceactor_237": ["collision_camera_002 (B)"], + "instanceactor_238": ["collision_camera_002 (B)"], + "instanceactor_239": ["collision_camera_002 (B)"], + "instanceactor_241": ["collision_camera_018 (B)"], + "instanceactor_242": ["collision_camera_018 (B)"], + "instanceactor_243": ["collision_camera_018 (B)"], + "instanceactor_244": ["collision_camera_002 (B)"], + "instanceactor_248": ["collision_camera_003 (B)"], + "instanceactor_249": ["collision_camera_003 (B)"], + "instanceactor_250": ["collision_camera_003 (B)"], + "instanceactor_251": ["collision_camera_003 (B)"], + "instanceactor_252": ["collision_camera_003 (B)"], + "instanceactor_253": ["collision_camera_003 (B)"], + "instanceactor_254": ["collision_camera_003 (B)"], + "instanceactor_255": ["collision_camera_003 (B)"], + "instanceactor_256": ["collision_camera_003 (B)"], + "instanceactor_257": ["collision_camera_003 (B)"], + "instanceactor_258": ["collision_camera_003 (B)"], + "instanceactor_259": ["collision_camera_003 (B)"], + "instanceactor_260": ["collision_camera_003 (B)"], + "instancefx_000": [], + "instancefx_001": [], + "instancefx_002": [], + "instancefx_003": [], + "instancefx_004": [], + "instancefx_005": [], + "instancefx_006": [], + "instancefx_007": [], + "instancefx_008": [], + "instancefx_doorprof_drops_000": ["collision_camera_001 (B)"], + "instancefx_doorprof_drops_001": ["collision_camera_001 (B)"], + "instancefx_doorprof_drops_002": ["collision_camera_001 (B)"], + "instancefx_doorprof_stream_000": ["collision_camera_001 (B)"], + "instancefx_doorprof_stream_001": ["collision_camera_001 (B)"], + "instancefx_doorprof_stream_002": ["collision_camera_001 (B)"], + "instancefx_doorprof_stream_003": ["collision_camera_001 (B)"], + "instancefx_doorprof_stream_004": ["collision_camera_001 (B)"], + "instancefx_doorprof_stream_005": ["collision_camera_001 (B)"], + "item_energyfragment_000": ["collision_camera_002 (B)"], + "item_energyfragment_002": ["collision_camera_018 (B)"], + "item_energytank": ["collision_camera_025 (B)"], + "item_energytank_000": ["collision_camera_010 (B)"], + "item_missiletank": ["collision_camera_013 (B)"], + "item_missiletank_000": ["collision_camera_007 (B)"], + "item_missiletank_001": ["collision_camera_002 (B)"], + "item_missiletank_003": ["collision_camera_017 (B)"], + "item_missiletank_004": ["collision_camera_021 (B)"], + "item_missiletank_005": ["collision_camera_010 (B)"], + "item_missiletank_006": ["collision_camera_001 (B)"], + "item_missiletank_007": ["collision_camera_010 (B)"], + "item_missiletankplus": ["collision_camera_021 (B)"], + "item_missiletankplus_000": ["collision_camera_008 (B)"], + "item_missiletankplus_001": ["collision_camera_010 (B)"], + "item_missiletankplus_002": ["collision_camera_018 (B)"], + "item_powerbombtank_000": ["collision_camera_023_B (B)"], + "itemsphere_gravitysuit": ["collision_camera_023_B (B)"], + "magnetsurface_000": ["collision_camera_002 (B)"], + "magnetsurface_001": ["collision_camera_006 (B)"], + "magnetsurface_002": ["collision_camera_007 (B)"], + "magnetsurface_003": ["collision_camera_002 (B)"], + "magnetsurface_004": ["collision_camera_008 (B)"], + "magnetsurface_005": ["collision_camera_010 (B)"], + "magnetsurface_006": ["collision_camera_025 (B)"], + "magnetsurface_007": ["collision_camera_018 (B)"], + "magnetsurface_008": ["collision_camera_019 (B)"], + "magnetsurface_009": ["collision_camera_008 (B)"], + "magnetsurface_010": ["collision_camera_006 (B)"], + "magnetsurface_011": ["collision_camera_010 (B)"], + "magnetsurface_012": ["collision_camera_002 (B)"], + "magnetsurface_014": ["collision_camera_005 (B)"], + "magnetsurface_015": ["collision_camera_010 (B)"], + "magnetsurface_016": ["collision_camera_006 (B)"], + "magnetsurface_018": ["collision_camera_005 (B)"], + "magnetsurface_019": ["collision_camera_010 (B)"], + "maproom": ["collision_camera_000 (B)"], + "maproom_platform": ["collision_camera_000 (B)"], + "mlm2_point_000": ["collision_camera_008 (B)"], + "mlm2_point_001": ["collision_camera_008 (B)"], + "mlm2_point_002": ["collision_camera_008 (B)"], + "mlm2_point_003": ["collision_camera_008 (B)"], + "mlm2_point_004": ["collision_camera_008 (B)"], + "mlm_block_000": ["collision_camera_025 (B)"], + "mlm_block_001": ["collision_camera_008 (B)"], + "mlm_point_000": ["collision_camera_025 (B)"], + "mlm_point_001": ["collision_camera_025 (B)"], + "mlm_point_002": ["collision_camera_025 (B)"], + "mlm_point_003": ["collision_camera_025 (B)"], + "mlm_point_004": ["collision_camera_025 (B)"], + "portal_trainwagon_right": [], + "powerup_ghostaura": ["collision_camera_014 (B)"], + "rail_magnet_aq_001": ["collision_camera_010 (B)"], + "savestation_000": ["collision_camera_011 (B)"], + "savestation_000_platform": ["collision_camera_011 (B)"], + "savestation_001": ["collision_camera_027 (B)"], + "savestation_001_platform": ["collision_camera_027 (B)"], + "savestation_002": ["collision_camera_030 (B)"], + "savestation_002_platform": ["collision_camera_030 (B)"], + "spacejump_marker_000": ["collision_camera_010 (B)"], + "spacejump_marker_001": ["collision_camera_010 (B)"], + "spacejump_marker_002": ["collision_camera_010 (B)"], + "spacejump_marker_003": ["collision_camera_010 (B)"], + "spacejump_marker_004": ["collision_camera_010 (B)"], + "spacejump_marker_005": ["collision_camera_010 (B)"], + "teleporter_forest_000": ["collision_camera_015 (B)"], + "teleporter_forest_000_platform": ["collision_camera_015 (B)"], + "wagontrain_baselab_000": ["collision_camera_003 (B)"], + "wagontrain_baselab_000_platform": ["collision_camera_003 (B)"], + "wagontrain_baselab_001_platform": ["collision_camera_004 (B)"], + "wagontrain_with_portal_baselab_001": ["collision_camera_004 (B)"], + "waterzone_000": ["collision_camera_002 (B)"], + "waterzone_001": ["collision_camera_002 (B)"], + "waterzone_002": ["collision_camera_002 (B)"], + "waterzone_003": ["collision_camera_002 (B)"], + "waterzone_004": ["collision_camera_002 (B)"], + "waterzone_005": ["collision_camera_017 (B)"], + "waterzone_006": ["collision_camera_002 (B)"], + "waterzone_007": ["collision_camera_023_B (B)"], + "waterzone_008": ["collision_camera_021 (B)"], + "waterzone_009": ["collision_camera_008 (B)"], + "waterzone_010": ["collision_camera_010 (B)"], + "waterzone_011": ["collision_camera_010 (B)"], + "waterzone_012": ["collision_camera_010 (B)"], + "waterzone_013": ["collision_camera_010 (B)"], + "waterzone_014": ["collision_camera_010 (B)"], + "waterzone_015": ["collision_camera_010 (B)"], + "waterzone_016": ["collision_camera_010 (B)"], + "waterzone_017": ["collision_camera_012 (B)"], + "waterzone_018": ["collision_camera_010 (B)"], + "waterzone_019": ["collision_camera_026 (B)"], + "waterzone_020": ["collision_camera_015 (B)"], + "waterzone_021": ["collision_camera_018 (B)"], + "waterzone_022": ["collision_camera_019 (B)"], + "waterzone_023": ["collision_camera_013 (B)"], + "waterzone_024": ["collision_camera_024 (B)"], + "waterzone_027": ["collision_camera_010 (B)"], + "waterzone_028": ["collision_camera_018 (B)"], + "waterzone_029": ["collision_camera_021 (B)"], + "waterzone_030": ["collision_camera_021 (B)"], + "waterzone_031": [], + "waterzone_032": ["collision_camera_021 (B)"], + "waterzone_033": ["collision_camera_021 (B)"], + "zipline_bottom_gen_002": ["collision_camera_010 (B)"], + "zipline_right_gen_000": ["collision_camera_010 (B)"], + "zipline_right_gen_001": ["collision_camera_010 (B)"], + }, + "s050_forest": { + "AP_07": ["collision_camera_006 (G)"], + "CAM_Default": ["collision_camera_000 (G)"], + "SP_AccessPoint_7": ["collision_camera_005 (G)"], + "SP_AccessPoint_7B": ["collision_camera_007 (G)"], + "SP_Checkpoint_CentralUnit": ["collision_camera_019 (G)"], + "SP_Checkpoint_ChozoRobotForest": ["collision_camera_001 (G)"], + "SP_Checkpoint_ChozoWarriorForest": ["collision_camera_025_B (G)"], + "SP_Checkpoint_Dead_ChozoRobotSoldier": ["collision_camera_002 (G)"], + "SP_Checkpoint_Dead_ChozoWarriorX": ["collision_camera_023 (G)"], + "SP_Checkpoint_DoubleJump": ["collision_camera_030 (G)"], + "SP_Checkpoint_EmmyForest": ["collision_camera_005 (G)"], + "SP_Checkpoint_EmmyForestPhase2": ["collision_camera_017 (G)"], + "SP_Checkpoint_IceMissiles": ["collision_camera_019 (G)"], + "SP_Checkpoint_LineBomb": ["collision_camera_026 (G)"], + "SP_Checkpoint_Sonar": ["collision_camera_039 (G)"], + "SP_Checkpoint_SonarObtained": ["collision_camera_032 (G)"], + "SP_Checkpoint_SuperGoliath": ["collision_camera_024 (G)"], + "SP_Checkpoint_SuperMissiles": ["collision_camera_010 (G)"], + "StartPoint0": ["collision_camera_000 (G)"], + "TG_KeepDirection_000": ["collision_camera_036 (G)"], + "TG_KeepDirection_001": ["collision_camera_024 (G)"], + "TG_SuperMissile_MusicChange": ["collision_camera_010 (G)"], + "accesspoint_000": ["collision_camera_006 (G)"], + "accesspoint_000_platform": ["collision_camera_006 (G)"], + "aeionstatue": ["collision_camera_032 (G)"], + "ammorecharge_001": ["collision_camera_021 (G)"], + "ammorecharge_001_platform": ["collision_camera_021 (G)"], + "box_grapple_cv_001": ["collision_camera_001 (G)"], + "box_grapple_cv_002": ["collision_camera_025_B (G)"], + "box_magnet_fr_001": ["collision_camera_035 (G)"], + "door_frblack_gen_000": [], + "door_frblack_gen_001": ["collision_camera_019 (G)"], + "door_frblack_gen_002": [], + "door_frblack_gen_003": ["collision_camera_019 (G)", "collision_camera_020 (G)"], + "door_frblack_gen_004": ["collision_camera_019 (G)", "collision_camera_020 (G)"], + "door_frblack_gen_005": ["collision_camera_019 (G)", "collision_camera_020 (G)"], + "door_frblack_gen_006": ["collision_camera_019 (G)", "collision_camera_020 (G)"], + "door_frblack_gen_007": ["collision_camera_019 (G)"], + "door_shield_plasma_000": ["collision_camera_000 (G)", "collision_camera_003 (G)"], + "door_shield_plasma_001": ["collision_camera_004 (G)", "collision_camera_011 (G)"], + "door_shield_plasma_002": ["collision_camera_000 (G)", "collision_camera_003 (G)"], + "door_shield_plasma_003": ["collision_camera_021 (G)", "collision_camera_022 (G)"], + "door_shield_plasma_004": ["collision_camera_021 (G)", "collision_camera_022 (G)"], + "doorchargecharge_000": ["collision_camera_018 (G)", "collision_camera_020 (G)"], + "doorchargecharge_001": ["collision_camera_016 (G)", "collision_camera_019 (G)"], + "doorclosedcharge": ["collision_camera_024 (G)", "collision_camera_039 (G)"], + "doorclosedpower_000": ["collision_camera_033 (G)", "collision_camera_034 (G)"], + "doorclosedpower_001": ["collision_camera_009 (G)", "collision_camera_010 (G)"], + "doorclosedpower_002": ["collision_camera_024 (G)", "collision_camera_025_B (G)"], + "doorclosedpower_003": ["collision_camera_033 (G)", "collision_camera_036 (G)"], + "dooremmy": ["collision_camera_020 (G)", "collision_camera_021 (G)"], + "dooremmy_000": ["collision_camera_003 (G)", "collision_camera_004 (G)"], + "dooremmy_001": ["collision_camera_004 (G)", "collision_camera_005 (G)"], + "dooremmy_002": ["collision_camera_011 (G)", "collision_camera_012 (G)"], + "dooremmy_003": ["collision_camera_011 (G)", "collision_camera_012 (G)"], + "dooremmy_004": ["collision_camera_014 (G)", "collision_camera_015 (G)"], + "dooremmy_005": ["collision_camera_014 (G)", "collision_camera_015 (G)"], + "dooremmy_006": ["collision_camera_015 (G)", "collision_camera_016 (G)"], + "dooremmy_007": ["collision_camera_020 (G)", "collision_camera_021 (G)"], + "doorframe_000": ["collision_camera_011 (G)", "collision_camera_014 (G)"], + "doorgrappleclosed_000": ["collision_camera_021 (G)", "collision_camera_039 (G)"], + "doorgrapplegrapple_000": ["collision_camera_024 (G)", "collision_camera_031 (G)"], + "doorgrapplegrapple_001": ["collision_camera_000 (G)", "collision_camera_001 (G)"], + "doorgrapplegrapple_003": ["collision_camera_029 (G)", "collision_camera_037 (G)"], + "doorgrapplegrapple_006": ["collision_camera_014 (G)", "collision_camera_018 (G)"], + "doorpowerclosed_000": ["collision_camera_001 (G)", "collision_camera_035 (G)"], + "doorpowerclosed_002": ["collision_camera_023 (G)", "collision_camera_025_B (G)"], + "doorpowerclosed_003": ["collision_camera_026 (G)", "collision_camera_033 (G)"], + "doorpowerpower": ["collision_camera_024 (G)", "collision_camera_040 (G)"], + "doorpowerpower_000": ["collision_camera_001 (G)", "collision_camera_002 (G)"], + "doorpowerpower_001": ["collision_camera_008 (G)", "collision_camera_038 (G)"], + "doorpowerpower_002": ["collision_camera_004 (G)", "collision_camera_011 (G)"], + "doorpowerpower_003": ["collision_camera_005 (G)", "collision_camera_006 (G)"], + "doorpowerpower_004": ["collision_camera_006 (G)", "collision_camera_007 (G)"], + "doorpowerpower_005": ["collision_camera_007 (G)", "collision_camera_029 (G)"], + "doorpowerpower_006": ["collision_camera_008 (G)", "collision_camera_009 (G)"], + "doorpowerpower_007": ["collision_camera_009 (G)", "collision_camera_010 (G)"], + "doorpowerpower_008": ["collision_camera_012 (G)", "collision_camera_013 (G)"], + "doorpowerpower_009": ["collision_camera_014 (G)", "collision_camera_018 (G)"], + "doorpowerpower_010": ["collision_camera_019 (G)", "collision_camera_020 (G)"], + "doorpowerpower_011": ["collision_camera_019 (G)", "collision_camera_020 (G)"], + "doorpowerpower_012": ["collision_camera_001 (G)", "collision_camera_010 (G)"], + "doorpowerpower_013": ["collision_camera_022 (G)", "collision_camera_023 (G)"], + "doorpowerpower_014": ["collision_camera_024 (G)", "collision_camera_025_B (G)"], + "doorpowerpower_015": ["collision_camera_024 (G)", "collision_camera_036 (G)"], + "doorpowerpower_017": ["collision_camera_002 (G)", "collision_camera_003 (G)"], + "doorpowerpower_018": ["collision_camera_000 (G)", "collision_camera_003 (G)"], + "doorpowerpower_019": ["collision_camera_021 (G)", "collision_camera_022 (G)"], + "doorshieldmissile_000": ["collision_camera_009 (G)", "collision_camera_010 (G)"], + "doorshieldmissile_001": ["collision_camera_024 (G)", "collision_camera_025_B (G)"], + "doorshieldsupermissile_000": ["collision_camera_001 (G)", "collision_camera_035 (G)"], + "doorshieldsupermissile_001": ["collision_camera_007 (G)", "collision_camera_029 (G)"], + "doorshieldsupermissile_002": ["collision_camera_009 (G)", "collision_camera_010 (G)"], + "elevator_aqua_000": ["collision_camera_000 (G)"], + "elevator_aqua_000_platform": ["collision_camera_000 (G)"], + "elevator_baselab_000": ["collision_camera_038 (G)"], + "elevator_baselab_000_platform": ["collision_camera_038 (G)"], + "emmy_frozen": ["collision_camera_004 (G)"], + "emmyvalve_reg_gen_000": ["collision_camera_004 (G)"], + "emmyvalve_reg_gen_001": ["collision_camera_011 (G)"], + "emmyvalve_reg_gen_002": ["collision_camera_014 (G)"], + "emmyvalve_reg_gen_003": ["collision_camera_018 (G)"], + "emmyvalve_reg_gen_005": ["collision_camera_020 (G)"], + "emmyvalve_reg_gen_006": ["collision_camera_020 (G)"], + "emmyvalve_reg_gen_007": ["collision_camera_020 (G)"], + "energyrecharge_002": ["collision_camera_031 (G)"], + "energyrecharge_002_platform": ["collision_camera_031 (G)"], + "grapplepulloff1x2_000": ["collision_camera_021 (G)"], + "grapplepulloff1x2_002": ["collision_camera_008 (G)"], + "grappleswingpoint_000": ["collision_camera_003 (G)"], + "grappleswingpoint_001": ["collision_camera_003 (G)"], + "grappleswingpoint_002": ["collision_camera_003 (G)"], + "item_energyfragment": ["collision_camera_024 (G)"], + "item_energyfragment_000": ["collision_camera_021 (G)"], + "item_energytank_000": ["collision_camera_021 (G)"], + "item_missiletank": ["collision_camera_024 (G)"], + "item_missiletank_000": ["collision_camera_001 (G)"], + "item_missiletank_001": ["collision_camera_008 (G)"], + "item_missiletank_002": ["collision_camera_028 (G)"], + "item_missiletank_003": ["collision_camera_003 (G)"], + "item_missiletank_004": ["collision_camera_024 (G)"], + "item_missiletank_005": ["collision_camera_033 (G)"], + "item_missiletank_006": ["collision_camera_039 (G)"], + "item_missiletank_007": ["collision_camera_024 (G)"], + "item_missiletank_009": ["collision_camera_029 (G)"], + "item_missiletankplus_000": ["collision_camera_009 (G)"], + "item_powerbombtank_000": ["collision_camera_021 (G)"], + "itemsphere_doublejump": ["collision_camera_030 (G)"], + "itemsphere_supermissile": ["collision_camera_010 (G)"], + "magnetsurface": ["collision_camera_029 (G)"], + "magnetsurface_000": ["collision_camera_001 (G)"], + "magnetsurface_001": ["collision_camera_001 (G)"], + "magnetsurface_002": ["collision_camera_003 (G)"], + "magnetsurface_003": ["collision_camera_003 (G)"], + "magnetsurface_004": ["collision_camera_004 (G)"], + "magnetsurface_005": ["collision_camera_004 (G)"], + "magnetsurface_006": ["collision_camera_011 (G)"], + "magnetsurface_007": ["collision_camera_009 (G)"], + "magnetsurface_008": ["collision_camera_035 (G)"], + "magnetsurface_009": ["collision_camera_012 (G)"], + "magnetsurface_010": ["collision_camera_014 (G)"], + "magnetsurface_011": ["collision_camera_014 (G)"], + "magnetsurface_012": ["collision_camera_018 (G)"], + "magnetsurface_013": ["collision_camera_021 (G)"], + "magnetsurface_014": ["collision_camera_021 (G)"], + "magnetsurface_015": ["collision_camera_025_B (G)"], + "magnetsurface_016": ["collision_camera_025_B (G)"], + "magnetsurface_017": ["collision_camera_031 (G)"], + "magnetsurface_018": ["collision_camera_014 (G)"], + "magnetsurface_019": ["collision_camera_031 (G)"], + "magnetsurface_020": ["collision_camera_020 (G)"], + "maproom": ["collision_camera_013 (G)"], + "maproom_platform": ["collision_camera_013 (G)"], + "mblauncher_exit_gen_001": ["collision_camera_007 (G)"], + "mblauncher_launcher_gen_001": ["collision_camera_035 (G)"], + "mblauncher_launcher_gen_002": ["collision_camera_024 (G)"], + "mblauncher_launcher_gen_003": ["collision_camera_030 (G)"], + "mlm_block_000": ["collision_camera_024 (G)"], + "mlm_point_000": ["collision_camera_025_B (G)"], + "mlm_point_001": ["collision_camera_024 (G)"], + "mlm_point_002": ["collision_camera_025_B (G)"], + "mlm_point_003": ["collision_camera_025_B (G)"], + "mlm_point_004": ["collision_camera_025_B (G)"], + "pf_mushr_fr_000": ["collision_camera_021 (G)"], + "pf_mushr_fr_001": ["collision_camera_021 (G)"], + "pf_mushr_fr_002": ["collision_camera_021 (G)"], + "pf_mushr_fr_003": ["collision_camera_021 (G)"], + "pf_mushr_fr_004": ["collision_camera_021 (G)"], + "pf_mushr_fr_005": ["collision_camera_021 (G)"], + "pf_mushr_fr_006": ["collision_camera_015 (G)"], + "pf_mushr_fr_007": ["collision_camera_015 (G)"], + "pf_mushr_fr_008": ["collision_camera_015 (G)"], + "pf_mushr_fr_009": ["collision_camera_025_B (G)"], + "pf_mushr_fr_010": ["collision_camera_015 (G)"], + "pf_mushr_fr_011": ["collision_camera_015 (G)"], + "pf_mushr_fr_012": ["collision_camera_025_B (G)"], + "powerup_sonar": ["collision_camera_032 (G)"], + "rail_magnet_fr_001": ["collision_camera_035 (G)"], + "savestation": ["collision_camera_040 (G)"], + "savestation_000": ["collision_camera_022 (G)"], + "savestation_000_platform": ["collision_camera_022 (G)"], + "spacejump_marker_000": ["collision_camera_031 (G)"], + "spacejump_marker_001": ["collision_camera_031 (G)"], + "spacejump_marker_002": ["collision_camera_031 (G)"], + "spacejump_marker_003": ["collision_camera_031 (G)"], + "spacejump_marker_004": ["collision_camera_031 (G)"], + "spacejump_marker_005": ["collision_camera_031 (G)"], + "spacejump_marker_006": ["collision_camera_015 (G)"], + "spacejump_marker_007": ["collision_camera_015 (G)"], + "spacejump_marker_008": ["collision_camera_015 (G)"], + "spacejump_marker_009": ["collision_camera_031 (G)"], + "teleporter_aqua_000": ["collision_camera_024 (G)"], + "teleporter_aqua_000_platform": ["collision_camera_024 (G)"], + "teleporter_magma_000": ["collision_camera_024 (G)"], + "teleporter_magma_000_platform": ["collision_camera_024 (G)"], + "totalrechargestation_000": ["collision_camera_025_B (G)"], + "totalrechargestation_001": ["collision_camera_001 (G)"], + "trap_rot_cv_001": ["collision_camera_007 (G)"], + "trigger_camera_019_B": ["collision_camera_019 (G)"], + "trigger_camera_03_B": ["collision_camera_003 (G)"], + "trigger_camera_03_C": ["collision_camera_003 (G)"], + "trigger_camera_23_B": ["collision_camera_023 (G)"], + "trigger_camera_24_B": ["collision_camera_024 (G)"], + "trigger_camera_25_B": ["collision_camera_025_B (G)"], + "trigger_camera_25_C": ["collision_camera_025_B (G)"], + "trigger_camera_ZoomIn_off": ["collision_camera_008 (G)"], + "trigger_camera_ZoomIn_on": ["collision_camera_007 (G)"], + "tunnelframe": ["collision_camera_016 (G)", "collision_camera_019 (G)"], + "wagontrain_quarantine_000": ["collision_camera_037 (G)"], + "wagontrain_quarantine_000_platform": ["collision_camera_037 (G)"], + "wagontrain_quarantine_with_cutscene_000": ["collision_camera_037 (G)"], + "wagontrain_sanctuary_000": ["collision_camera_027 (G)"], + "wagontrain_sanctuary_000_platform": ["collision_camera_027 (G)"], + "wagontrain_shipyard_000": ["collision_camera_034 (G)"], + "wagontrain_shipyard_000_platform": ["collision_camera_034 (G)"], + "waterzone_000": ["collision_camera_001 (G)"], + "waterzone_001": ["collision_camera_011 (G)"], + "waterzone_002": ["collision_camera_028 (G)"], + "waterzone_003": [], + "waterzone_004": [], + "waterzone_005": ["collision_camera_031 (G)"], + "waterzone_006": ["collision_camera_024 (G)"], + "waterzone_007": ["collision_camera_020 (G)"], + "waterzone_008": ["collision_camera_024 (G)"], + "weightactivatedplatform_save": ["collision_camera_040 (G)"], + "weightactivatedplatform_total_000": ["collision_camera_025_B (G)"], + "weightactivatedplatform_total_001": ["collision_camera_001 (G)"], + "zipline_bottom_gen_002": ["collision_camera_019 (G)"], + "zipline_right_gen_002": ["collision_camera_004 (G)"], + }, + "s060_quarantine": { + "CAM_Default": ["collision_camera_011 (E)"], + "FillMapLauncher": ["collision_camera_002 (E)"], + "GateTrigger": ["collision_camera_011 (E)"], + "SP_Checkpoint_ChozoWarriorX": ["collision_camera_007 (E)"], + "SP_Checkpoint_Dead_ChozoWarriorX": ["collision_camera_004 (E)"], + "SP_Checkpoint_PlasmaBeam": ["collision_camera_003 (E)"], + "SP_Checkpoint_ProfessorX": ["collision_camera_001 (E)"], + "SP_PlasmaBeam": ["collision_camera_006 (E)"], + "StartPoint0": ["collision_camera_001 (E)"], + "TG_CameraChange_003_B": ["collision_camera_003 (E)"], + "TG_ChangeCamera_004_B": ["collision_camera_004 (E)"], + "TG_ChangeCamera_MBL": ["collision_camera_MBL_B (E)"], + "TG_ChangeSetup_MBL": ["collision_camera_MBL_B (E)"], + "TG_Disable_Camera_003_B": ["collision_camera_003 (E)"], + "TG_FillLauncher": ["collision_camera_002 (E)"], + "TG_QuarentineOpen": ["collision_camera_003 (E)", "collision_camera_MBL_B (E)"], + "TutoParasiteEnter": ["collision_camera_005 (E)"], + "TutoParasiteExit": ["collision_camera_005 (E)"], + "ammorecharge_000": ["collision_camera_003 (E)"], + "ammorecharge_000_platform": ["collision_camera_003 (E)"], + "chozoastro": ["collision_camera_005 (E)"], + "db_reg_qt_001": ["collision_camera_003 (E)"], + "door_shield_plasma_000": ["collision_camera_002 (E)", "collision_camera_003 (E)"], + "door_shield_plasma_001": [], + "door_shield_plasma_002": ["collision_camera_005 (E)", "collision_camera_007 (E)"], + "door_shield_plasma_004": ["collision_camera_002 (E)", "collision_camera_003 (E)"], + "door_shield_plasma_005": [], + "doorpowerclosed_000": ["collision_camera_003 (E)", "collision_camera_006 (E)"], + "doorpowerpower_000": ["collision_camera_002 (E)", "collision_camera_003 (E)"], + "doorpowerpower_001": ["collision_camera_003 (E)", "collision_camera_004 (E)"], + "doorpowerpower_002": ["collision_camera_003 (E)", "collision_camera_005 (E)"], + "doorpowerpower_003": ["collision_camera_003 (E)", "collision_camera_006 (E)"], + "doorpowerpower_004": ["collision_camera_001 (E)", "collision_camera_012 (E)"], + "doorpowerpower_005": ["collision_camera_004 (E)", "collision_camera_007 (E)"], + "doorpowerpower_006": ["collision_camera_005 (E)", "collision_camera_007 (E)"], + "doorpowerpower_007": ["collision_camera_005 (E)", "collision_camera_008 (E)"], + "doorpowerpower_008": ["collision_camera_011 (E)", "collision_camera_012 (E)"], + "doorshieldmissile_000": [], + "energyrecharge_000": ["collision_camera_009 (E)"], + "energyrecharge_000_platform": ["collision_camera_009 (E)"], + "ev_gatesealed_closed": ["collision_camera_011 (E)"], + "ev_gatesealed_opened": ["collision_camera_011 (E)"], + "ev_gatesealed_second": ["collision_camera_000 (E)", "collision_camera_002 (E)"], + "ev_quarantine_roomlights_001": ["collision_camera_000 (E)"], + "fan_reg_000": ["collision_camera_008 (E)"], + "grapplepulloff1x2_000": ["collision_camera_009 (E)"], + "item_energytank_000": ["collision_camera_003 (E)"], + "item_missiletank_000": ["collision_camera_010 (E)"], + "item_missiletank_002": ["collision_camera_008 (E)"], + "item_powerbombtank_000": ["collision_camera_009 (E)"], + "itemsphere_plasmabeam_000": ["collision_camera_006 (E)"], + "magnetsurface_000": ["collision_camera_007 (E)"], + "mblauncher_exit_gen_001": ["collision_camera_003 (E)", "collision_camera_MBL_B (E)"], + "mblauncher_launcher_gen_000": ["collision_camera_MBL_B (E)"], + "mblauncher_launcher_gen_001": ["collision_camera_002 (E)"], + "mblauncher_launcher_gen_002": ["collision_camera_003 (E)", "collision_camera_MBL_B (E)"], + "savestation": ["collision_camera_012 (E)"], + "wagontrain_forest_000": ["collision_camera_001 (E)"], + "wagontrain_forest_000_platform": ["collision_camera_001 (E)"], + "weightactivatedplatform_save": ["collision_camera_012 (E)"], + }, + "s070_basesanc": { + "AP_08": ["collision_camera_016 (F)"], + "CAM_Default": ["collision_camera_021 (F)"], + "CAM_Entrance": ["collision_camera_014 (F)"], + "LM_EmmyTrap": ["collision_camera_034 (F)"], + "LS_EmmyTrap": ["collision_camera_034 (F)"], + "LS_Phase2HeatEnabled_000": ["collision_camera_034 (F)"], + "LS_TrainViewed": ["collision_camera_014 (F)"], + "PRP_professor_death": ["collision_camera_005 (F)"], + "PoolVisited": ["collision_camera_030 (F)"], + "SP_AccessPoint_8": ["collision_camera_012 (F)"], + "SP_Checkpoint_CentralUnit": ["collision_camera_038_A (F)"], + "SP_Checkpoint_ChozoRobotSanc": ["collision_camera_005 (F)"], + "SP_Checkpoint_Dead_2ChozoRobots": ["collision_camera_017 (F)"], + "SP_Checkpoint_Dead_ChozoRobotSoldier": ["collision_camera_005 (F)"], + "SP_Checkpoint_EmmySanc": ["collision_camera_007 (F)"], + "SP_Checkpoint_EmmySancPhase2": ["collision_camera_038_A (F)"], + "SP_Checkpoint_EmmySancPhase2_CURoom": ["collision_camera_035 (F)"], + "SP_Checkpoint_MultiLockOn": ["collision_camera_027 (F)"], + "SP_Checkpoint_Professor": ["collision_camera_040 (F)"], + "SP_Checkpoint_SpaceJump": ["collision_camera_012 (F)"], + "SP_Checkpoint_SuperQuetzoa": ["collision_camera_026 (F)"], + "SP_Checkpoint_TwoChozoRobots": ["collision_camera_019 (F)"], + "SP_Checkpoint_TwoChozoRobots_BottomLeft": ["collision_camera_007 (F)"], + "SP_Checkpoint_TwoChozoRobots_TopLeft": ["collision_camera_017 (F)"], + "SP_Checkpoint_TwoChozoRobots_TopRight": ["collision_camera_017 (F)"], + "SP_Checkpoint_WaveBeam": ["collision_camera_034 (F)"], + "StartPoint0": ["collision_camera_000 (F)"], + "TG_ChangeCamera_003_B": ["collision_camera_003 (F)"], + "TG_ChangeCamera_012_B": ["collision_camera_012 (F)"], + "TG_ChangeCamera_012_C": ["collision_camera_012 (F)"], + "TG_ChangeCamera_024_A": ["collision_camera_024 (F)"], + "TG_ChangeCamera_024_B": ["collision_camera_024 (F)"], + "TG_ChangeCamera_024_C": ["collision_camera_024 (F)"], + "TG_ChangeCamera_030_B": ["collision_camera_030 (F)"], + "TG_ChangeCamera_038_B_Enter": [], + "TG_ChangeCamera_038_B_Exit": [], + "TG_MusicChange_SpaceJumpWater": ["collision_camera_012 (F)"], + "TG_MusicChange_Spacejump": ["collision_camera_012 (F)"], + "TG_Professor_CUT_Placeholder": ["collision_camera_040 (F)"], + "TG_TrainViewed": ["collision_camera_014 (F)"], + "TG_VisitPool": ["collision_camera_030 (F)"], + "accesspoint_000": ["collision_camera_016 (F)"], + "accesspoint_000_platform": ["collision_camera_016 (F)"], + "box_wide_cv_002": ["collision_camera_034 (F)"], + "box_wide_cv_003": ["collision_camera_034 (F)"], + "camerarailpath_entrance": ["collision_camera_014 (F)"], + "db_reg_b2_001": ["collision_camera_012 (F)"], + "db_reg_b2_003": ["collision_camera_009 (F)"], + "db_reg_b2_004": ["collision_camera_013 (F)"], + "db_reg_b2_005": ["collision_camera_028 (F)"], + "db_reg_b2_006": ["collision_camera_031 (F)"], + "db_reg_b2_007": ["collision_camera_034 (F)"], + "db_reg_b2_008": ["collision_camera_034 (F)"], + "db_reg_b2_009": ["collision_camera_034 (F)"], + "db_reg_b2_010": ["collision_camera_034 (F)"], + "db_reg_b2_011": ["collision_camera_034 (F)"], + "door_shield_plasma_000": ["collision_camera_018 (F)", "collision_camera_030 (F)"], + "door_shield_plasma_001": ["collision_camera_018 (F)", "collision_camera_030 (F)"], + "door_shield_plasma_002": ["collision_camera_007 (F)", "collision_camera_010 (F)"], + "door_shield_plasma_003": ["collision_camera_007 (F)", "collision_camera_010 (F)"], + "doorchargecharge_000": ["collision_camera_018 (F)", "collision_camera_030 (F)"], + "doorclosedcharge_000": ["collision_camera_015 (F)", "collision_camera_017 (F)"], + "doorclosedcharge_001": ["collision_camera_032 (F)", "collision_camera_033 (F)"], + "doorclosedcharge_002": ["collision_camera_031 (F)", "collision_camera_033 (F)"], + "doorclosedcharge_003": ["collision_camera_025 (F)", "collision_camera_041 (F)"], + "doorclosedcharge_004": ["collision_camera_003 (F)", "collision_camera_021 (F)"], + "doorclosedpower_000": ["collision_camera_012 (F)", "collision_camera_015 (F)"], + "dooremmy_000": ["collision_camera_001 (F)", "collision_camera_040 (F)"], + "dooremmy_001": ["collision_camera_004 (F)", "collision_camera_040 (F)"], + "dooremmy_002": ["collision_camera_003 (F)", "collision_camera_007 (F)"], + "dooremmy_003": ["collision_camera_019 (F)", "collision_camera_021 (F)"], + "dooremmy_004": ["collision_camera_021 (F)", "collision_camera_022 (F)"], + "dooremmy_005": ["collision_camera_021 (F)", "collision_camera_022 (F)"], + "dooremmy_006": ["collision_camera_025 (F)", "collision_camera_032 (F)"], + "dooremmy_007": ["collision_camera_029 (F)", "collision_camera_031 (F)"], + "dooremmy_008": ["collision_camera_030 (F)", "collision_camera_031 (F)"], + "doorgrapplegrapple_000": ["collision_camera_018 (F)", "collision_camera_030 (F)"], + "doorpowerpower": ["collision_camera_018 (F)", "collision_camera_030 (F)"], + "doorpowerpower_000": ["collision_camera_000 (F)", "collision_camera_002 (F)"], + "doorpowerpower_002": ["collision_camera_004 (F)", "collision_camera_005 (F)"], + "doorpowerpower_003": ["collision_camera_006 (F)", "collision_camera_010 (F)"], + "doorpowerpower_004": ["collision_camera_006 (F)", "collision_camera_008 (F)"], + "doorpowerpower_005": ["collision_camera_007 (F)", "collision_camera_010 (F)"], + "doorpowerpower_006": ["collision_camera_009 (F)", "collision_camera_010 (F)"], + "doorpowerpower_007": ["collision_camera_007 (F)", "collision_camera_017 (F)"], + "doorpowerpower_008": ["collision_camera_017 (F)", "collision_camera_019 (F)"], + "doorpowerpower_009": ["collision_camera_017 (F)", "collision_camera_018 (F)"], + "doorpowerpower_010": ["collision_camera_016 (F)", "collision_camera_017 (F)"], + "doorpowerpower_011": ["collision_camera_012 (F)", "collision_camera_016 (F)"], + "doorpowerpower_012": ["collision_camera_012 (F)", "collision_camera_015 (F)"], + "doorpowerpower_013": ["collision_camera_012 (F)", "collision_camera_015 (F)"], + "doorpowerpower_014": ["collision_camera_026 (F)", "collision_camera_027 (F)"], + "doorpowerpower_015": ["collision_camera_021 (F)", "collision_camera_033 (F)"], + "doorpowerpower_016": ["collision_camera_003 (F)", "collision_camera_021 (F)"], + "doorpowerpower_017": ["collision_camera_032 (F)", "collision_camera_033 (F)"], + "doorpowerpower_018": ["collision_camera_024 (F)", "collision_camera_025 (F)"], + "doorpowerpower_019": ["collision_camera_022 (F)", "collision_camera_024 (F)"], + "doorpowerpower_020": ["collision_camera_022 (F)", "collision_camera_023 (F)"], + "doorpowerpower_021": ["collision_camera_018 (F)", "collision_camera_028 (F)"], + "doorpowerpower_022": ["collision_camera_028 (F)", "collision_camera_029 (F)"], + "doorpowerpower_023": ["collision_camera_031 (F)", "collision_camera_034 (F)"], + "doorpowerpower_024": ["collision_camera_024 (F)", "collision_camera_041 (F)"], + "doorshieldmissile_000": ["collision_camera_012 (F)", "collision_camera_015 (F)"], + "doorshutter_000": ["collision_camera_017 (F)"], + "doorshutter_001": ["collision_camera_017 (F)"], + "doorshutter_002": ["collision_camera_017 (F)"], + "doorshutter_003": ["collision_camera_017 (F)"], + "doorshutter_004": ["collision_camera_034 (F)"], + "doorshutter_005": ["collision_camera_034 (F)"], + "doorshutter_006": ["collision_camera_040 (F)"], + "doorshutter_007": ["collision_camera_001 (F)", "collision_camera_002 (F)"], + "doorwavebeam_000": ["collision_camera_028 (F)", "collision_camera_029 (F)"], + "doorwavebeam_001": ["collision_camera_028 (F)", "collision_camera_029 (F)"], + "doorwavebeam_002": ["collision_camera_031 (F)", "collision_camera_034 (F)"], + "doorwavebeam_003": ["collision_camera_031 (F)", "collision_camera_034 (F)"], + "doorwavebeam_004": ["collision_camera_009 (F)", "collision_camera_010 (F)"], + "doorwavebeam_005": ["collision_camera_009 (F)", "collision_camera_010 (F)"], + "elevator_baselab_000": ["collision_camera_000 (F)"], + "elevator_baselab_000_platform": ["collision_camera_000 (F)"], + "elevator_baselab_001": ["collision_camera_008 (F)"], + "elevator_baselab_001_platform": ["collision_camera_008 (F)"], + "elevator_shipyard_000": ["collision_camera_028 (F)"], + "elevator_shipyard_000_platform": ["collision_camera_028 (F)"], + "emmy_sanc_deactivated": ["collision_camera_040 (F)"], + "emmyvalve_reg_gen_000": ["collision_camera_040 (F)"], + "emmyvalve_reg_gen_001": ["collision_camera_040 (F)"], + "emmyvalve_reg_gen_002": ["collision_camera_003 (F)", "collision_camera_040 (F)"], + "emmyvalve_reg_gen_003": ["collision_camera_003 (F)"], + "emmyvalve_reg_gen_004": ["collision_camera_021 (F)"], + "emmyvalve_reg_gen_005": ["collision_camera_021 (F)"], + "emmyvalve_reg_gen_006": ["collision_camera_033 (F)"], + "emmyvalve_reg_gen_007": ["collision_camera_031 (F)"], + "emmyvalve_reg_gen_008": ["collision_camera_034 (F)"], + "emmyvalve_reg_gen_009": ["collision_camera_034 (F)"], + "emmyvalve_reg_gen_010": ["collision_camera_034 (F)"], + "emmyvalve_reg_gen_011": ["collision_camera_034 (F)"], + "emmyvalve_reg_gen_012": ["collision_camera_034 (F)"], + "emmyvalve_reg_gen_013": ["collision_camera_034 (F)"], + "emmyvalve_reg_gen_014": ["collision_camera_034 (F)"], + "emmyvalve_reg_gen_015": ["collision_camera_034 (F)"], + "energyrecharge_000": ["collision_camera_018 (F)"], + "energyrecharge_000_platform": ["collision_camera_018 (F)"], + "energyrecharge_001": ["collision_camera_019 (F)"], + "env_frozen_gen_000": ["collision_camera_010 (F)"], + "env_frozen_gen_001": ["collision_camera_018 (F)"], + "ev_chozowall": ["collision_camera_040 (F)"], + "ev_entercu_cv_001": ["collision_camera_034 (F)", "collision_camera_038_A (F)"], + "ev_gatesealed_sanc_000": ["collision_camera_012 (F)", "collision_camera_014 (F)"], + "ev_ph2drain_activator": ["collision_camera_038_A (F)"], + "ev_ph2drain_platform": ["collision_camera_038_A (F)"], + "fan_reg_000": ["collision_camera_006 (F)"], + "fedship_hol": ["collision_camera_018 (F)"], + "footstepplatform_000": ["collision_camera_034 (F)"], + "footstepplatform_001": ["collision_camera_034 (F)"], + "footstepplatform_002": ["collision_camera_040 (F)"], + "footstepplatform_003": ["collision_camera_002 (F)"], + "fx_cold_door": ["collision_camera_006 (F)", "collision_camera_010 (F)"], + "fx_cold_door_000": ["collision_camera_007 (F)", "collision_camera_010 (F)"], + "fx_cold_door_001": ["collision_camera_009 (F)", "collision_camera_010 (F)"], + "fx_cold_door_002": ["collision_camera_017 (F)", "collision_camera_018 (F)"], + "fx_cold_door_003": ["collision_camera_018 (F)", "collision_camera_028 (F)"], + "grapplepulloff1x2_000": ["collision_camera_019 (F)"], + "grapplepulloff1x2_002": ["collision_camera_018 (F)"], + "grapplepulloff1x2_003": ["collision_camera_009 (F)"], + "grappleswingpoint_000": ["collision_camera_001 (F)"], + "grappleswingpoint_001": ["collision_camera_002 (F)"], + "item_energyfragment": ["collision_camera_025 (F)"], + "item_energyfragment_000": ["collision_camera_009 (F)"], + "item_energyfragment_001": ["collision_camera_020 (F)"], + "item_energyfragment_002": ["collision_camera_002 (F)"], + "item_missiletank_000": ["collision_camera_013 (F)"], + "item_missiletank_001": ["collision_camera_011 (F)"], + "item_missiletank_002": ["collision_camera_012 (F)"], + "item_missiletank_003": ["collision_camera_030 (F)"], + "item_missiletank_004": ["collision_camera_026 (F)"], + "item_missiletank_005": ["collision_camera_011 (F)"], + "item_missiletankplus_000": ["collision_camera_012 (F)"], + "item_missiletankplus_001": ["collision_camera_006 (F)"], + "item_powerbombtank_000": ["collision_camera_040 (F)"], + "item_powerbombtank_001": ["collision_camera_017 (F)"], + "itemsphere_spacejump": ["collision_camera_012 (F)"], + "magnetsurface": ["collision_camera_002 (F)"], + "magnetsurface_000": ["collision_camera_032 (F)"], + "magnetsurface_001": ["collision_camera_004 (F)"], + "magnetsurface_002": ["collision_camera_012 (F)"], + "magnetsurface_003": ["collision_camera_012 (F)"], + "magnetsurface_004": ["collision_camera_012 (F)"], + "magnetsurface_005": ["collision_camera_003 (F)"], + "magnetsurface_006": ["collision_camera_021 (F)"], + "magnetsurface_007": ["collision_camera_021 (F)"], + "magnetsurface_008": ["collision_camera_003 (F)"], + "magnetsurface_009": ["collision_camera_033 (F)"], + "magnetsurface_010": ["collision_camera_021 (F)"], + "magnetsurface_011": ["collision_camera_021 (F)"], + "magnetsurface_012": ["collision_camera_021 (F)"], + "magnetsurface_013": ["collision_camera_021 (F)"], + "magnetsurface_014": ["collision_camera_021 (F)"], + "magnetsurface_015": ["collision_camera_021 (F)"], + "magnetsurface_016": ["collision_camera_033 (F)"], + "magnetsurface_017": ["collision_camera_002 (F)"], + "magnetsurface_018": ["collision_camera_032 (F)"], + "magnetsurface_019": ["collision_camera_034 (F)"], + "magnetsurface_020": ["collision_camera_003 (F)"], + "magnetsurface_021": ["collision_camera_003 (F)"], + "magnetsurface_022": ["collision_camera_003 (F)"], + "magnetsurface_023": ["collision_camera_003 (F)"], + "magnetsurface_024": ["collision_camera_031 (F)"], + "maproom": ["collision_camera_023 (F)"], + "maproom_platform": ["collision_camera_023 (F)"], + "mblauncher_exit_gen_000": ["collision_camera_034 (F)"], + "mblauncher_launcher_gen_000": [], + "mlm_block_000": ["collision_camera_024 (F)"], + "mlm_block_001": ["collision_camera_015 (F)"], + "mlm_block_002": ["collision_camera_019 (F)"], + "mlm_block_003": ["collision_camera_030 (F)"], + "mlm_point_000": ["collision_camera_024 (F)"], + "mlm_point_001": ["collision_camera_024 (F)"], + "mlm_point_002": ["collision_camera_024 (F)"], + "mlm_point_003": ["collision_camera_024 (F)"], + "mlm_point_004": ["collision_camera_024 (F)"], + "mlm_point_005": ["collision_camera_015 (F)"], + "mlm_point_006": ["collision_camera_015 (F)"], + "mlm_point_007": ["collision_camera_015 (F)"], + "mlm_point_008": ["collision_camera_015 (F)"], + "mlm_point_009": ["collision_camera_015 (F)"], + "mlm_point_010": ["collision_camera_019 (F)"], + "mlm_point_011": ["collision_camera_019 (F)"], + "mlm_point_012": ["collision_camera_019 (F)"], + "mlm_point_013": ["collision_camera_019 (F)"], + "mlm_point_014": ["collision_camera_019 (F)"], + "mlm_point_015": ["collision_camera_030 (F)"], + "mlm_point_016": ["collision_camera_030 (F)"], + "mlm_point_017": ["collision_camera_030 (F)"], + "mlm_point_018": ["collision_camera_030 (F)"], + "mlm_point_019": ["collision_camera_030 (F)"], + "savestation_000": ["collision_camera_029 (F)"], + "savestation_000_platform": ["collision_camera_029 (F)"], + "savestation_001": ["collision_camera_041 (F)"], + "savestation_001_platform": ["collision_camera_041 (F)"], + "spacejump_marker_000": ["collision_camera_012 (F)"], + "spacejump_marker_001": ["collision_camera_012 (F)"], + "spacejump_marker_002": ["collision_camera_012 (F)"], + "tunnelframe": ["collision_camera_031 (F)", "collision_camera_034 (F)"], + "tunnelframe_000": ["collision_camera_034 (F)", "collision_camera_038_A (F)"], + "teleporter_000": ["collision_camera_007 (F)"], + "teleporter_000_platform": ["collision_camera_007 (F)"], + "totalrechargestation_000": ["collision_camera_002 (F)"], + "totalrechargestation_001": ["collision_camera_024 (F)"], + "wagontrain_forest_000": ["collision_camera_014 (F)"], + "wagontrain_forest_000_platform": ["collision_camera_014 (F)"], + "waterzone_000": ["collision_camera_012 (F)"], + "waterzone_001": ["collision_camera_001 (F)"], + "waterzone_002": ["collision_camera_033 (F)"], + "waterzone_003": ["collision_camera_034 (F)"], + "waterzone_004": ["collision_camera_001 (F)"], + "waterzone_005": ["collision_camera_030 (F)"], + "waterzone_006": ["collision_camera_038_A (F)"], + "weightactivatedplatform_energy_000": ["collision_camera_019 (F)"], + "weightactivatedplatform_total_000": ["collision_camera_002 (F)"], + "weightactivatedplatform_total_001": ["collision_camera_024 (F)"], + "zipline_bottom_gen_000": ["collision_camera_034 (F)"], + "zipline_bottom_gen_002": ["collision_camera_033 (F)"], + "zipline_bottom_gen_004": ["collision_camera_032 (F)"], + }, + "s080_shipyard": { + "AP_10": ["collision_camera_003 (H)"], + "CAM_Default": ["collision_camera_001 (H)"], + "CAM_Far_Atrium": ["collision_camera_004 (H)"], + "CAM_PreElite": ["collision_camera_006 (H)"], + "CAM_PreElite2": ["collision_camera_006 (H)"], + "CAM_Train": ["collision_camera_001 (H)"], + "CamRailTrain": ["collision_camera_001 (H)"], + "CameraRailAtriumEscape": ["collision_camera_004 (H)"], + "CameraRailAtriumEscape_Left": ["collision_camera_004 (H)"], + "CameraRailAtriumEscape_Right": ["collision_camera_004 (H)"], + "CameraRail_PreElite": ["collision_camera_006 (H)"], + "CoolShineLeftBottomVisited": ["collision_camera_004 (H)"], + "CoolShineLeftTopVisited": ["collision_camera_004 (H)"], + "CoolShineRightBottomVisited": ["collision_camera_016 (H)"], + "CoolShineRightTopVisited": ["collision_camera_004 (H)"], + "CoolShineUpViewed": ["collision_camera_004 (H)"], + "CoolShineUpVisited": ["collision_camera_004 (H)"], + "LM_Samus_Ship": ["collision_camera_008 (H)"], + "LS_EmmyZone": ["collision_camera_012 (H)"], + "PRP_CUDeactivated": ["collision_camera_012 (H)"], + "PRP_EmmyShipyard": ["collision_camera_014 (H)"], + "SP_AccessPoint_10": ["collision_camera_004 (H)"], + "SP_AccessPoint_10B": ["collision_camera_009 (H)"], + "SP_Checkpoint_CommanderX": ["collision_camera_020 (H)"], + "SP_Checkpoint_Dead_CWX_Elite": ["collision_camera_005 (H)"], + "SP_Checkpoint_Dead_ChozoWarriorX": ["collision_camera_014 (H)"], + "SP_Checkpoint_EliteChozoWarriorX": ["collision_camera_006 (H)"], + "SP_Checkpoint_Endgame": ["collision_camera_008 (H)"], + "SP_Checkpoint_Escape": ["collision_camera_020 (H)"], + "SP_Checkpoint_PowerBomb": ["collision_camera_011 (H)"], + "SP_Checkpoint_StrongReaction": ["collision_camera_009 (H)"], + "SP_Emmy": ["collision_camera_013 (H)"], + "StartPoint0": ["collision_camera_001 (H)"], + "TG_Activation_Escape_Sequence": ["collision_camera_020 (H)"], + "TG_ChangeCamera_005_B": ["collision_camera_005 (H)"], + "TG_ChangeCamera_006_B": ["collision_camera_006 (H)"], + "TG_ChangeCamera_009_B": ["collision_camera_009 (H)"], + "TG_ChangeCamera_009_C": ["collision_camera_009 (H)"], + "TG_ChangeCamera_013_B": ["collision_camera_013 (H)"], + "TG_ChangeCamera_013_C": ["collision_camera_013 (H)"], + "TG_ChangeCamera_014_B": ["collision_camera_014 (H)"], + "TG_CoolShineLeftBottom": ["collision_camera_004 (H)"], + "TG_CoolShineLeftTop": ["collision_camera_004 (H)"], + "TG_CoolShineRightBottom": ["collision_camera_016 (H)"], + "TG_CoolShineRightTop": ["collision_camera_004 (H)"], + "TG_CoolShineUp": ["collision_camera_004 (H)"], + "TG_Cool_Shinespark_Begin": ["collision_camera_004 (H)"], + "TG_Cool_Shinespark_End": ["collision_camera_004 (H)"], + "TG_EscapeSequence_Drop_01": ["collision_camera_015 (H)"], + "TG_EscapeSequence_Drop_02": ["collision_camera_015 (H)"], + "TG_EscapeSequence_Drop_03": ["collision_camera_011 (H)"], + "TG_EscapeSequence_Drop_04": ["collision_camera_004 (H)"], + "accesspoint_000": ["collision_camera_003 (H)"], + "ammorecharge_000": ["collision_camera_004 (H)"], + "ammorecharge_000_platform": ["collision_camera_004 (H)"], + "block_cut43": ["collision_camera_014 (H)"], + "block_hyperbeam_000": ["collision_camera_004 (H)"], + "block_pbtube": ["collision_camera_004 (H)"], + "block_pbtube_003": ["collision_camera_004 (H)"], + "block_pbtube_2": ["collision_camera_013 (H)"], + "breakablehint_000": ["collision_camera_009 (H)"], + "breakablehint_001": ["collision_camera_006 (H)"], + "breakabletilegroup_000": ["collision_camera_020 (H)"], + "breakabletilegroup_001": ["collision_camera_019 (H)"], + "breakabletilegroup_002": ["collision_camera_019 (H)"], + "breakabletilegroup_003": ["collision_camera_019 (H)"], + "breakabletilegroup_004": ["collision_camera_018 (H)"], + "breakabletilegroup_006": ["collision_camera_018 (H)"], + "breakabletilegroup_007": ["collision_camera_018 (H)"], + "breakabletilegroup_008": ["collision_camera_018 (H)"], + "breakabletilegroup_009": ["collision_camera_018 (H)"], + "breakabletilegroup_010": ["collision_camera_018 (H)"], + "breakabletilegroup_011": ["collision_camera_015 (H)"], + "breakabletilegroup_012": ["collision_camera_016 (H)"], + "breakabletilegroup_013": ["collision_camera_016 (H)"], + "breakabletilegroup_014": ["collision_camera_016 (H)"], + "breakabletilegroup_015": ["collision_camera_016 (H)"], + "breakabletilegroup_016": ["collision_camera_016 (H)"], + "breakabletilegroup_017": ["collision_camera_016 (H)"], + "breakabletilegroup_018": ["collision_camera_016 (H)"], + "breakabletilegroup_020": ["collision_camera_016 (H)"], + "breakabletilegroup_021": ["collision_camera_016 (H)"], + "breakabletilegroup_022": ["collision_camera_016 (H)"], + "breakabletilegroup_023": ["collision_camera_016 (H)"], + "breakabletilegroup_025": ["collision_camera_016 (H)"], + "breakabletilegroup_026": ["collision_camera_016 (H)"], + "breakabletilegroup_027": ["collision_camera_016 (H)"], + "breakabletilegroup_028": ["collision_camera_016 (H)"], + "breakabletilegroup_029": ["collision_camera_016 (H)"], + "breakabletilegroup_030": ["collision_camera_009 (H)"], + "breakabletilegroup_031": ["collision_camera_004 (H)"], + "breakabletilegroup_032": ["collision_camera_004 (H)"], + "breakabletilegroup_033": ["collision_camera_010 (H)"], + "breakabletilegroup_034": ["collision_camera_011 (H)"], + "breakabletilegroup_035": ["collision_camera_015 (H)"], + "breakabletilegroup_036": ["collision_camera_002 (H)"], + "breakabletilegroup_037": ["collision_camera_015 (H)"], + "breakabletilegroup_038": ["collision_camera_002 (H)"], + "breakabletilegroup_039": ["collision_camera_002 (H)"], + "breakabletilegroup_040": ["collision_camera_002 (H)"], + "breakabletilegroup_041": ["collision_camera_002 (H)"], + "breakabletilegroup_042": ["collision_camera_002 (H)"], + "breakabletilegroup_043": ["collision_camera_002 (H)"], + "breakabletilegroup_044": ["collision_camera_016 (H)"], + "breakabletilegroup_045": ["collision_camera_010 (H)"], + "breakabletilegroup_046": ["collision_camera_009 (H)"], + "breakabletilegroup_047": ["collision_camera_011 (H)"], + "breakabletilegroup_049": ["collision_camera_006 (H)"], + "breakablevignette_Escape_001": ["collision_camera_015 (H)"], + "breakablevignette_Escape_002": ["collision_camera_016 (H)"], + "capsulelaunchershipyard_000": ["collision_camera_007 (H)"], + "centralunitmagmacontroller_000": ["collision_camera_012 (H)"], + "centralunitshipyard": ["collision_camera_012 (H)"], + "doorclosedpower_000": ["collision_camera_003 (H)", "collision_camera_009 (H)"], + "doorclosedpower_001": ["collision_camera_009 (H)", "collision_camera_010 (H)"], + "dooremmy_000": ["collision_camera_010 (H)", "collision_camera_011 (H)"], + "dooremmy_001": ["collision_camera_010 (H)", "collision_camera_011 (H)"], + "dooremmy_002": ["collision_camera_013 (H)", "collision_camera_015 (H)"], + "dooremmy_003": ["collision_camera_013 (H)", "collision_camera_015 (H)"], + "doorpowerclosed_000": ["collision_camera_009 (H)", "collision_camera_010 (H)"], + "doorpowerclosed_001": ["collision_camera_011 (H)", "collision_camera_014 (H)"], + "doorpowerpower_000": ["collision_camera_001 (H)", "collision_camera_004 (H)"], + "doorpowerpower_001": ["collision_camera_003 (H)", "collision_camera_004 (H)"], + "doorpowerpower_002": ["collision_camera_003 (H)", "collision_camera_009 (H)"], + "doorpowerpower_004": ["collision_camera_000 (H)", "collision_camera_002 (H)"], + "doorpowerpower_005": ["collision_camera_004 (H)", "collision_camera_006 (H)"], + "doorpowerpower_006": ["collision_camera_005 (H)", "collision_camera_006 (H)"], + "doorpowerpower_007": ["collision_camera_005 (H)", "collision_camera_007 (H)"], + "doorwavebeam": ["collision_camera_005 (H)", "collision_camera_006 (H)"], + "doorwavebeam_000": ["collision_camera_009 (H)", "collision_camera_010 (H)"], + "doorwavebeam_001": ["collision_camera_011 (H)", "collision_camera_014 (H)"], + "doorwavebeam_002": ["collision_camera_004 (H)", "collision_camera_006 (H)"], + "doorwavebeam_003": ["collision_camera_003 (H)", "collision_camera_009 (H)"], + "elevator_sanctuary_000": ["collision_camera_000 (H)"], + "elevator_sanctuary_000_platform": ["collision_camera_000 (H)"], + "elevator_skybase_000_platform": ["collision_camera_007 (H)"], + "emmyvalve_reg_gen_000": ["collision_camera_013 (H)"], + "emmyvalve_reg_gen_001": ["collision_camera_014 (H)"], + "escape_explosion_big": ["collision_camera_008 (H)"], + "escape_explosion_big_000": ["collision_camera_008 (H)"], + "escape_explosion_big_001": ["collision_camera_008 (H)"], + "escape_explosion_big_002": ["collision_camera_008 (H)"], + "escape_explosion_big_003": ["collision_camera_008 (H)"], + "escape_explosion_big_004": ["collision_camera_008 (H)"], + "escape_explosion_big_005": ["collision_camera_008 (H)"], + "escape_explosion_big_006": ["collision_camera_008 (H)"], + "escape_explosion_big_008": ["collision_camera_008 (H)"], + "escape_explosion_big_009": ["collision_camera_008 (H)"], + "escape_explosion_big_010": ["collision_camera_008 (H)"], + "escape_explosion_big_011": ["collision_camera_008 (H)"], + "escape_explosion_big_012": ["collision_camera_008 (H)"], + "escape_explosion_big_013": ["collision_camera_008 (H)"], + "escape_explosion_big_014": ["collision_camera_008 (H)"], + "escape_explosion_big_015": ["collision_camera_004 (H)"], + "escape_explosion_big_016": ["collision_camera_004 (H)"], + "escape_explosion_big_017": ["collision_camera_004 (H)"], + "escape_explosion_big_018": ["collision_camera_004 (H)"], + "escape_explosion_big_019": ["collision_camera_004 (H)"], + "escape_explosion_big_020": ["collision_camera_004 (H)"], + "escape_explosion_big_021": ["collision_camera_004 (H)"], + "escape_explosion_big_022": ["collision_camera_004 (H)"], + "escape_explosion_big_023": ["collision_camera_004 (H)"], + "escape_explosion_big_024": ["collision_camera_004 (H)"], + "escape_explosion_big_025": ["collision_camera_004 (H)"], + "escape_explosion_big_026": ["collision_camera_004 (H)"], + "escape_explosion_big_027": ["collision_camera_019 (H)"], + "escape_explosion_big_028": ["collision_camera_018 (H)"], + "escape_explosion_big_029": ["collision_camera_019 (H)"], + "escape_explosion_big_030": ["collision_camera_018 (H)"], + "escape_explosion_big_031": ["collision_camera_018 (H)"], + "escape_explosion_big_032": ["collision_camera_015 (H)"], + "escape_explosion_big_033": ["collision_camera_015 (H)"], + "escape_explosion_big_034": ["collision_camera_015 (H)"], + "escape_explosion_big_035": ["collision_camera_013 (H)"], + "escape_explosion_big_036": ["collision_camera_013 (H)"], + "escape_explosion_big_037": ["collision_camera_013 (H)"], + "escape_explosion_big_038": ["collision_camera_012 (H)"], + "escape_explosion_big_039": ["collision_camera_012 (H)"], + "escape_explosion_big_040": ["collision_camera_012 (H)"], + "escape_explosion_big_041": ["collision_camera_011 (H)"], + "escape_explosion_big_042": ["collision_camera_011 (H)"], + "escape_explosion_big_043": ["collision_camera_010 (H)"], + "escape_explosion_big_044": ["collision_camera_010 (H)"], + "escape_explosion_big_045": ["collision_camera_010 (H)"], + "escape_explosion_big_046": ["collision_camera_010 (H)"], + "escape_explosion_big_047": ["collision_camera_010 (H)"], + "escape_explosion_big_048": ["collision_camera_011 (H)"], + "escape_explosion_big_049": ["collision_camera_011 (H)"], + "escape_explosion_big_050": ["collision_camera_016 (H)"], + "escape_explosion_big_051": ["collision_camera_016 (H)"], + "escape_explosion_big_052": ["collision_camera_016 (H)"], + "escape_explosion_big_053": ["collision_camera_016 (H)"], + "escape_explosion_big_054": ["collision_camera_016 (H)"], + "escape_explosion_big_055": ["collision_camera_016 (H)"], + "escape_explosion_big_056": ["collision_camera_016 (H)"], + "escape_explosion_big_057": ["collision_camera_016 (H)"], + "escape_explosion_big_058": ["collision_camera_016 (H)"], + "escape_explosion_big_059": ["collision_camera_016 (H)"], + "escape_explosion_big_060": ["collision_camera_016 (H)"], + "escape_explosion_big_061": ["collision_camera_016 (H)"], + "escape_explosion_big_062": ["collision_camera_016 (H)"], + "escape_explosion_big_063": ["collision_camera_016 (H)"], + "escape_explosion_big_064": ["collision_camera_016 (H)"], + "escape_explosion_big_065": ["collision_camera_016 (H)"], + "escape_explosion_big_066": ["collision_camera_016 (H)"], + "escape_explosion_big_067": ["collision_camera_016 (H)"], + "escape_explosion_big_068": ["collision_camera_004 (H)"], + "escape_explosion_big_069": ["collision_camera_004 (H)"], + "escape_explosion_big_070": ["collision_camera_008 (H)"], + "escape_explosion_big_071": ["collision_camera_008 (H)"], + "escape_explosion_medium": ["collision_camera_011 (H)"], + "escape_explosion_medium_000": ["collision_camera_011 (H)"], + "escape_explosion_medium_001": ["collision_camera_010 (H)"], + "escape_explosion_medium_002": ["collision_camera_010 (H)"], + "escape_explosion_medium_003": ["collision_camera_010 (H)"], + "escape_explosion_medium_004": ["collision_camera_010 (H)"], + "escape_explosion_medium_005": ["collision_camera_011 (H)"], + "escape_explosion_medium_006": ["collision_camera_016 (H)"], + "escape_explosion_medium_007": ["collision_camera_016 (H)"], + "escape_explosion_medium_008": ["collision_camera_016 (H)"], + "escape_explosion_medium_009": ["collision_camera_016 (H)"], + "escape_explosion_medium_010": ["collision_camera_016 (H)"], + "escape_explosion_medium_011": ["collision_camera_016 (H)"], + "escape_explosion_medium_012": ["collision_camera_016 (H)"], + "escape_explosion_medium_013": ["collision_camera_016 (H)"], + "escape_explosion_medium_014": ["collision_camera_016 (H)"], + "escape_explosion_medium_015": ["collision_camera_016 (H)"], + "escape_explosion_medium_016": ["collision_camera_016 (H)"], + "escape_explosion_medium_017": ["collision_camera_016 (H)"], + "escape_explosion_medium_018": ["collision_camera_016 (H)"], + "escape_explosion_medium_019": ["collision_camera_016 (H)"], + "escape_explosion_medium_020": ["collision_camera_004 (H)"], + "escape_explosion_medium_021": ["collision_camera_004 (H)"], + "escape_explosion_medium_022": ["collision_camera_004 (H)"], + "escape_explosion_medium_023": ["collision_camera_004 (H)"], + "escape_explosion_medium_024": ["collision_camera_004 (H)"], + "escape_explosion_medium_025": ["collision_camera_011 (H)"], + "escape_explosion_medium_026": ["collision_camera_010 (H)"], + "escape_explosion_medium_027": ["collision_camera_016 (H)"], + "escape_explosion_medium_028": ["collision_camera_016 (H)"], + "escape_explosion_medium_029": ["collision_camera_016 (H)"], + "escape_explosion_medium_030": ["collision_camera_016 (H)"], + "escape_explosion_medium_031": ["collision_camera_016 (H)"], + "escape_explosion_medium_032": ["collision_camera_016 (H)"], + "escape_explosion_medium_033": ["collision_camera_004 (H)"], + "escape_explosion_medium_034": ["collision_camera_019 (H)"], + "escape_explosion_medium_035": ["collision_camera_018 (H)"], + "escape_explosion_medium_036": ["collision_camera_019 (H)"], + "escape_explosion_medium_037": ["collision_camera_018 (H)"], + "escape_explosion_medium_038": ["collision_camera_018 (H)"], + "escape_explosion_medium_039": ["collision_camera_018 (H)"], + "escape_explosion_medium_040": ["collision_camera_015 (H)"], + "escape_explosion_medium_041": ["collision_camera_015 (H)"], + "escape_explosion_medium_042": ["collision_camera_015 (H)"], + "escape_explosion_medium_043": ["collision_camera_013 (H)"], + "escape_explosion_medium_044": ["collision_camera_013 (H)"], + "escape_explosion_medium_045": ["collision_camera_013 (H)"], + "escape_explosion_medium_046": ["collision_camera_012 (H)"], + "escape_explosion_medium_047": ["collision_camera_012 (H)"], + "escape_explosion_medium_048": ["collision_camera_012 (H)"], + "escape_explosion_medium_049": ["collision_camera_016 (H)"], + "escape_explosion_medium_050": ["collision_camera_004 (H)"], + "escape_explosion_medium_051": ["collision_camera_004 (H)"], + "escape_explosion_medium_052": ["collision_camera_004 (H)"], + "escape_explosion_medium_053": ["collision_camera_004 (H)"], + "escape_explosion_medium_054": ["collision_camera_004 (H)"], + "escape_explosion_medium_055": ["collision_camera_004 (H)"], + "escape_explosion_medium_056": ["collision_camera_004 (H)"], + "escape_explosion_medium_057": ["collision_camera_004 (H)"], + "escape_explosion_medium_058": ["collision_camera_004 (H)"], + "escape_explosion_medium_059": ["collision_camera_004 (H)"], + "escape_explosion_medium_060": ["collision_camera_008 (H)"], + "escape_explosion_medium_061": ["collision_camera_008 (H)"], + "escape_explosion_medium_062": ["collision_camera_008 (H)"], + "escape_explosion_medium_063": ["collision_camera_008 (H)"], + "escape_explosion_medium_064": ["collision_camera_008 (H)"], + "escape_explosion_medium_065": ["collision_camera_008 (H)"], + "escape_explosion_medium_066": ["collision_camera_008 (H)"], + "escape_explosion_medium_067": ["collision_camera_008 (H)"], + "escape_explosion_medium_068": ["collision_camera_008 (H)"], + "escape_explosion_medium_069": ["collision_camera_008 (H)"], + "escape_explosion_medium_070": ["collision_camera_008 (H)"], + "escape_explosion_medium_071": ["collision_camera_008 (H)"], + "escape_explosion_medium_072": ["collision_camera_008 (H)"], + "escape_explosion_path_01": ["collision_camera_015 (H)"], + "escape_explosion_path_02": ["collision_camera_015 (H)"], + "escape_explosion_path_03": ["collision_camera_011 (H)"], + "escape_explosion_small": ["collision_camera_011 (H)"], + "escape_explosion_small_000": ["collision_camera_019 (H)"], + "escape_explosion_small_001": ["collision_camera_018 (H)"], + "escape_explosion_small_002": ["collision_camera_018 (H)"], + "escape_explosion_small_003": ["collision_camera_015 (H)"], + "escape_explosion_small_004": ["collision_camera_015 (H)"], + "escape_explosion_small_005": ["collision_camera_013 (H)"], + "escape_explosion_small_006": ["collision_camera_013 (H)"], + "escape_explosion_small_007": ["collision_camera_012 (H)"], + "escape_explosion_small_008": ["collision_camera_012 (H)"], + "escape_explosion_small_009": ["collision_camera_018 (H)"], + "escape_explosion_small_010": ["collision_camera_019 (H)"], + "escape_explosion_small_011": ["collision_camera_019 (H)"], + "escape_explosion_small_012": ["collision_camera_018 (H)"], + "escape_explosion_small_013": ["collision_camera_015 (H)"], + "escape_explosion_small_014": ["collision_camera_013 (H)"], + "escape_explosion_small_015": ["collision_camera_012 (H)"], + "escape_explosion_small_016": ["collision_camera_011 (H)"], + "escape_explosion_small_017": ["collision_camera_010 (H)"], + "escape_explosion_small_018": ["collision_camera_010 (H)"], + "escape_explosion_small_019": ["collision_camera_010 (H)"], + "escape_explosion_small_020": ["collision_camera_010 (H)"], + "escape_explosion_small_021": ["collision_camera_010 (H)"], + "escape_explosion_small_022": ["collision_camera_011 (H)"], + "escape_explosion_small_023": ["collision_camera_011 (H)"], + "escape_explosion_small_024": ["collision_camera_016 (H)"], + "escape_explosion_small_025": ["collision_camera_016 (H)"], + "escape_explosion_small_026": ["collision_camera_016 (H)"], + "escape_explosion_small_027": ["collision_camera_016 (H)"], + "escape_explosion_small_028": ["collision_camera_016 (H)"], + "escape_explosion_small_029": ["collision_camera_016 (H)"], + "escape_explosion_small_030": ["collision_camera_016 (H)"], + "escape_explosion_small_031": ["collision_camera_016 (H)"], + "escape_explosion_small_032": ["collision_camera_016 (H)"], + "escape_explosion_small_033": ["collision_camera_016 (H)"], + "escape_explosion_small_034": ["collision_camera_016 (H)"], + "escape_explosion_small_035": ["collision_camera_016 (H)"], + "escape_explosion_small_036": ["collision_camera_016 (H)"], + "escape_explosion_small_037": ["collision_camera_016 (H)"], + "escape_explosion_small_038": ["collision_camera_016 (H)"], + "escape_explosion_small_039": ["collision_camera_016 (H)"], + "escape_explosion_small_040": ["collision_camera_016 (H)"], + "escape_explosion_small_041": ["collision_camera_016 (H)"], + "escape_explosion_small_042": ["collision_camera_016 (H)"], + "escape_explosion_small_043": ["collision_camera_016 (H)"], + "escape_explosion_small_044": ["collision_camera_004 (H)"], + "escape_explosion_small_045": ["collision_camera_004 (H)"], + "escape_explosion_small_046": ["collision_camera_004 (H)"], + "escape_explosion_small_047": ["collision_camera_004 (H)"], + "escape_explosion_small_048": ["collision_camera_004 (H)"], + "escape_explosion_small_049": ["collision_camera_004 (H)"], + "escape_explosion_small_050": ["collision_camera_004 (H)"], + "escape_explosion_small_051": ["collision_camera_004 (H)"], + "escape_explosion_small_052": ["collision_camera_004 (H)"], + "escape_explosion_small_053": ["collision_camera_004 (H)"], + "escape_explosion_small_054": ["collision_camera_004 (H)"], + "escape_explosion_small_055": ["collision_camera_004 (H)"], + "escape_explosion_small_056": ["collision_camera_008 (H)"], + "escape_explosion_small_057": ["collision_camera_008 (H)"], + "escape_explosion_small_058": ["collision_camera_008 (H)"], + "escape_explosion_small_059": ["collision_camera_008 (H)"], + "escape_explosion_small_060": ["collision_camera_008 (H)"], + "escape_explosion_small_061": ["collision_camera_008 (H)"], + "escape_explosion_small_062": ["collision_camera_008 (H)"], + "escape_explosion_small_063": ["collision_camera_008 (H)"], + "escape_explosion_small_064": ["collision_camera_008 (H)"], + "escape_explosion_small_065": ["collision_camera_008 (H)"], + "escape_explosion_small_066": ["collision_camera_008 (H)"], + "escape_explosion_small_067": ["collision_camera_008 (H)"], + "escape_explosion_small_068": ["collision_camera_008 (H)"], + "escape_glass_01": ["collision_camera_004 (H)"], + "escape_glass_02": ["collision_camera_004 (H)"], + "escape_glass_03": ["collision_camera_004 (H)"], + "ev_escape_1": ["collision_camera_015 (H)"], + "ev_escape_2_end": ["collision_camera_011 (H)"], + "ev_escape_2_init": ["collision_camera_011 (H)"], + "ev_escape_3": ["collision_camera_004 (H)"], + "ev_escape_4": ["collision_camera_015 (H)"], + "ev_evacuation": ["collision_camera_020 (H)"], + "ev_shi_ray02_005": [], + "ev_shi_rayimpact01": ["collision_camera_009 (H)"], + "grapplepulloff1x2": ["collision_camera_002 (H)", "collision_camera_009 (H)"], + "grapplepulloff1x2_000": ["collision_camera_002 (H)"], + "grapplepulloff1x2_001": ["collision_camera_006 (H)"], + "item_missiletank": ["collision_camera_002 (H)"], + "item_missiletank_000": ["collision_camera_006 (H)"], + "item_powerbombtank_000": ["collision_camera_009 (H)"], + "mapev_atriumdebris": ["collision_camera_004 (H)"], + "sg_vignette000": ["collision_camera_004 (H)"], + "sg_vignette001": ["collision_camera_016 (H)"], + "totalrechargestation_000": ["collision_camera_015 (H)"], + "totalrechargestation_001": ["collision_camera_006 (H)"], + "trigger_PowerBombObtained": ["collision_camera_014 (H)"], + "wagontrain_forest_000": ["collision_camera_001 (H)"], + "wagontrain_forest_000_platform": ["collision_camera_001 (H)"], + "weightactivatedplatform_access_000": ["collision_camera_003 (H)"], + "weightactivatedplatform_total_000": ["collision_camera_015 (H)"], + "weightactivatedplatform_total_001": ["collision_camera_006 (H)"], + }, + "s090_skybase": { + "CAM_Default": ["collision_camera_001 (I)"], + "CAM_Far": ["collision_camera_001 (I)"], + "CAM_Near": ["collision_camera_002 (I)"], + "CAM_Near_Left": ["collision_camera_002 (I)"], + "CAM_Near_Right": ["collision_camera_002 (I)"], + "SP_Checkpoint_Commander": ["collision_camera_002 (I)"], + "StartPoint0": ["collision_camera_001 (I)"], + "TG_ChangeCamera_002_Far": ["collision_camera_002 (I)"], + "TG_ChangeCamera_002_Near": ["collision_camera_002 (I)"], + "TG_ChangeInterp_002": ["collision_camera_002 (I)"], + "TG_Snapshot_Checkpoint_Commander": ["collision_camera_002 (I)"], + "accesspoint_vignette": ["collision_camera_005 (I)"], + "accesspointcommander_000": ["collision_camera_005 (I)"], + "block_pbcolumn_000": ["collision_camera_002 (I)"], + "camerarailpath_000": ["collision_camera_001 (I)"], + "camerarailpath_Raven": ["collision_camera_002 (I)"], + "capsule_commander_000": [], + "capsuleelevatorskybase_000": ["collision_camera_001 (I)"], + "commander_elevator": ["collision_camera_002 (I)"], + "doorpowerpower_000": ["collision_camera_000 (I)", "collision_camera_001 (I)"], + "doorpowerpower_001": ["collision_camera_000 (I)", "collision_camera_002 (I)"], + "elevator_shipyard_000_platform": ["collision_camera_001 (I)"], + "energyfield": ["collision_camera_004 (I)"], + "energyfield_grabs": ["collision_camera_004 (I)"], + "savestation_000": ["collision_camera_000 (I)"], + "savestation_000_platform": ["collision_camera_000 (I)"], + "skybase_000": [], + "totalrechargestation_000": ["collision_camera_001 (I)"], + "weightactivatedplatform_commanderelevator_000": ["collision_camera_002 (I)"], + "weightactivatedplatform_total_000": ["collision_camera_001 (I)"], + }, +} _usable_component_to_node_name = { "CAccessPointComponent": "Navigation Room", @@ -3103,9 +3081,7 @@ "CAmmoRechargeComponent": "Ammo Recharge", "CMapAcquisitionComponent": "Map Station", "CTotalRechargeComponent": "Total Recharge", - "CElevatorCommanderUsableComponent": "Raven Beak Elevator", - "CWaterPlatformUsableComponent": "Event - Water Device", "CThermalDeviceComponent": "Event - Thermal Device", "CElectricGeneratorComponent": "Event - Electric Generator", @@ -3155,11 +3131,11 @@ def __init__(self, layer_name: str, actor: construct.Container, all_rooms: dict[ self.is_breakable_blob = "BREAKABLESCENARIO" in actor.pComponents or "grapplepulloff" in self.actor_def def create_node_template( - self, node_type: str, - default_name: str, - existing_data: typing.Optional[dict[str, NodeDefinition]], + self, + node_type: str, + default_name: str, + existing_data: typing.Optional[dict[str, NodeDefinition]], ) -> NodeDefinition: - result: dict = { "node_type": node_type, "heal": False, @@ -3243,9 +3219,7 @@ def get_def_link_for_entity(actor_ref: str) -> typing.Optional[str]: def create_door_nodes_for_actor( - details: ActorDetails, - node_data_for_area: dict[str, dict[str, NodeDefinition]], - world: dict + details: ActorDetails, node_data_for_area: dict[str, dict[str, NodeDefinition]], world: dict ) -> list[NodeDefinition]: actor = details.actor @@ -3258,9 +3232,7 @@ def create_door_nodes_for_actor( "right_shield_def": get_def_link_for_entity(actor.pComponents.LIFE.wpRightDoorShieldEntity), } - simple = {"def": details.actor_def, - "left": extra.get("left_shield_def"), - "right": extra.get("right_shield_def")} + simple = {"def": details.actor_def, "left": extra.get("left_shield_def"), "right": extra.get("right_shield_def")} left_room, right_room = _find_room_orientation(world, *details.rooms) @@ -3294,8 +3266,11 @@ def get_actor_name_for_node(node: dict) -> str: def decode_world( # noqa: C901 - root: Path, target_level: str, out_path: Path, only_update_existing_areas: bool = True, - skip_existing_actors: bool = True + root: Path, + target_level: str, + out_path: Path, + only_update_existing_areas: bool = True, + skip_existing_actors: bool = True, ): global pickup_index, bmscc, brsa, brfld, brfld_path all_names = dread_data.all_asset_id_to_name() @@ -3345,13 +3320,10 @@ def decode_world( # noqa: C901 "extra": { "asset_id": brfld_path, }, - "areas": {} + "areas": {}, } - area_names = { - entry.name: f"{entry.name} ({world_names[brfld_path][0]})" - for entry in bmscc.raw.layers[0].entries - } + area_names = {entry.name: f"{entry.name} ({world_names[brfld_path][0]})" for entry in bmscc.raw.layers[0].entries} node_data_for_area: dict[str, dict[str, NodeDefinition]] = {} for area_name, area_data in world["areas"].items(): if "asset_id" in area_data["extra"]: @@ -3416,8 +3388,10 @@ def add_node(target_area: str, node_def: NodeDefinition): if existing_name == node_def.name: continue if get_actor_name_for_node(existing_node) == new_actor: - raise ValueError(f"New node {node_def.name} with actor {new_actor} conflicts " - f"with existing node {existing_name} in {target_area}") + raise ValueError( + f"New node {node_def.name} with actor {new_actor} conflicts " + f"with existing node {existing_name} in {target_area}" + ) world["areas"][target_area]["nodes"][node_def.name] = node_def.data actor_to_area[get_actor_name_for_node(node_def.data)] = target_area @@ -3431,8 +3405,9 @@ def get_node_def_for_actor(actor_name: str) -> typing.Optional[NodeDefinition]: for layer_name, actor_name, actor in brfld.all_actors(): details = all_default_details[(layer_name, actor.sName)] - if not any([details.is_door, details.is_pickup, details.is_elevator, details.is_usable, - details.is_breakable_blob]): + if not any( + [details.is_door, details.is_pickup, details.is_elevator, details.is_usable, details.is_breakable_blob] + ): continue # if others := [name for name, details in all_default_details.items() if p.distance(details.position) < 3]: @@ -3456,12 +3431,15 @@ def get_node_def_for_actor(actor_name: str) -> typing.Optional[NodeDefinition]: print(f"{actor.sName} is a pickup and start point") for room_name in details.rooms: - definition = details.create_node_template("pickup", f"Pickup ({actor.sName})", - node_data_for_area.get(room_name)) - definition.data.update({ - "pickup_index": pickup_index, - "major_location": "tank" not in details.actor_def, - }) + definition = details.create_node_template( + "pickup", f"Pickup ({actor.sName})", node_data_for_area.get(room_name) + ) + definition.data.update( + { + "pickup_index": pickup_index, + "major_location": "tank" not in details.actor_def, + } + ) add_node(room_name, definition) if len(details.rooms) != 1: @@ -3477,22 +3455,27 @@ def get_node_def_for_actor(actor_name: str) -> typing.Optional[NodeDefinition]: this_area = world["areas"][details.rooms[0]] usable = actor.pComponents.USABLE - definition = details.create_node_template("teleporter", f"Elevator ({actor.sName})", - node_data_for_area.get(room_name)) - definition.data["extra"].update({ - "elevator_component": usable["@type"], - "target_spawn_point": usable.sTargetSpawnPoint, - }) + definition = details.create_node_template( + "teleporter", f"Elevator ({actor.sName})", node_data_for_area.get(room_name) + ) + definition.data["extra"].update( + { + "elevator_component": usable["@type"], + "target_spawn_point": usable.sTargetSpawnPoint, + } + ) target_world_name = id_to_name[usable.sScenarioName] - definition.data.update({ - "destination": { - "world_name": target_world_name, - "area_name": area_name_by_world_and_actor[target_world_name].get( - usable.sTargetSpawnPoint, - _rooms_for_actors[usable.sScenarioName][usable.sTargetSpawnPoint][0], - ), + definition.data.update( + { + "destination": { + "world_name": target_world_name, + "area_name": area_name_by_world_and_actor[target_world_name].get( + usable.sTargetSpawnPoint, + _rooms_for_actors[usable.sScenarioName][usable.sTargetSpawnPoint][0], + ), + } } - }) + ) add_node(room_name, definition) if details.is_start_point: this_area["valid_starting_location"] = True @@ -3586,7 +3569,6 @@ def get_node_def_for_actor(actor_name: str) -> typing.Optional[NodeDefinition]: if this_area["default_node"] is None: this_area["default_node"] = definition.name elif details.actor_def == "startpoint": - default_node_data = this_area["nodes"][this_area["default_node"]] if "startpoint" not in default_node_data["extra"].get("start_point_actor_def", ""): this_area["default_node"] = definition.name @@ -3715,6 +3697,6 @@ def decode_all_worlds(root: Path, out_path: Path): json.dump(header, f, indent=4) -if __name__ == '__main__': +if __name__ == "__main__": decode_all_worlds(Path("F:/DreadExtract"), Path(sys.argv[1])) # decode_world(Path("F:/DreadExtract"), "s080_shipyard", Path(sys.argv[1])) diff --git a/tools/sr_export_rdv_database.py b/tools/sr_export_rdv_database.py index f2748c06..f72618ee 100644 --- a/tools/sr_export_rdv_database.py +++ b/tools/sr_export_rdv_database.py @@ -19,28 +19,25 @@ from mercury_engine_data_structures.game_check import Game world_names = { - 'maps/levels/c10_samus/s000_surface/s000_surface.bmsld': "Surface - East", - 'maps/levels/c10_samus/s010_area1/s010_area1.bmsld': "Area 1", - 'maps/levels/c10_samus/s020_area2/s020_area2.bmsld': "Area 2 - Exterior", - 'maps/levels/c10_samus/s025_area2b/s025_area2b.bmsld': "Area 2 - Interior", - 'maps/levels/c10_samus/s028_area2c/s028_area2c.bmsld': "Area 2 - Entrance", - 'maps/levels/c10_samus/s030_area3/s030_area3.bmsld': "Area 3 - Exterior", - 'maps/levels/c10_samus/s033_area3b/s033_area3b.bmsld': "Area 3 - Interior (Lower)", - 'maps/levels/c10_samus/s036_area3c/s036_area3c.bmsld': "Area 3 - Interior (Upper)", - 'maps/levels/c10_samus/s040_area4/s040_area4.bmsld': "Area 4 - West", - 'maps/levels/c10_samus/s050_area5/s050_area5.bmsld': "Area 4 - East", - 'maps/levels/c10_samus/s060_area6/s060_area6.bmsld': "Area 5 - Entrance", - 'maps/levels/c10_samus/s065_area6b/s065_area6b.bmsld': "Area 5 - Exterior", - 'maps/levels/c10_samus/s067_area6c/s067_area6c.bmsld': "Area 5 - Interior", - 'maps/levels/c10_samus/s070_area7/s070_area7.bmsld': "Area 6", - 'maps/levels/c10_samus/s090_area9/s090_area9.bmsld': "Area 7", - 'maps/levels/c10_samus/s100_area10/s100_area10.bmsld': "Area 8", - 'maps/levels/c10_samus/s110_surfaceb/s110_surfaceb.bmsld': "Surface - West", -} -id_to_name = { - os.path.splitext(path.split("/")[-1])[0]: name - for path, name in world_names.items() + "maps/levels/c10_samus/s000_surface/s000_surface.bmsld": "Surface - East", + "maps/levels/c10_samus/s010_area1/s010_area1.bmsld": "Area 1", + "maps/levels/c10_samus/s020_area2/s020_area2.bmsld": "Area 2 - Exterior", + "maps/levels/c10_samus/s025_area2b/s025_area2b.bmsld": "Area 2 - Interior", + "maps/levels/c10_samus/s028_area2c/s028_area2c.bmsld": "Area 2 - Entrance", + "maps/levels/c10_samus/s030_area3/s030_area3.bmsld": "Area 3 - Exterior", + "maps/levels/c10_samus/s033_area3b/s033_area3b.bmsld": "Area 3 - Interior (Lower)", + "maps/levels/c10_samus/s036_area3c/s036_area3c.bmsld": "Area 3 - Interior (Upper)", + "maps/levels/c10_samus/s040_area4/s040_area4.bmsld": "Area 4 - West", + "maps/levels/c10_samus/s050_area5/s050_area5.bmsld": "Area 4 - East", + "maps/levels/c10_samus/s060_area6/s060_area6.bmsld": "Area 5 - Entrance", + "maps/levels/c10_samus/s065_area6b/s065_area6b.bmsld": "Area 5 - Exterior", + "maps/levels/c10_samus/s067_area6c/s067_area6c.bmsld": "Area 5 - Interior", + "maps/levels/c10_samus/s070_area7/s070_area7.bmsld": "Area 6", + "maps/levels/c10_samus/s090_area9/s090_area9.bmsld": "Area 7", + "maps/levels/c10_samus/s100_area10/s100_area10.bmsld": "Area 8", + "maps/levels/c10_samus/s110_surfaceb/s110_surfaceb.bmsld": "Surface - West", } +id_to_name = {os.path.splitext(path.split("/")[-1])[0]: name for path, name in world_names.items()} pickup_index = 0 bmscc: typing.Optional[Bmscc] = None # brsa: typing.Optional[Brsa] = None @@ -79,27 +76,22 @@ [6300.0, -900.0], [8200.0, 0.0], [8800.0, 0.0], - [8800.0, 8500.0] - ], - ("s020_area2", "collision_camera_006"): [ - [-3100.0, 5600.0], - [-3100.0, 4500.0], - [-850.0, 4500.0], - [-850.0, 5600.0] + [8800.0, 8500.0], ], + ("s020_area2", "collision_camera_006"): [[-3100.0, 5600.0], [-3100.0, 4500.0], [-850.0, 4500.0], [-850.0, 5600.0]], ("s028_area2c", "collision_camera_003"): [ [13800.0, -200.0], [13800.0, -1500.0], [14300.0, -1500], [14300.0, -5400.0], [19100.0, -5400.0], - [19100.0, -200.0] + [19100.0, -200.0], ], ("s028_area2c", "collision_camera_006"): [ [10400.0, -1600.0], [10400.0, -3100.0], [14200.0, -3100.0], - [14200.0,-1600.0] + [14200.0, -1600.0], ], ("s030_area3", "collision_camera_038"): [ [12200.0, 17300.0], @@ -110,7 +102,7 @@ [16800.0, 14100.0], [17000.0, 14550.0], [20200.0, 14550.0], - [20200.0, 17300.0] + [20200.0, 17300.0], ], ("s033_area3b", "collision_camera_026"): [ [-1600.0, -5200.0], @@ -127,7 +119,7 @@ [1200.0, -14300.0], [1200.0, -12400.0], [600.0, -11900.0], - [600.0, -5200.0] + [600.0, -5200.0], ], ("s033_area3b", "collision_camera_027"): [ [1100.0, 500.0], @@ -135,7 +127,7 @@ [3400.0, -14300.0], [3400.0, -7500.0], [3900.0, -7500.0], - [3900.0, 500.0] + [3900.0, 500.0], ], ("s033_area3b", "collision_camera_028"): [ [3300.0, -7500.0], @@ -143,7 +135,7 @@ [2900.0, -8300.0], [2900.0, -9100.0], [4900.0, -9100.0], - [4900.0, -7500.0] + [4900.0, -7500.0], ], ("s040_area4", "collision_camera_001"): [ [6800.0, -2500.0], @@ -160,7 +152,7 @@ [4500.0, -3200.0], [4500.0, -4000.0], [6600.0, -4000.0], - [6600.0, -2675.0] + [6600.0, -2675.0], ], ("s040_area4", "collision_camera_018"): [ [-7100.0, 5300.0], @@ -168,13 +160,13 @@ [-5000.0, 3900.0], [-3800.0, 3700.0], [-750.0, 3700.0], - [-750.0, 5300.0] + [-750.0, 5300.0], ], ("s050_area5", "collision_camera_008"): [ [-11400.0, 5200.0], [-11400.0, 3800.0], [-8750.0, 3800.0], - [-8750.0, 5200.0] + [-8750.0, 5200.0], ], ("s050_area5", "collision_camera_AfterChase_001"): [ [6100.0, -2700.0], @@ -184,21 +176,21 @@ [-3500.0, -3700.0], [-3500.0, -6100.0], [7600.0, -6100.0], - [7600.0, -2700.0] + [7600.0, -2700.0], ], ("s050_area5", "collision_camera_AfterChase_002"): [ [-3500.0, -6000.0], [-3500.0, -8100.0], [3500.0, -8100.0], [10300.0, -8100.0], - [10300.0, -6000.0] + [10300.0, -6000.0], ], ("s050_area5", "collision_camera_AfterChase_003"): [ [-3900.0, -8000.0], [-3900.0, -9100.0], [9900.0, -9100.0], [9900.0, -7500.0], - [6250.0, -8000.0] + [6250.0, -8000.0], ], ("s060_area6", "collision_camera_015"): [ [3150.0, -8600.0], @@ -208,18 +200,8 @@ [-1600.0, -6800.0], [-1600.0, -8600.0], ], - ("s067_area6c", "collision_camera_017"): [ - [3200.0, 5800.0], - [3200.0, 1400.0], - [14050.0, 1400.0], - [14050.0, 5800.0] - ], - ("s070_area7", "collision_camera_048"): [ - [3950.0, 8800.0], - [3950.0, 7400.0], - [6650.0, 7400.0], - [6650.0, 8800.0] - ], + ("s067_area6c", "collision_camera_017"): [[3200.0, 5800.0], [3200.0, 1400.0], [14050.0, 1400.0], [14050.0, 5800.0]], + ("s070_area7", "collision_camera_048"): [[3950.0, 8800.0], [3950.0, 7400.0], [6650.0, 7400.0], [6650.0, 8800.0]], ("s090_area9", "collision_camera_018"): [ [-18200.0, 8100.0], [-18200.0, 1300.0], @@ -228,13 +210,13 @@ [-16400.0, 2600.0], [-16400.0, 3200.0], [-16200.0, 3200.0], - [-16200.0, 8100.0] + [-16200.0, 8100.0], ], ("s100_area10", "collision_camera_007"): [ [-2800.0, 8900.0], [-200.0, 8900.0], [-200.0, 11200.0], - [-2800.0, 11200.0] + [-2800.0, 11200.0], ], ("s100_area10", "collision_camera_008_A"): [ [-12400.0, 27400.0], @@ -245,13 +227,13 @@ [-1000.0, 20900.0], [100.0, 21600.0], [7150.0, 21600.0], - [7150.0, 27400.0] + [7150.0, 27400.0], ], ("s100_area10", "collision_camera_022"): [ [-7200.0, 11100.0], [1600.0, 11100.0], - [ 1600.0, 12400.0], - [-7200.0, 12400.0] + [1600.0, 12400.0], + [-7200.0, 12400.0], ], } _rooms_for_actors = { @@ -365,12 +347,12 @@ "charge": "Charge Beam Door", } _weakness_table_for_def = { - 'doorchargecharge': (dock_weakness["charge"], dock_weakness["charge"]), - 'doorclosedcharge': (dock_weakness["closed"], dock_weakness["charge"]), - 'doorpowerpower': (dock_weakness["power"], dock_weakness["power"]), - 'doorclosedpower': (dock_weakness["closed"], dock_weakness["power"]), - 'doorpowerclosed': (dock_weakness["power"], dock_weakness["closed"]), - 'doorchargeclosed': (dock_weakness["charge"], dock_weakness["closed"]), + "doorchargecharge": (dock_weakness["charge"], dock_weakness["charge"]), + "doorclosedcharge": (dock_weakness["closed"], dock_weakness["charge"]), + "doorpowerpower": (dock_weakness["power"], dock_weakness["power"]), + "doorclosedpower": (dock_weakness["closed"], dock_weakness["power"]), + "doorpowerclosed": (dock_weakness["power"], dock_weakness["closed"]), + "doorchargeclosed": (dock_weakness["charge"], dock_weakness["closed"]), } @@ -382,8 +364,14 @@ class NodeDefinition(typing.NamedTuple): class ActorDetails: actor_type: str - def __init__(self, name: str, actor: construct.Container, level_name: str, all_rooms: dict[str, Polygon], - layer_name: str = "default"): + def __init__( + self, + name: str, + actor: construct.Container, + level_name: str, + all_rooms: dict[str, Polygon], + layer_name: str = "default", + ): self.name = name self.actor = actor self.actor_type = actor.type @@ -395,19 +383,23 @@ def __init__(self, name: str, actor: construct.Container, level_name: str, all_r self.rooms: list[str] = [name for name, pol in all_rooms.items() if pol.contains(self.position)] self.is_door = self.actor_type.startswith("door") and self.actor_type not in { - "doorshieldmissile", "doorshieldsupermissile", "doorshieldpowerbomb", - "doorwave", "doorspazerbeam", "doorcreature" + "doorshieldmissile", + "doorshieldsupermissile", + "doorshieldpowerbomb", + "doorwave", + "doorspazerbeam", + "doorcreature", } # self.is_start_point = "STARTPOINT" in actor.pComponents and "dooremmy" not in self.actor_type self.is_pickup = any(self.actor_type.startswith(prefix) for prefix in ["powerup_", "item_", "itemsphere_"]) self.is_usable = self.actor_type == "weightactivatedplatform" def create_node_template( - self, node_type: str, - default_name: str, - existing_data: typing.Optional[dict[str, NodeDefinition]], + self, + node_type: str, + default_name: str, + existing_data: typing.Optional[dict[str, NodeDefinition]], ) -> NodeDefinition: - result: dict = { "node_type": node_type, "heal": False, @@ -488,7 +480,7 @@ def _find_room_orientation(world: dict, room_a: str, room_b: str): def current_world_file_name(): - return re.sub(r'[^a-zA-Z0-9\- ]', r'', world_names[bmsld_path]) + ".json" + return re.sub(r"[^a-zA-Z0-9\- ]", r"", world_names[bmsld_path]) + ".json" def get_actor_name_for_node(node: dict) -> str: @@ -507,9 +499,7 @@ def _get_existing_node_data(world: dict, area_names: dict[str, str]) -> dict[str def create_door_nodes_for_actor( - details: ActorDetails, - node_data_for_area: dict[str, dict[str, NodeDefinition]], - world: dict + details: ActorDetails, node_data_for_area: dict[str, dict[str, NodeDefinition]], world: dict ) -> list[NodeDefinition]: extra = {} # if "LIFE" in actor.pComponents: @@ -520,9 +510,7 @@ def create_door_nodes_for_actor( # "right_shield_def": get_def_link_for_entity(actor.pComponents.LIFE.wpRightDoorShieldEntity), # } - simple = {"def": details.actor_type, - "left": extra.get("left_shield_def"), - "right": extra.get("right_shield_def")} + simple = {"def": details.actor_type, "left": extra.get("left_shield_def"), "right": extra.get("right_shield_def")} left_room, right_room = _find_room_orientation(world, *details.rooms) @@ -549,8 +537,13 @@ def create_door_nodes_for_actor( return doors -def decode_world(root: Path, target_level: str, out_path: Path, only_update_existing_areas: bool = False, - skip_existing_actors: bool = True): +def decode_world( + root: Path, + target_level: str, + out_path: Path, + only_update_existing_areas: bool = False, + skip_existing_actors: bool = True, +): # ruff: noqa: C901 global pickup_index, bmscc, bmsld, bmsld_path all_names = samus_returns_data.all_asset_id_to_name() @@ -585,21 +578,19 @@ def decode_world(root: Path, target_level: str, out_path: Path, only_update_exis "extra": { "asset_id": bmsld_path, }, - "areas": {} + "areas": {}, } world_unique_id = Path(bmsld_path).stem.split("_")[1] - area_names = { - entry.name: f"{entry.name} ({world_unique_id})" - for entry in bmscc.raw.layers[0].entries - } + area_names = {entry.name: f"{entry.name} ({world_unique_id})" for entry in bmscc.raw.layers[0].entries} node_data_for_area = _get_existing_node_data(world, area_names) def rand_color(s): - return [x / 300.0 for x in hashlib.md5(bytes(str(sorted(s)), 'ascii')).digest()[0:3]] + return [x / 300.0 for x in hashlib.md5(bytes(str(sorted(s)), "ascii")).digest()[0:3]] handles = [] import matplotlib.pyplot as plt + plt.figure(1, figsize=(20, 10)) plt.title(target_level) @@ -617,14 +608,15 @@ def rand_color(s): continue assert len(entry.data.polys) == 1 - raw_vertices = _polygon_override.get((target_level, entry.name), - [(v.x, v.y) for v in entry.data.polys[0].points]) + raw_vertices = _polygon_override.get( + (target_level, entry.name), [(v.x, v.y) for v in entry.data.polys[0].points] + ) vertices = numpy.array(raw_vertices) c = [0.2, 0.7, 0.6] patch = mtPolygon(vertices, linewidth=1, edgecolor=c, facecolor=(c[0], c[1], c[2], 0.1)) plt.gca().add_patch(patch) - plt.text((x1 + x2) / 2, (y1 + y2) / 2, entry.name[17:], color=c, ha='center', size='x-small') + plt.text((x1 + x2) / 2, (y1 + y2) / 2, entry.name[17:], color=c, ha="center", size="x-small") handles.append(patch) all_rooms[area_name] = Polygon(vertices) @@ -660,8 +652,10 @@ def add_node(target_area: str, node_def: NodeDefinition): if existing_name == node_def.name: continue if get_actor_name_for_node(existing_node) == new_actor: - raise ValueError(f"New node {node_def.name} with actor {new_actor} conflicts " - f"with existing node {existing_name} in {target_area}") + raise ValueError( + f"New node {node_def.name} with actor {new_actor} conflicts " + f"with existing node {existing_name} in {target_area}" + ) world["areas"][target_area]["nodes"][node_def.name] = node_def.data @@ -669,7 +663,7 @@ def add_node(target_area: str, node_def: NodeDefinition): if not any([details.is_door, details.is_pickup, details.is_usable]): continue - plt.annotate(name, [details.position.x, details.position.y], fontsize='xx-small', ha='center') + plt.annotate(name, [details.position.x, details.position.y], fontsize="xx-small", ha="center") plt.plot(details.position.x, details.position.y, "o", color=rand_color(details.actor_type)) if details.is_door: @@ -683,12 +677,15 @@ def add_node(target_area: str, node_def: NodeDefinition): elif details.is_pickup: for room_name in details.rooms: - definition = details.create_node_template("pickup", f"Pickup ({name})", - node_data_for_area.get(room_name)) - definition.data.update({ - "pickup_index": pickup_index, - "major_location": "tank" not in details.actor_type, - }) + definition = details.create_node_template( + "pickup", f"Pickup ({name})", node_data_for_area.get(room_name) + ) + definition.data.update( + { + "pickup_index": pickup_index, + "major_location": "tank" not in details.actor_type, + } + ) add_node(room_name, definition) if len(details.rooms) != 1: @@ -715,14 +712,11 @@ def add_node(target_area: str, node_def: NodeDefinition): raise ValueError("What kind of actor is this?!") handles_by_label = {} - handles_by_label = { - key: value - for key, value in sorted(handles_by_label.items(), key=lambda it: it[0]) - } + handles_by_label = {key: value for key, value in sorted(handles_by_label.items(), key=lambda it: it[0])} plt.legend(handles_by_label.values(), handles_by_label.keys()) plt.plot() - plt.savefig(f"{target_level}.png", dpi=200, bbox_inches='tight') + plt.savefig(f"{target_level}.png", dpi=200, bbox_inches="tight") # plt.show() plt.close() @@ -764,5 +758,5 @@ def main(): decode_all_worlds(args.game_root, args.output) -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/tools/update_hashes_with_field_names.py b/tools/update_hashes_with_field_names.py index 68c5a5b0..b00c90ab 100644 --- a/tools/update_hashes_with_field_names.py +++ b/tools/update_hashes_with_field_names.py @@ -7,8 +7,9 @@ def main(): types_file = Path(__file__).parents[1].joinpath("src", "mercury_engine_data_structures", "dread_types.json") - properties_file = Path(__file__).parents[1].joinpath("src", "mercury_engine_data_structures", - "dread_property_names.json") + properties_file = ( + Path(__file__).parents[1].joinpath("src", "mercury_engine_data_structures", "dread_property_names.json") + ) with types_file.open() as f: all_types: dict[str, dict[str, typing.Any]] = json.load(f) @@ -22,11 +23,8 @@ def main(): known_hashes[field] = crc.crc64(field) with properties_file.open("w") as f: - json.dump({ - key: known_hashes[key] - for key in sorted(known_hashes.keys()) - }, f, indent=4) + json.dump({key: known_hashes[key] for key in sorted(known_hashes.keys())}, f, indent=4) -if __name__ == '__main__': +if __name__ == "__main__": main()